将master添加到Kubernetes集群:集群没有稳定的controlPlaneEndpoint地址

时间:2019-04-26 12:01:16

标签: kubernetes kubeadm

如何向现有Kubernetes 1.14集群的控制平面添加第二个主服务器? available documentation显然假设两个母版(在堆叠的控制平面和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用于添加另一个母版。在第一个主服务器上运行kubeadm init phase upload-certs --experimental-upload-certs提示了--certificate-key ...中的密钥。

我收到以下错误:

[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有关吗?我该如何克服这种情况?

2 个答案:

答案 0 :(得分:2)

根据HA - Create load balancer for kube-apiserver

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

要设置ControlPlaneEndpoint的配置,应将kubeadm--config标志一起使用。看一下here中的配置文件示例:

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

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


如果您要配置自托管控制面板,请考虑使用kubeadm alpha selfhosting功能:

  

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

此PR(#59371)可能阐明了使用自托管配置的区别。

答案 1 :(得分:0)

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