Kubernetes 为什么kubeadm配置为';有必要吗?

Kubernetes 为什么kubeadm配置为';有必要吗?,kubernetes,kubeadm,Kubernetes,Kubeadm,如果不具备以下条件,则无法加入主节点: 执行阶段飞行前出错: 承载新控制平面实例的一个或多个条件未满足。 无法向没有稳定controlPlaneEndpoint地址的群集添加新的控制平面实例 请确保: *群集具有稳定的ControlPlane端点地址 但是,如果您加入一个工作节点(即没有--控制平面),那么它不仅知道集群中的其他节点,还知道哪些节点是主节点 这是因为标记控制平面阶段执行以下操作: 通过添加标签“node role.kubernetes.io/master=”,将节点标记为控制平面

如果不具备以下条件,则无法加入主节点:

执行阶段飞行前出错:
承载新控制平面实例的一个或多个条件未满足。
无法向没有稳定controlPlaneEndpoint地址的群集添加新的控制平面实例
请确保:
*群集具有稳定的ControlPlane端点地址

但是,如果您加入一个工作节点(即没有
--控制平面
),那么它不仅知道集群中的其他节点,还知道哪些节点是主节点

这是因为
标记控制平面
阶段执行以下操作:

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

因此,主节点(
--控制平面
)不能加入集群并使用角色标签来发现其他控制平面节点吗

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

查看下面的示例,我发现了一个很好的描述,清楚地解释了这一点:

ControlPlaneEndpoint为控制平面设置稳定的IP地址或DNS名称;信息技术 可以是有效的IP地址或RFC-1123 DNS子域,两者都具有可选的TCP端口。 如果未指定ControlPlaneEndpoint,则AdvertiseAddress+BindPort 使用;如果指定了ControlPlaneEndpoint但没有TCP端口, 使用BindPort。 可能的用途包括: e、 g.在具有多个控制平面实例的集群中,此字段应为 已为服务器前面的外部负载平衡器分配地址 控制平面实例。 e、 g.在强制节点回收的环境中,ControlPlaneEndpoint 可用于将稳定的DNS分配给控制平面

这也可能会影响kubernetes生成的PKI,因为它需要知道一个公共名称/IP,您将通过该名称/IP访问集群,以将其包含在它为api节点生成的证书中,否则这些证书将无法正确匹配

如果您确实不想使用负载平衡器,则可以使用所有控制平面节点的IP设置循环dns条目,并尝试为
controlPlaneEndpoint
值指定该条目。但是,这无助于故障切换和冗余,因为故障节点不会从记录中删除,而且一些客户端可能会缓存地址,而不会尝试重新解析地址,从而进一步延长任何停机时间

希望这能有所帮助。

看看下面的文章,我发现了一个很好的描述,清楚地解释了这一点:

ControlPlaneEndpoint为控制平面设置稳定的IP地址或DNS名称;信息技术 可以是有效的IP地址或RFC-1123 DNS子域,两者都具有可选的TCP端口。 如果未指定ControlPlaneEndpoint,则AdvertiseAddress+BindPort 使用;如果指定了ControlPlaneEndpoint但没有TCP端口, 使用BindPort。 可能的用途包括: e、 g.在具有多个控制平面实例的集群中,此字段应为 已为服务器前面的外部负载平衡器分配地址 控制平面实例。 e、 g.在强制节点回收的环境中,ControlPlaneEndpoint 可用于将稳定的DNS分配给控制平面

这也可能会影响kubernetes生成的PKI,因为它需要知道一个公共名称/IP,您将通过该名称/IP访问集群,以将其包含在它为api节点生成的证书中,否则这些证书将无法正确匹配

如果您确实不想使用负载平衡器,则可以使用所有控制平面节点的IP设置循环dns条目,并尝试为
controlPlaneEndpoint
值指定该条目。但是,这无助于故障切换和冗余,因为故障节点不会从记录中删除,而且一些客户端可能会缓存地址,而不会尝试重新解析地址,从而进一步延长任何停机时间


希望这能有所帮助。

如果使用群集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"
因此,可以选择以下方法:在
localhost:6443

他们在文档中提到了如何确保apiserver的HA


如果使用群集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"
因此,可以选择以下方法:在
localhost:6443

他们在文档中提到了如何确保apiserver的HA


谢谢,我最终做了一些与您描述的类似的事情,使用每个控制平面节点上的IPV作为其他控制平面节点的LB,从DNS记录中获取节点列表:我仍然不明白为什么不能给新节点一个初始端点以允许它们加入集群,然后它们可以发现(并维持)其他人也加入了。谢谢,我最终做了类似于您所描述的事情,使用每个控制平面节点上的IPV作为其他控制平面节点的LB,从DNS记录中获取节点列表:我仍然不明白为什么不能给新节点一个初始端点来允许它们加入集群,然后它们就可以加入了一旦加入,就可以发现(并维护)其他人。