如何为Kubernetes集群添加第二个Master节点?最佳方案咨询
嘿,这个场景我在生产环境里处理过好多次了,给你一套风险可控、符合Kubernetes官方规范的最优方案,一步步来就行:
单Master集群新增Master实现高可用的最优方案
一、前期准备工作(重中之重,别跳过)
- 新Master节点的硬件、操作系统必须和现有Master完全匹配:CPU/内存规格一致,OS版本(比如Ubuntu 20.04/CentOS 7)相同,kubeadm、kubelet、kubectl的版本要精确对应(比如都是v1.27.3),版本不兼容是加入失败的头号原因!
- 网络打通:新节点要能和现有所有Master/Worker节点互通,开放必要端口:6443(kube-apiserver)、2379-2380(etcd)、10250(kubelet)、10251(kube-scheduler)、10252(kube-controller-manager)
- 新节点预配置:关闭swap(
swapoff -a并修改fstab永久关闭),安装和集群一致的容器运行时(docker/containerd),安装kubeadm、kubelet、kubectl并设置开机自启(systemctl enable --now kubelet)
二、具体操作步骤
1. 在现有Master节点生成控制平面加入凭证
首先在当前运行正常的Master上执行以下命令,生成新Master加入集群所需的密钥和命令:
# 上传控制平面证书到集群,返回一个certificate-key(记下来,后面要用) sudo kubeadm init phase upload-certs --upload-certs # 生成带控制平面权限的加入命令 sudo kubeadm token create --print-join-command --certificate-key <上面返回的certificate-key>
执行后会得到类似这样的命令:
kubeadm join 192.168.1.100:6443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx --control-plane --certificate-key yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
2. 在新Master节点执行加入命令
把上面生成的完整命令复制到新Master节点,用sudo执行:
sudo kubeadm join 192.168.1.100:6443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx --control-plane --certificate-key yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
等待命令执行完成,kubeadm会自动完成证书复制、etcd集群加入、控制平面组件部署等操作,全程不要中断。
3. 配置新Master的kubectl访问(可选)
如果需要在新Master上直接操作集群,复制管理员配置文件:
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
三、验证集群状态
操作完成后,在任意Master节点执行以下命令验证:
- 查看节点状态:
kubectl get nodes,新Master节点状态应该为Ready - 检查etcd集群健康:
kubectl get pods -n kube-system -l component=etcd,两个etcd pod都应处于Running状态;也可以用etcdctl直接检查:
ETCDCTL_API=3 etcdctl endpoint health --endpoints=https://<现有MasterIP>:2379,https://<新MasterIP>:2379 \ --cacert=/etc/kubernetes/pki/etcd/ca.crt \ --cert=/etc/kubernetes/pki/etcd/server.crt \ --key=/etc/kubernetes/pki/etcd/server.key
所有端点都返回healthy才算正常。
- 检查控制平面组件:
kubectl get pods -n kube-system,kube-apiserver、kube-controller-manager、kube-scheduler在两个Master上都应有运行中的实例。
四、后续优化(实现真正的高可用)
- 配置负载均衡器:这是关键!现在两个Master的kube-apiserver都是单点,需要用负载均衡器(HAProxy、Nginx或云厂商LB)把6443端口流量转发到两个Master。配置完成后,需要将所有Worker节点的kubelet配置中的
server字段改为负载均衡器地址,后续新增节点也用LB地址加入集群。 - 监控覆盖:把新Master节点加入现有监控系统(比如Prometheus+Grafana),重点监控etcd集群状态、控制平面组件的CPU/内存使用率。
- 备份策略:完善etcd定期备份机制,避免集群数据丢失。
五、避坑提醒
- 绝对不要忽略版本一致性!哪怕是小版本差异(比如v1.27.2和v1.27.3)都可能导致加入失败或集群异常。
- 操作前一定要备份现有Master的etcd数据:
ETCDCTL_API=3 etcdctl snapshot save etcd-snapshot.db \ --cacert=/etc/kubernetes/pki/etcd/ca.crt \ --cert=/etc/kubernetes/pki/etcd/server.crt \ --key=/etc/kubernetes/pki/etcd/server.key
万一出问题可以用这个快照恢复。
- 如果是外部etcd集群,需要先将新Master加入etcd集群,再执行kubeadm join命令,不过默认的堆叠式etcd(etcd和控制平面同节点)不需要额外操作。
内容的提问来源于stack exchange,提问作者user2370590




