首页
/ Kubernetes kubeadm控制平面节点加入时广告地址配置问题解析

Kubernetes kubeadm控制平面节点加入时广告地址配置问题解析

2025-06-18 00:07:41作者:俞予舒Fleming

问题背景

在使用kubeadm部署高可用Kubernetes集群时,一个常见场景是配置多个控制平面节点并使用kube-vip实现高可用。在实际操作中,用户发现当第二个控制平面节点加入集群时,虽然明确指定了--apiserver-advertise-address参数,但最终生成的kube-apiserver清单文件中仍然使用了第一个控制平面节点的IP地址。

问题现象

用户配置了三个控制平面节点(IP分别为192.168.100.145、192.168.100.122和192.168.100.140),使用192.168.100.220作为kube-vip的虚拟IP。在第一个节点(192.168.100.145)上执行kubeadm init时,配置文件中设置了apiServer.extraArgs.advertise-address为该节点IP。

当第二个节点(192.168.100.122)执行kubeadm join命令并明确指定--apiserver-advertise-address=192.168.100.122时,虽然清单文件的annotations中正确记录了该节点的IP,但kube-apiserver容器的command参数中仍然使用了第一个节点的IP(192.168.100.145)。

问题原因

这个问题的根本原因在于ClusterConfiguration中的apiServer.extraArgs配置会应用于集群中的所有控制平面节点。当在kubeadm配置文件中设置了apiServer.extraArgs.advertise-address时,这个值会覆盖所有控制平面节点的广告地址配置,包括后续加入的节点。

正确配置方法

正确的做法是不要将advertise-address放在ClusterConfiguration.apiServer.extraArgs中,而应该使用以下两种配置方式:

  1. 对于初始节点(init),使用InitConfiguration.localAPIEndpoint:
localAPIEndpoint:
  advertiseAddress: <节点IP>
  bindPort: 6443
  1. 对于加入的控制平面节点(join),使用JoinConfiguration.controlPlane.localAPIEndpoint:
controlPlane:
  localAPIEndpoint:
    advertiseAddress: <节点IP>
    bindPort: 6443

技术原理

kubeadm在设计上区分了集群范围的配置和节点特定的配置。ClusterConfiguration中的设置适用于整个集群,而InitConfiguration和JoinConfiguration中的设置则是节点特定的。广告地址(advertise address)属于节点特定的配置,因此应该放在localAPIEndpoint中而不是集群范围的extraArgs中。

最佳实践

  1. 对于多控制平面部署,不要在ClusterConfiguration中设置advertise-address
  2. 为每个控制平面节点单独配置其localAPIEndpoint
  3. 使用kube-vip等负载均衡方案时,确保controlPlaneEndpoint指向虚拟IP
  4. 在join命令中,可以通过配置文件而非命令行参数来指定节点特定配置

总结

理解kubeadm配置的分层结构对于正确部署Kubernetes集群至关重要。集群范围的配置和节点特定的配置应该放在正确的位置,避免因配置位置不当导致预期外的行为。在多控制平面部署场景下,特别注意广告地址等节点特定参数的配置方式,确保每个控制平面节点都能正确宣告自己的网络位置。

登录后查看全文
热门项目推荐
相关项目推荐

项目优选

收起
kernelkernel
deepin linux kernel
C
27
11
docsdocs
OpenHarmony documentation | OpenHarmony开发者文档
Dockerfile
466
3.47 K
nop-entropynop-entropy
Nop Platform 2.0是基于可逆计算理论实现的采用面向语言编程范式的新一代低代码开发平台,包含基于全新原理从零开始研发的GraphQL引擎、ORM引擎、工作流引擎、报表引擎、规则引擎、批处理引引擎等完整设计。nop-entropy是它的后端部分,采用java语言实现,可选择集成Spring框架或者Quarkus框架。中小企业可以免费商用
Java
10
1
leetcodeleetcode
🔥LeetCode solutions in any programming language | 多种编程语言实现 LeetCode、《剑指 Offer(第 2 版)》、《程序员面试金典(第 6 版)》题解
Java
65
19
flutter_flutterflutter_flutter
暂无简介
Dart
715
172
giteagitea
喝着茶写代码!最易用的自托管一站式代码托管平台,包含Git托管,代码审查,团队协作,软件包和CI/CD。
Go
23
0
kernelkernel
openEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。
C
203
82
RuoYi-Vue3RuoYi-Vue3
🎉 (RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue3 & Vite、Element Plus 的前后端分离权限管理系统
Vue
1.27 K
695
rainbondrainbond
无需学习 Kubernetes 的容器平台,在 Kubernetes 上构建、部署、组装和管理应用,无需 K8s 专业知识,全流程图形化管理
Go
15
1
apintoapinto
基于golang开发的网关。具有各种插件,可以自行扩展,即插即用。此外,它可以快速帮助企业管理API服务,提高API服务的稳定性和安全性。
Go
22
1