没有set a controlPlaneEndpoint
,就不可能加入主节点:
错误执行阶段预检:
不满足用于托管新控制平面实例的一个或多个条件。
无法将新的控制平面实例添加到没有稳定controlPlaneEndpoint地址的群集
请确保:
*集群具有稳定的controlPlaneEndpoint地址。
但是,如果您改为加入一个工作节点(即没有--control-plane
),那么它不仅会知道群集中的其他节点,而且还会知道哪些是主节点。
这是因为mark-control-plane
阶段确实如此:
通过添加标签“ node-role.kubernetes.io/master=”“将节点标记为控制平面 通过添加污点将节点标记为控制平面[node-role.kubernetes.io/master:NoSchedule]
那么主(--control-plane
)是否不能加入集群并使用角色标签发现其他控制平面节点?
是否有任何此类插件或其他配置此行为的方法,以避免使用单独的基础结构来负载均衡API服务器?
答案 0 :(得分:2)
看着kubeadm types definition,我发现了一个很好的描述,清楚地说明了这一点:
ControlPlaneEndpoint为控制平面设置一个稳定的IP地址或DNS名称;它 可以是有效IP地址或RFC-1123 DNS子域,两者都带有可选的TCP端口。 如果未指定ControlPlaneEndpoint,则AdvertiseAddress + BindPort 被使用;如果指定了ControlPlaneEndpoint但没有TCP端口, 使用BindPort。 可能的用法是: 例如在具有多个控制平面实例的集群中,此字段应为 在外部负载均衡器的前面分配了地址 控制平面实例。 例如在强制节点回收的环境中,ControlPlaneEndpoint 可用于为控制平面分配稳定的DNS。
这也可能会影响kubernetes生成的PKI,因为它将需要知道一个公共名称/ IP,您将通过该名称/ IP访问集群以将其包含在为api节点生成的证书中,否则它们将不匹配正确。
如果您确实不想拥有一个负载平衡器,则可以使用所有控制平面节点的IP设置一个循环dns条目,然后尝试为controlPlaneEndpoint
值指定此条目。但是,这对故障转移和冗余无济于事,因为不会从记录中删除发生故障的节点,并且某些客户端可能会缓存该地址,而不尝试重新解析该地址,从而进一步延长了中断时间。
希望这会有所帮助。
答案 1 :(得分:1)
如果使用集群 Kubespray 方法,它有这个配置:
## External LB example config
## apiserver_loadbalancer_domain_name: "elb.some.domain"
# loadbalancer_apiserver:
# address: 1.2.3.4
# port: 1234
## Internal loadbalancers for apiservers
# loadbalancer_apiserver_localhost: true
# valid options are "nginx" or "haproxy"
# loadbalancer_apiserver_type: nginx # valid values "nginx" or "haproxy"
所以可以选择方式:外部负载均衡器、本地nginx负载均衡器或localhost:6443
上的本地haproxy负载均衡器
他们在文档中提到了如何确保 apiserver 的 HA。
https://github.com/kubernetes-sigs/kubespray/blob/master/docs/ha-mode.md