【摘要】基于青雲LB來部署高可用的k8s叢集。
一、前言
對于生産環境,需要考慮叢集的高可用性。如果關鍵元件(例如 kube-apiserver、kube-scheduler 和 kube-controller-manager)在相同的主節點上運作,一旦主節點出現故障,Kubernetes 和 KubeSphere 将不可用。是以,您需要為多個主節點配置負載均衡器,以搭建高可用叢集。您可以使用任何雲負載均衡器或任何硬體負載均衡器(例如 F5)。此外,您也可以使用 Keepalived+HAproxy 或 NGINX 搭建高可用叢集。
二、叢集架構
2.1 負載均衡器建立高可用叢集:
2.2 使用 Keepalived 和 HAproxy/Nginx 建立高可用 Kubernetes 叢集:
三、高可用方案
通常情況下,我們建立單master的k8s叢集是不需要進行高可用配置的,隻有在建立高可用的k8s叢集時才會采用高可用配置,高可用配置的方案有很多。如下方案:
3.1 雲上:
- 使用 Keepalived 和 HAproxy 建立高可用 Kubernetes 叢集(有些雲可能不支援keepalived)
- 使用 Keepalived 和 Nginx 建立高可用 Kubernetes 叢集(有些雲可能不支援keepalived)
- 可以直接使用雲上的lb,比如阿裡雲slb,騰訊雲elb,青雲lb等(推薦)
3.2 非雲上:
- 使用 Keepalived 和 HAproxy 建立高可用 Kubernetes 叢集
- 使用 Keepalived 和 Nginx 建立高可用 Kubernetes 叢集
四、青雲LB負載均衡使用
負載均衡(Load Balancer,簡稱LB)提供安全快捷的流量分發服務,來自多個公網位址的通路流量經由 LB 可以自動配置設定到多台雲伺服器上,并支援自動檢測并隔離故障雲伺服器,提供業務系統的服務能力和可用性。負載均衡支援千萬級别并發通路請求,可輕松應對大流量通路,滿足業務需求。
- 建立負載均衡器,指定ip位址或者自動生成IP
- 進入負載均衡器,建立監聽器
- 選擇TCP,6443端口(此端口可調整)
- 添加master位址與監聽 apiserver 6443端口
- 根據叢集的部署位置,您可能需要在安全組中打開端口以確定外部流量不被屏蔽
- 可以同時配置内置負載均衡器和外置負載均衡器。為外置負載均衡器配置設定公共 IP 位址後,您可以使用該 IP 位址來通路叢集,這裡我們隻用内置負載均衡器,利用青雲VPN進行内網通路即可
4.1 部署k8s之前就是不可用狀态,如下圖所示:
4.2 k8s叢集初始化:
kubeadm init --config kubeadm-init.yaml --upload-certs
##說明:upload-certs 标志用來将在所有控制平面執行個體之間的共享證書上傳到叢集,若是不加會報錯如下:
不加upload-certs報錯如下:
4.3 kubeadm-init.yaml的内容如下:
apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:
- system:bootstrappers:kubeadm:default-node-token
token: abcdef.0123456789abcdef
ttl: 24h0m0s
usages:
- signing
- authentication
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: 192.168.0.1 #本機ks-m1的ip
bindPort: 6443
nodeRegistration:
criSocket: /var/run/dockershim.sock
imagePullPolicy: IfNotPresent
name: ks-m1
taints:
- effect: NoSchedule
key: node-role.kubernetes.io/master
---
apiServer:
timeoutForControlPlane: 4m0s
certSANs:
- "172.17.0.252"
extraArgs:
authorization-mode: "Node,RBAC"
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
controlPlaneEndpoint: 172.17.0.252:6443 #此ip和端口是青雲負載均衡器生成的内部負載ip+端口
clusterName: kubernetes
cgroupDriver: systemd
controllerManager: {}
etcd:
local:
dataDir: /var/lib/etcd
imageRepository: registry.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: 1.22.12
networking:
dnsDomain: cluster.local
podSubnet: 10.244.0.0/16
serviceSubnet: 10.10.0.0/16
scheduler: {}
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs
4.4 master都加入叢集後,負載均衡器狀态如下: