问题描述
该笔记将记录:在 Kubernetes Cluster 中,与节点(Node)有关的操作,如何管理集群节点,以及常见问题处理。
添加节点(增)
第一步、节点准备工作
确保已经对节点进行初始化,比如 安装 Docker 环境、配置内核参数、网络预设置等等。
第二步、添加新的节点
添加 Worker 节点:
# 获取 TOKEN 参数 kubeadm token list # 查看已有 TOKEN kubeadm token create # 创建新的 TOKEN kubeadm token create --print-join-command # 直接打印 Join 命令
添加 Control Plane 节点:
# 获取 certificate key 参数 kubeadm init phase upload-certs --upload-certs # 获取加入集群的命令 kubeadm token create --print-join-command --certificate-key "<certificate key>" # 执行输出的 kubeadm join 命令 kubeadm join ... // ---------------------------------------------------------------------------- 如下为废弃的老办法,不建议使用,可能失败 # 在新的主机上执行,该主机会成为主节点加入 kubeadm join 10.10.50.91:6443 --experimental-control-plane \ --token 608cyb.7polfq8iea971x9i \ --discovery-token-ca-cert-hash sha256:8ff3e8899e47a10ee186319a737de85374ea7c4f4cf5276ef3d5b95f66b6ebbe # 获取 discovery-token-ca-cert-hash 参数 openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | \ openssl dgst -sha256 -hex | sed 's/^.* //' # 加入集群 kubeadm join "control-plane-endpoint.d3rm.org:8443" --token "4pedgf.a2uc2vvtrknce1wb" \ --discovery-token-ca-cert-hash "sha256:0fce70ebfdc980066ea08cdfdc54a835215077834b54f10a36196c22a9dacb09"
补充说明
命令 kubeadm token create –print-join-command 将输出用于加入集群的命令,但是该命令中的 Control Plane 地址来自 kubeconfig 配置文件;
删除节点(删)
删除 Control Plane 节点
假如移除 k8scp-02 节点:
# 在其他节点中执行,比如我们的 k8scp-01 节点 kubectl drain "k8scp-02" --delete-local-data --force --ignore-daemonsets # 在被移出的节点上执行,这里 k8scp-02 节点 kubeadm reset # 该命令会从 etcd 集群中移除该节点的 etcd 成员,及其他清理工作,因此必须执行该命令 # 在被移出的节点上执行,以清理网络转发策略 iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X ipvsadm -C
kubeadm join is not fault tolerant to etcd endpoint failures · Issue #1432 · kubernetes/kubeadm
关于 kubeadm reset 问题:在我们重置集群时,命令 kubeadm reset 在处理 etcd 集群时,它会自动从 etcd 集群中删除当前 etcd 节点,但是有时会提示我们需要手动处理。如果操作不当,导致 etcd 集群未清理当前节点的 etcd 实例,当我们将该节点再次加入集群时,由于 etcd 冲突会导致节点加入失败,有时可能导致集群的失败。所有我们一般是:删除当前节点,然后重新新节点(新的虚拟机实例);或者,实验环境我们将重置整个集群;或者,退一步,修改主机名做相关的处理;
如果 etcd 节点未从集群中删除,则需要手动处理,参考该笔记处理 etcd 集群部分的内容。
删除 Worker 节点
Safely Drain a Node | Kubernetes
How to gracefully remove a node from Kubernetes? – Stack Overflow
How to gracefully remove a node from Kubernetes?
参考 Safely Drain a Node | Kubernetes 文档,安全的操作过程大致如下:
1)如果对服务可用性有要求,则建议开启 PodDisruptionBudget 功能;
2)然后,执行 kubectl drain <node name> 命令,以排空节点 Pod 实例;
3)最后,删除节点 kubectl delete node <node-name>,并对主机操作;
# kubectl get nodes # kubectl drain <node-name> # kubectl delete node <node-name> # kubeadm reset
查看节点(查)
# kubectl get nodes // 显示节点标签 # kubectl get nodes --show-lables