您好,登錄后才能下訂單哦!
一、環境準備
首先我的三個ubuntu云主機的配置如下
cpu數量 | 內存 | 磁盤 | Ubuntu |
---|---|---|---|
2 | 8G | 20G | 18.04LTS |
而且能保證三臺機器都能連接外網,這里用的谷歌云主機,所以不用擔心訪問外網問題,如果是本地搭建請參考另一篇博文本地kubeadm搭建kubernetes集群https://blog.51cto.com/13670314/2397626
這里的所有命令都是在root用戶下操作的
二、安裝
1.在所有的節點上安裝Docker和kubeadm
root@instance-ubuntu-1:~# apt-get install curl -y
root@instance-ubuntu-1:~# curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
root@instance-ubuntu-1:~# cat <<EOF > /etc/apt/sources.list.d/kubernetes.list
deb http://apt.kubernetes.io/ kubernetes-xenial main
EOF
root@instance-ubuntu-1:~# apt-get update
root@instance-ubuntu-1:~# apt-get install -y docker.io kubeadm
上述安裝過程中,kubeadm,kubectl,kubelet,kubernetes-cni這幾個二進制文件都會被自動安裝好。
直接使用+Ubuntu+的+docker.io+的安裝源,原因是+Docker+公司每次發布的最新的+Docker+CE(社區版)產品往往還沒有經過+Kubernetes+項目的驗證,可能會有兼容性方面的問題。
2.部署kubernetes的Master節點
root@instance-ubuntu-1:~# vim kubeadm.yaml
apiVersion: kubeadm v1.11
kind: MasterConfiguration
controllerManagerExtraArgs:
horizontal-pod-autoscaler-use-rest-clients: "true"
horizontal-pod-autoscaler-sync-period: "10s"
node-monitor-grace-period: "10s"
apiServerExtraArgs:
runtime-config: "api/all=true"
kubernetesVersion: "stable-1.11"root@instance-ubuntu-1:~# kubeadm init --config kubeadm.yaml
如果有報錯
your configuration file uses an old API spec: "kubeadm.k8s.io/v1alpha1". Please use kubeadm v1.11 instead and run 'kubeadm config migrate --old-config old.yaml --new-config new.yaml', which will write the new, similar spec using a newer API version.
把apiServer改成你對應的版本
再次運行kubeadm init --config kubeadm.yaml
這樣就可以完成Master的部署了,稍等片刻,部署完成后,kubeadm會生成一條指令
kubeadm join 10.168.0.6:6443 --token k0jhnn.a7l33i18ehbl1aze \
--discovery-token-ca-cert-hash sha256:064420e731f201b1601bb0bb39ccfef0e581a83449a043b60036cfb4537e5c67
kubeadm join 命令是用來給Master節點添加更多的Work節點的,記住此命令,下面會用到。
此外,kubeadm會提示提示第一次使用集群所需要的配置命令。
root@instance-ubuntu-1:~# mkdir -p $HOME/.kube
root@instance-ubuntu-1:~# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
root@instance-ubuntu-1:~# chown $(id -u):$(id -g) $HOME/.kube/config
因為Kubernetes 集群默認需要加密方式訪問。所以,這幾條命令,就是將剛剛部署生成的 Kubernetes 集群的安全配置文件,保存到當前用戶的.kube 目錄下,kubectl 默認會使用這個目錄下的授權信息訪問 Kubernetes 集群。如果不這么做的話,我們每次都需要通過 export KUBECONFIG 環境變量告訴 kubectl 這個安全配置文件的位置。
現在,我們就可以使用 kubectl get命令來查看當前唯一一個節點的狀態了
root@instance-ubuntu-1:~# kubectl get nodes
NAME STATUS ROLES AGE VERSION
instance-ubuntu-1 NotReady master 3h62m v1.14.1
主節點的狀態為什么會是NotReady,我們查看一下master節點的詳細信息
root@instance-ubuntu-1:~# kubectl describe node instance-ubuntu-1
會顯示
Ready False ... KubeletNotReady runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:docker: network plugin is not ready: cni config uninitialized
這是因為我們還沒有部署任何網絡插件
3.部署網絡插件
在 Kubernetes 項目“一切皆容器”的設計理念指導下,部署網絡插件非常簡單,只需要執行一句 kubectl apply 指令,以 Weave 為例:
root@instance-ubuntu-1:~# kubectl apply -f https://git.io/weave-kube-1.6
部署完成后檢查一下
root@instance-ubuntu-1:~# kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-fb8b8dccf-lc69z 1/1 Running 0 3h67m
coredns-fb8b8dccf-p2p4k 1/1 Running 0 3h67m
etcd-instance-ubuntu-1 1/1 Running 0 3h66m
kube-apiserver-instance-ubuntu-1 1/1 Running 0 3h66m
kube-controller-manager-instance-ubuntu-1 1/1 Running 0 3h66m
kube-proxy-pksmg 1/1 Running 0 3h57m
kube-proxy-qb2cl 1/1 Running 0 3h67m
kube-proxy-z6q42 1/1 Running 0 3h57m
kube-scheduler-instance-ubuntu-1 1/1 Running 0 3h66m
kubernetes-dashboard-5f7b999d65-rkkqq 1/1 Running 0 3h39m
weave-net-f5kgb 2/2 Running 1 3h57m
weave-net-fxxq2 2/2 Running 0 3h57m
weave-net-nplfj 2/2 Running 0 3h60m
可以看到所有pod都運行起來了 而剛剛部署的 Weave 網絡插件則在 kube-system 下面新建了一個名叫 weave-net-cmk27 的 Pod,一般來說,這些 Pod 就是容器網絡插件在每個節點上的控制組件。 Kubernetes 支持容器網絡插件,使用的是一個名叫 CNI 的通用接口,它也是當前容器網絡的事實標準,市面上的所有容器網絡開源項目都可以通過 CNI 接入 Kubernetes,比如 Flannel、Calico、Canal、Romana 等等,它們的部署方式也都是類似的“一鍵部署”。至此,Kubernetes 的 Master 節點就部署完成了。如果你只需要一個單節點的 Kubernetes,現在你就可以使用了。不過,在默認情況下,Kubernetes 的 Master 節點是不能運行用戶 Pod 的,第4部分會講到如何處理。
4.部署 Kubernetes 的 Worker 節點
Kubernetes 的 Worker 節點跟 Master 節點幾乎是相同的,它們運行著的都是一個 kubelet 組件。唯一的區別在于,在 kubeadm init 的過程中,kubelet 啟動后,Master 節點上還會自動運行 kube-apiserver、kube-scheduler、kube-controller-manger 這三個系統 Pod。 所以,相比之下,部署 Worker 節點反而是最簡單的,只需要兩步即可完成。
第一步,在所有 Worker 節點上執行二、安裝,第1節的所有步驟。
第二步,執行部署 Master 節點時生成的 kubeadm join 指令:
>kubeadm join 10.168.0.6:6443 --token k0jhnn.a7l33i18ehbl1aze \
--discovery-token-ca-cert-hash sha256:064420e731f201b1601bb0bb39ccfef0e581a83449a043b60036cfb4537e5c67
通過 Taint/Toleration 調整 Master 執行 Pod 的策略 前面提到過,默認情況下 Master 節點是不允許運行用戶 Pod 的。而 Kubernetes 做到這一點,依靠的是 Kubernetes 的 Taint/Toleration 機制。 它的原理非常簡單:一旦某個節點被加上了一個 Taint,即被“打上了污點”,那么所有 Pod 就都不能在這個節點上運行,因為 Kubernetes 的 Pod 都有“潔癖”。 除非,有個別的 Pod 聲明自己能“容忍”這個“污點”,即聲明了 Toleration,它才可以在這個節點上運行。 其中,為節點打上“污點”(Taint)的命令是:
root@instance-ubuntu-1:~# kubectl taint nodes instance-ubuntu-1 foo=bar:NoSchedule
這時,該 node1 節點上就會增加一個鍵值對格式的 Taint,即:foo=bar:NoSchedule
。其中值里面的 NoSchedule,意味著這個 Taint 只會在調度新 Pod 時產生作用,而不會影響已經在 node1 上運行的 Pod,哪怕它們沒有 Toleration。
現在回到我們已經搭建的集群上來。這時,如果你通過 kubectl describe 檢查一下 Master 節點的 Taint 字段,就會有所發現了:
root@instance-ubuntu-1:~# kubectl describe node master
5.部署Dashboard可視化插件
在 Kubernetes 社區中,有一個很受歡迎的 Dashboard 項目,它可以給用戶提供一個可視化的 Web 界面來查看當前集群的各種信息。毫不意外,它的部署也相當簡單
kubectl create -f
https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml
部署完成之后,我們就可以查看+Dashboard+對應的+Pod+的狀態了
root@instance-ubuntu-1:~# kubectl get pods -n kube-system
kubernetes-dashboard-6948bdb78-f67xk 1/1 Running 0 1m
需要注意的是,由于 Dashboard 是一個 Web Server,很多人經常會在自己的公有云上無意地暴露+Dashboard 的端口,從而造成安全隱患。所以,1.7 版本之后的 Dashboard 項目部署完成后,默認只能通過 Proxy 的方式在本地訪問。具體的操作,你可以查看 Dashboard+項目的官方文檔。 而如果你想從集群外訪問這個 Dashboard 的話,就需要用到 Ingress
6.部署容器存儲插件
為什么要部署Rook呢?
通常我們建立容器的時候需要把數據卷掛在到宿主機上的目錄,或者文件掛在到容器的Mount Namespace中,
從而實現主機和容器共享這些目錄,但是,如果你在另一臺機器上啟動一個容器,就沒有辦法看到其它機器上的容器掛載的數據卷,這就是所謂的容器典型特征:無狀態。
這時候容器就需要持久化存儲,就是用來保存容器的狀態,存儲插件會在容器里掛載一個基于網絡或者其他機制的遠程數據卷,使得在容器里創建的文件實際上是保存在遠程存儲服務器上,或者是以分布式的方式保存在多個節點上,與當前宿主機沒有任何綁定關系。這樣,無論你在其他哪個宿主機上啟動新的容器,都可以請求掛載指定的持久化存儲卷,從而訪問到數據卷里保存的內容。這就是所謂持久化。
Rook 項目是一個基于 Ceph 的 Kubernetes 存儲插件(它后期也在加入對更多存儲實現的支持)。不過,不同于對 Ceph 的簡單封裝,Rook 在自己的實現中加入了水平擴展、遷移、災難備份、監控等大量的企業級功能,使得這個項目變成了一個完整的、生產級別可用的容器存儲插件。
部署Ceph存儲后端
kubectl apply -f https://raw.githubusercontent.com/rook/rook/master/cluster/examples/kubernetes/ceph/operator.yaml
kubectl apply -f https://raw.githubusercontent.com/rook/rook/master/cluster/examples/kubernetes/ceph/cluster.yaml
在部署完成后,可以看到Rook項目會將自己的Pod防止在由它管理的兩個Namesoace當中:
>root@instance-ubuntu-1:~# kubectl get pods -n rook-ceph-system
NAME READY STATUS RESTARTS AGE
rook-ceph-agent-7cm42 1/1 Running 0 18s
rook-ceph-operator-78d4587c68c-7fj72 1/1 Running 0 44s
rook-discover-2ctcv 1/1 Running 0 18s
>root@instance-ubuntu-1:~# kubectl get pods -n rook-ceph
NAME READY STATUS RESTARTS AGE
rook-ceph-mon0-kxrgh 1/1 Running 0 13s
rook-ceph-mon1-7dk2t 1/1 Running 0 5s
這樣,一個基于 Rook 持久化存儲集群就以容器的方式運行起來了,而接下來在 Kubernetes 項目上創建的所有 Pod 就能夠通過 Persistent Volume(PV)和 Persistent Volume Claim(PVC)的方式,在容器里掛載由 Ceph 提供的數據卷了。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。