1. 程式人生 > >kubeadm搭建kubernetes集群

kubeadm搭建kubernetes集群

一點 可視化 ins roman 集群 ... The instead docke

一、環境準備
首先我的三個ubuntu雲主機的配置如下

cpu數量 內存 磁盤 Ubuntu
2 8G 20G 18.04LTS

而且能保證三臺機器都能連接外網
這裏的所有命令都是在root用戶下操作的
二、安裝

1.在所有的節點上安裝Docker和kubeadm

[email protected]:~# apt-get install curl -y 
[email protected]:~# curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
[email protected]:~#  cat <<EOF > /etc/apt/sources.list.d/kubernetes.list
deb http://apt.kubernetes.io/ kubernetes-xenial main
EOF
[email protected]:~# apt-get update
[email protected]:~# apt-get install -y docker.io kubeadm
上述安裝過程中,kubeadm,kubectl,kubelet,kubernetes-cni這幾個二進制文件都會被自動安裝好。
直接使用+Ubuntu+的+docker.io+的安裝源,原因是+Docker+公司每次發布的最新的+Docker+CE(社區版)產品往往還沒有經過+Kubernetes+項目的驗證,可能會有兼容性方面的問題。

2.部署kubernetes的Master節點

[email protected]:~# 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"

[email protected]:~# 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會提示提示第一次使用集群所需要的配置命令。

[email protected]:~# mkdir -p $HOME/.kube
[email protected]:~# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[email protected]:~# chown $(id -u):$(id -g) $HOME/.kube/config

需要這些配置命令的原因是:Kubernetes 集群默認需要加密方式訪問。所以,這幾條命令,就是將剛剛部署生成的 Kubernetes 集群的安全配置文件,保存到當前用戶的.kube 目錄下,kubectl 默認會使用這個目錄下的授權信息訪問 Kubernetes 集群。如果不這麽做的話,我們每次都需要通過 export KUBECONFIG 環境變量告訴 kubectl 這個安全配置文件的位置。
現在,我們就可以使用 kubectl get命令來查看當前唯一一個節點的狀態了

[email protected]:~# kubectl get nodes
NAME STATUS ROLES AGE VERSION
instance-ubuntu-1 NotReady master 3h52m v1.14.1

主節點的狀態為什麽會是NotReady,我們查看一下master節點的詳細信息
[email protected]:~# kubectl describe node master

會顯示
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 為例:

[email protected]:~# kubectl apply -f https://git.io/weave-kube-1.6

部署完成後檢查一下

[email protected]:~# kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-fb8b8dccf-lc69z 1/1 Running 0 3h57m
coredns-fb8b8dccf-p2p4k 1/1 Running 0 3h57m
etcd-instance-ubuntu-1 1/1 Running 0 3h56m
kube-apiserver-instance-ubuntu-1 1/1 Running 0 3h56m
kube-controller-manager-instance-ubuntu-1 1/1 Running 0 3h56m
kube-proxy-pksmg 1/1 Running 0 3h47m
kube-proxy-qb2cl 1/1 Running 0 3h57m
kube-proxy-z6q42 1/1 Running 0 3h47m
kube-scheduler-instance-ubuntu-1 1/1 Running 0 3h56m
kubernetes-dashboard-5f7b999d65-rkkqq 1/1 Running 0 3h29m
weave-net-f5kgb 2/2 Running 1 3h47m
weave-net-fxxq2 2/2 Running 0 3h47m
weave-net-nplfj 2/2 Running 0 3h50m

可以看到所有pod都運行起來了 而剛剛部署的 Weave 網絡插件則在 kube-system 下面新建了一個名叫 weave-net-cmk27 的 Pod,一般來說,這些 Pod 就是容器網絡插件在每個節點上的控制組件。 Kubernetes 支持容器網絡插件,使用的是一個名叫 CNI 的通用接口,它也是當前容器網絡的事實標準,市面上的所有容器網絡開源項目都可以通過 CNI 接入 Kubernetes,比如 Flannel、Calico、Canal、Romana 等等,它們的部署方式也都是類似的“一鍵部署”。關於這些開源項目的實現細節和差異,我會在後續的網絡部分詳細介紹。 至此,Kubernetes 的 Master 節點就部署完成了。如果你只需要一個單節點的 Kubernetes,現在你就可以使用了。不過,在默認情況下,Kubernetes 的 Master 節點是不能運行用戶 Pod 的,所以還需要額外做一個小操作。

4.部署 Kubernetes 的 Worker 節點
Kubernetes 的 Worker 節點跟 Master 節點幾乎是相同的,它們運行著的都是一個 kubelet 組件。唯一的區別在於,在 kubeadm init 的過程中,kubelet 啟動後,Master 節點上還會自動運行 kube-apiserver、kube-scheduler、kube-controller-manger 這三個系統 Pod。 所以,相比之下,部署 Worker 節點反而是最簡單的,只需要兩步即可完成。 第一步,在所有 Worker 節點上執行“安裝 kubeadm+和 Docker”一節的所有步驟。 第二步,執行部署 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)的命令是:

[email protected]:~# kubectl taint nodes instance-ubuntu-1 foo=bar:NoSchedule

這時,該 node1 節點上就會增加一個鍵值對格式的 Taint,即:foo=bar:NoSchedule
。其中值裏面的 NoSchedule,意味著這個 Taint 只會在調度新 Pod 時產生作用,而不會影響已經在 node1 上運行的 Pod,哪怕它們沒有 Toleration。

現在回到我們已經搭建的集群上來。這時,如果你通過 kubectl describe 檢查一下 Master 節點的 Taint 字段,就會有所發現了:

[email protected]:~# 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+的狀態了

[email protected]:~# 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

kubeadm搭建kubernetes集群