将新的Kubernetes Worker节点加入现有集群
初始设置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命令,我们就可以重做将新节点加入集群的相同过程。