You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何为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

火山引擎 最新活动