使用 3 臺阿里雲伺服器(k8s-master0, k8s-master1, k8s-master2)作為 master 節點搭建高可用叢集,負載均衡用的是阿里雲 SLB ,需要注意的是由於阿里雲負載均衡不支援後端伺服器自己轉發給自己,所以 master 節點的 control-plane-endpoint 不能走負載均衡。
先在 k8s-master0 上安裝好 k8s ,安裝步驟見 Ubuntu 安裝 k8s 三駕馬車 kubelet kubeadm kubectl ,然後打快照建立阿里雲 ecs 映象。
確定 control-plane-endpoint 主機名,這裡假設是 k8s-api
,在 k8s-master0 的 hosts 中新增 k8s-api 的解析。
10.0.1.81 k8s-api
在 k8s-master0 上建立叢集,
kubeadm init \
--control-plane-endpoint "k8s-api:6443" --upload-certs \
--image-repository registry.aliyuncs.com/google_containers \
--pod-network-cidr=192.168.0.0/16 \
--v=6
建立成功後會出現下面的提示
Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
You can now join any number of the control-plane node running the following command on each as root:
kubeadm join k8s-api:6443 --token ****** \
--discovery-token-ca-cert-hash ****** \
--control-plane --certificate-key ******
Please note that the certificate-key gives access to cluster sensitive data, keep it secret!
As a safeguard, uploaded-certs will be deleted in two hours; If necessary, you can use
"kubeadm init phase upload-certs --upload-certs" to reload certs afterward.
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join k8s-api:6443 --token ****** \
--discovery-token-ca-cert-hash ******
用之前建立的阿里雲 ecs 映象建立2臺伺服器 k8s-master1 與 k8s-master2 作為另外的 master 節點,並在這2臺伺服器的 hosts 中將 k8s-api 解析到 k8s-master0 的 IP 地址。
然後分別登入 k8s-master1 與 k8s-master2 用前面得到的加入 control-plane node 的 kubeadm join 命令將這 2 臺伺服器作為 master 加入叢集。
接著登入這 3 臺 master 節點分別執行下面的命令:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
如果不執行上面的命令,執行 kubectl get nodes 會出現下面的錯誤提示:
The connection to the server localhost:8080 was refused - did you specify the right host or port?
再接著登入 k8s-master1 與 k8s-master2 在 hosts 中將 k8s-api 解析到本機的 IP 地址。
現在這 3 臺 master 節點都加入了叢集,但透過 kubectl get pods 檢視會發現 3 個節點都處於 NotReady 狀態,這是由於沒有部署 CNI 網路外掛。
接下來的一步就是部署網路外掛,比如這裡我們用 calico 網路,
kubectl apply -f calico.yaml
當 calico 網路部署成功後,3 臺 master 就都進入 Running 狀態,master 節點的部署就完成了。
接下來就是部署 worker 節點。
Worker 節點都透過阿里雲負載均衡訪問 master 節點上的 api-server ,所以先要建立阿里雲私網負載均衡,新增針對 6443 埠 的 tcp 四層轉發,並掛載 3 臺 master 節點伺服器。
接下來就是繼續用之前建立的阿里雲 ecs 映象建立 worker node 伺服器,並在每臺伺服器的 hosts 中將 k8s-api 解析到阿里負載均衡的 IP 地址,然後用之前生成的加入 worker 節點的 kubeadm join k8s-api:6443
命令將這些伺服器加入叢集。
這樣高可用 k8s 叢集就搭建好了,可以部署應用了。需要注意的是現在用了 3 臺 master ,根據 Raft 一致性演算法,只有當其中至少 2 臺 master 正常時,叢集才能正常工作。