为什么需要kubeadm配置的controlPlaneEndpoint?

时间:2019-09-08 20:28:59

标签: kubernetes kubeadm

没有set a controlPlaneEndpoint,就不可能加入主节点:

  

错误执行阶段预检:
  不满足用于托管新控制平面实例的一个或多个条件。
  无法将新的控制平面实例添加到没有稳定controlPlaneEndpoint地址的群集
  请确保:
   *集群具有稳定的controlPlaneEndpoint地址。

但是,如果您改为加入一个工作节点(即没有--control-plane),那么它不仅会知道群集中的其他节点,而且还会知道哪些是主节点。

这是因为mark-control-plane阶段确实如此:

  

通过添加标签“ node-role.kubernetes.io/master=”“将节点标记为控制平面   通过添加污点将节点标记为控制平面[node-role.kubernetes.io/master:NoSchedule]

那么主(--control-plane)是否不能加入集群并使用角色标签发现其他控制平面节点?

是否有任何此类插件或其他配置此行为的方法,以避免使用单独的基础结构来负载均衡API服务器?

2 个答案:

答案 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