【摘要】基于青云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都加入集群后,负载均衡器状态如下: