将新的Kubernetes Worker节点加入现有集群

时间:2020-02-23 14:31:45  来源:igfitidea点击:

初始设置Kubernetes集群后,最常见的第二天操作是通过添加更多运行工作负载的节点(容器和Pod)来扩展集群。
扩展群集的方式取决于在群集引导过程中最初使用的工具。
本教程将演示如何使用kubeadm命令行工具向Kubernetes集群添加更多Worker节点。

在你开始之前

我们需要有一个工作的Kubernetes集群-配置并工作的控制平面nodeContainer运行时(Docker,cri-o,containerd等)和Kubernetes工具(kubeadm和kubelet)已安装在Worker节点中。
如果使用防火墙,例如firewalld,端口10250 ,30000-32767和Pod网络添加组件所需的端口应在防火墙中打开。
对要添加的计算机的SSH访问配置了kubectl,用于检查集群中的节点是否可用

我们的教程中详细介绍了这些标准要求:使用Ansible和Calico CNI部署Kubernetes集群

我们可以按照以下标准步骤将现有的Kubernetes集群加入或者添加新的Worker节点。

步骤1:获取加入令牌

将新的工作程序节点加入Kubernetes集群时需要令牌。
使用kubeadm引导集群时,将生成令牌,令牌将在24小时后过期。
检查是否有令牌–在"控制"节点上运行命令:

$kubeadm token list
TOKEN                     TTL         EXPIRES                USAGES                   DESCRIPTION                                                EXTRA GROUPS
nx1jjq.u42y27ip3bhmj8vj   21h         2017-01-10T20:33:08Z   authentication,signing   The default bootstrap token generated by 'kubeadm init'.   system:bootstrappers:kubeadm:default-node-token

如果令牌已过期,请使用以下命令生成一个新令牌:

sudo kubeadm token create

抓取令牌使用以下方法生成:

$kubeadm token list

我们还可以生成令牌并打印join命令:

kubeadm token create --print-join-command

步骤2:获取发现令牌CA证书哈希

对于基于令牌的发现,join命令通过将根哈希与提供的哈希进行匹配来验证根CA公钥。
通过运行以下命令,在控制节点上获取发现令牌CA证书哈希。

openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'

第3步:获取API服务器AD地址

使用kubectl命令获取API服务器端点:

$kubectl cluster-info
Kubernetes master is running at https://192.168.122.195:6443
KubeDNS is running at https://192.168.122.195:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
Metrics-server is running at https://192.168.122.195:6443/api/v1/namespaces/kube-system/services/https:metrics-server:/proxy

如输出所示,我的API位于https://192.168.122.195:6443.

步骤4:将新的Kubernetes Worker节点加入集群

kubeadm join命令用于引导Kubernetes工作者节点或者其他控制平面节点,并将其加入集群。
用于将工作程序节点加入集群的命令语法为:

kubeadm join [api-server-endpoint] [flags]

所需的常见标志是: --token字符串:要使用的令牌 --discovery-token-ca-cert-hash:具有以下格式:<type>:<value>因此我们完整的join命令将具有以下格式:

kubeadm join \
  <control-plane-host>:<control-plane-port> \
  --token <token> \
  --discovery-token-ca-cert-hash sha256:<hash>

例子:

sudo kubeadm join \
  192.168.122.195:6443 \
  --token nx1jjq.u42y27ip3bhmj8vj \
  --discovery-token-ca-cert-hash sha256:c6de85f6c862c0d58cc3d10fd199064ff25c4021b6e88475822d6163a25b4a6c

命令输出:

[preflight] Running pre-flight checks
[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'
[kubelet-start] Downloading configuration for the kubelet from the "kubelet-config-1.17" ConfigMap in the kube-system namespace
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
[kubelet-start] Starting the kubelet
[kubelet-start] Waiting for the kubelet to perform the TLS Bootstrap...
This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.
Run 'kubectl get nodes' on the control-plane to see this node join the cluster.

等待节点的状态为"就绪" –检查控制节点

$watch kubectl get nodes

由于在配置和启动服务之前先拉出容器镜像,此过程可能需要花费几分钟。

$sudo docker ps
CONTAINER ID        IMAGE                   COMMAND                  CREATED              STATUS              PORTS               NAMES
491662a7affc        k8s.gcr.io/kube-proxy   "/usr/local/bin/kube…"   About a minute ago   Up About a minute                       k8s_kube-proxy_kube-proxy-zt8f9_kube-system_8f7f407c-d415-4ae0-8066-fbdf3dcb1570_0
743e7239b295        k8s.gcr.io/pause:3.1    "/pause"                 2 minutes ago        Up 2 minutes                            k8s_POD_calico-node-rr666_kube-system_0c5a592c-08df-4303-a50d-0d93a2aec0ce_0
a69aad86ba4a        k8s.gcr.io/pause:3.1    "/pause"                 2 minutes ago        Up 2 minutes                            k8s_POD_kube-proxy-zt8f9_kube-system_8f7f407c-d415-4ae0-8066-fbdf3dcb1570_0

步骤5:从集群中删除工作节点

要从集群中删除Kubernetes辅助节点,请执行以下操作,从该节点迁移pod:

kubectl drain  <node-name> --delete-local-data --ignore-daemonsets

防止节点安排使用新的Pod –将节点标记为不可计划

kubectl cordon <node-name>

恢复通过" kubeadm join"对节点所做的更改–在要删除的工作节点上运行

sudo kubeadm reset

一旦成功执行了kubeadm reset命令,我们就可以重做将新节点加入集群的相同过程。