如何将Kubernetes非HA控制平面转为HA控制平面?主节点配置报错求助
哦,你踩了个典型的坑——kubeadm init是用来初始化全新集群的,你的现有master节点已经在运行控制平面组件了,当然会报端口占用、文件已存在的错误!不用慌,咱们一步步把现有单master集群切换到HA控制平面,用上你已经部署好的负载均衡器。
1. 先备份关键配置(重中之重!)
在做任何修改前,先把集群的核心配置文件备份好,以防操作失误回滚:
sudo cp -r /etc/kubernetes /etc/kubernetes.bak sudo cp ~/.kube/config ~/.kube/config.bak
2. 更新kubeadm集群配置
首先导出当前集群的kubeadm配置:
kubeadm config view > kubeadm-config.yaml
打开这个文件,找到clusterConfiguration节点,添加或修改controlPlaneEndpoint字段为你的负载均衡器地址(比如my-load-balancer:6443):
apiVersion: kubeadm.k8s.io/v1beta2 kind: ClusterConfiguration kubernetesVersion: v1.20.1 controlPlaneEndpoint: "my-load-balancer:6443" # 其他原有配置保持不变,不要乱改
然后用这个更新后的配置同步到集群:
sudo kubeadm init phase upload-config kubeadm --config kubeadm-config.yaml
3. 调整kube-apiserver静态Pod配置
编辑/etc/kubernetes/manifests/kube-apiserver.yaml,确保apiserver的启动参数适配负载均衡器:
- 找到
command里的--advertise-address,可以改成负载均衡器的IP(或者保留本地IP,后续确保kubeconfig指向LB即可) - 如果
command里没有--control-plane-endpoint,手动添加这个参数,值设为你的LB地址
修改完成后,kubelet会自动重启kube-apiserver Pod,等待1-2分钟让组件重新启动完成。
4. 更新所有kubeconfig文件的server地址
集群里所有kubeconfig文件的server字段都需要从原来的master本地IP,改成负载均衡器地址,包括:
/etc/kubernetes/admin.conf/etc/kubernetes/kubelet.conf/etc/kubernetes/controller-manager.conf/etc/kubernetes/scheduler.conf- 你本地用户目录下的
~/.kube/config
举个例子,编辑admin.conf:
sudo nano /etc/kubernetes/admin.conf
找到类似这样的行:
server: https://192.168.1.100:6443
替换成:
server: https://my-load-balancer:6443
5. 加入新的Master节点
现在现有master已经适配LB了,生成加入新master的命令:
sudo kubeadm token create --print-join-command --certificate-key $(kubeadm init phase upload-certs --upload-certs | grep -v "certificate key")
把输出的命令复制到新的master节点上执行,记得要加上--control-plane参数(表示加入控制平面),示例命令如下:
sudo kubeadm join my-load-balancer:6443 --token abcdef.0123456789abcdef \ --discovery-token-ca-cert-hash sha256:abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789 \ --control-plane --certificate-key abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789
6. 验证HA配置
等新master节点加入后,检查集群状态:
kubectl get nodes kubectl get pods -n kube-system
确保所有master节点状态为Ready,kube-system下的控制平面组件都正常运行。再验证LB是否生效:
kubectl cluster-info
输出应该显示Kubernetes control plane is running at https://my-load-balancer:6443。
额外注意事项
- 确保负载均衡器已正确配置:把6443端口转发到所有master节点的6443端口,并且健康检查正常
- 如果集群使用了kube-proxy等组件,可执行
kubectl rollout restart daemonset kube-proxy -n kube-system让组件同步新的控制平面地址 - 备份的配置文件建议保留一周以上,确保集群稳定后再清理
内容的提问来源于stack exchange,提问作者Ralph




