将 master 添加到 Kubernetes 集群:集群没有稳定的控制平面端点地址



如何将第二个主节点添加到现有 Kubernetes 1.14 集群的控制平面? 可用的文档显然假设两个主节点(在堆叠控制平面和 etcd 节点中)是同时创建的。不久前我已经用kubeadm init --pod-network-cidr=10.244.0.0/16创建了我的第一个母版,所以我没有本文档提到的kubeadm-config.yaml

我已经尝试了以下方法:

kubeadm join ... --token ... --discovery-token-ca-cert-hash ... 
--experimental-control-plane --certificate-key ...

kubeadm join ... --token ... --discovery-token-ca-cert-hash ...部分是在第一个主节点上运行kubeadm token create --print-join-command时建议的;它通常用于添加另一个工作线程。--experimental-control-plane用于添加另一个主控形状。--certificate-key ...中的键是按照在第一个主节点上运行kubeadm init phase upload-certs --experimental-upload-certs的建议。

我收到以下错误:

[preflight] Running pre-flight checks
[WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. 
The recommended driver is "systemd". Please follow the guide at 
https://kubernetes.io/docs/setup/cri/
[preflight] Reading configuration from the cluster...
[preflight] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -oyaml'
error execution phase preflight: 
One or more conditions for hosting a new control plane instance is not satisfied.
unable to add a new control plane instance a cluster that doesn't have a stable
controlPlaneEndpoint address
Please ensure that:
* The cluster has a stable controlPlaneEndpoint address.
* The certificates that must be shared among control plane instances are provided.

我的集群没有稳定的controlPlaneEndpoint地址意味着什么?这是否与当前为空字符串的输出中的controlPlaneEndpoint有关kubectl -n kube-system get configmap kubeadm-config -o yaml?我怎样才能克服这种情况?

根据 HA - 为 kube-apiserver 创建负载均衡器:

  • 在云环境中,应将控制平面节点放在 TCP 转发负载均衡器后面。此负载均衡器分发 流量到其目标列表中所有正常运行的控制平面节点。这 API 服务器的健康检查是对 kube-apiserver 监听的端口
    进行 TCP 检查(默认值:6443)。
  • 负载均衡器必须能够与 apiserver 端口上的所有控制平面节点通信。它还必须允许传入流量 在其侦听端口上。
  • 确保负载均衡器的地址 始终与 kubeadm 的地址匹配ControlPlaneEndpoint.

要设置ControlPlaneEndpoint配置,应将kubeadm--config标志一起使用。请看这里一个配置文件示例:

apiVersion: kubeadm.k8s.io/v1beta1
kind: ClusterConfiguration
kubernetesVersion: stable
controlPlaneEndpoint: "LOAD_BALANCER_DNS:LOAD_BALANCER_PORT"

Kubeadm 配置文件示例分散在许多文档部分。我建议您阅读 GoDoc/apis/kubeadm/v1beta1,其中包含多个 kubeadm 配置类型使用的 YAML 文件的完整填充示例。


如果要配置自承载控制平面,请考虑使用kubeadm alpha selfhosting功能:

[..] 关键组件,如 API 服务器、控制器管理器和 调度程序作为通过 Kubernetes API 配置的 DaemonSet Pod 运行 而不是通过静态文件在 kubelet 中配置的静态 Pod。

此 PR (#59371) 可能会阐明使用自托管配置的差异。

您需要从现有的主节点复制证书(etcd/api server/ca 等)并放置在第二个主服务器上。 然后运行 kubeadm 初始化脚本。由于证书已存在,因此将跳过证书创建步骤,并恢复其余的群集初始化步骤。

最新更新