根据 Kubernetes 多控制平面节点 的标准实践,必须修改其他 master 节点的 advertiseAddress
为各自独立的静态 IP。以下是详细解释和操作建议:
核心结论
✅ 必须修改 :每个控制平面节点应具有唯一的 advertiseAddress
(对应自身固定 IP),而非重复使用同一 IP。
⚠️ 不修改的风险:可能导致以下问题:
- 端口冲突:多个 API Server 尝试绑定同一 IP+Port;
- 脑裂风险:不同控制平面节点互相干扰;
- 证书校验失败:TLS 证书与实际访问 IP 不匹配;
- 服务发现异常:工作节点无法稳定访问正确的控制平面。
具体操作指南
🔧 Step 1: 规划控制平面 IP 方案
节点角色 | 主机名 | 固定 IP | advertiseAddress 设置值 |
---|---|---|---|
Master Node 1 | k8s-master01 | 192.168.170.151 |
192.168.170.151 |
Master Node 2 | k8s-master02 | 192.168.170.152 |
→ 修改为 192.168.170.152 |
Master Node 3 | k8s-master03 | 192.168.170.153 |
→ 修改为 192.168.170.153 |
📌 Step 2: 修改配置文件
在所有新增的控制平面节点上执行以下操作:
yaml
# /root/kubeadm-config.yaml 示例片段
localAPIEndpoint:
advertiseAddress: <该节点专属IP> # e.g. 192.168.170.152 (for master02)
bindPort: 6443 # 保持默认即可
🛡️ Step 3: 确保配套措施同步更新
项目 | 要求 |
---|---|
主机名解析 | 所有节点的 /etc/hosts 需包含所有控制平面节点的 IP ↔ 主机名映射 |
DNS 正向解析 | 内部 DNS 服务器需为每个控制平面 IP 提供 A 记录(如 api.cluster → LB VIP) |
负载均衡器配置 | 若使用硬件负载均衡器,需将所有控制平面 IP 加入后端池 |
防火墙规则 | 开放所有控制平面 IP 的 6443/TCP 端口 |
关键注意事项
⚙️ 技术细节说明
1️⃣ 为什么不能用相同 IP?
advertiseAddress
决定 API Server 对外暴露的监听地址;- 如果两个节点使用同一 IP,后启动的节点会因端口已被占用而启动失败;
- TLS 引导证书中嵌入了节点 IP 信息,重复会导致证书校验错误。
2️⃣ 与 controlPlaneEndpoint
的区别
controlPlaneEndpoint
: 集群级别的虚拟入口(通常配合负载均衡器使用);advertiseAddress
: 单个控制平面节点的实际服务地址;- 两者可以不同(推荐通过负载均衡器统一入口)。
3️⃣ 动态 IP 的风险
❗ 如果使用 DHCP 分配 IP,一旦重启导致 IP 变化,集群将不可用!
👉 强制要求:所有控制平面节点必须使用静态 IP。
验证方法
完成配置后,可通过以下命令验证各节点状态:
bash
# 在任意节点查看集群成员列表
kubectl get nodes -o wide
# 检查控制平面组件运行状态
kubectl get pods -n kube-system --field-selector=observed_phase=Running
总结
场景 | 是否正确做法 |
---|---|
单 Master 集群 | 无需修改(仅一个控制平面节点) |
多 Master 高可用集群 | ✔️ 每个节点必须使用唯一 IP |
跨机房/云厂商混合部署 | ✔️ 不同机房节点使用各自专线 IP |
使用虚拟 IP(VIP)作为入口 | ✔️ 但底层仍需真实 IP 支撑 |
请根据您的实际网络环境选择合适方案,并确保所有控制平面节点使用静态 IP。