使用 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 正常時,集群才能正常工作。