如果某个节点损坏并且需要从集群中移除以进行修复或更换,您可以强制将该节点从集群中移除。
强制移除工作器节点
在 Anthos clusters on Bare Metal 中,您可以添加注解来标记要强制移除的节点。
从父节点池中移除节点后,运行以下命令,以使用 baremetal.cluster.gke.io/force-remove
注释为相应的故障机器添加注释。注释本身的值无关紧要:
kubectl --kubeconfig ADMIN_KUBECONFIG -n CLUSTER_NAMESPACE \ annotate machine 10.200.0.8 baremetal.cluster.gke.io/force-remove=true
Anthos clusters on Bare Metal 成功移除了节点。
强制移除控制层面节点
强制移除控制层面节点与在控制平面节点上执行 kubeadm reset
类似,但需要执行额外的步骤。
如需强制从节点池中移除控制层面节点,您需要对包含故障控制层面节点的集群执行以下操作:
- 从
etcd
集群中移除故障节点上运行的故障etcd
成员 - 更新 kube 中的
ClusterStatus
以移除相应的apiEndpoint
。
移除故障 etcd
成员
要移除故障控制层点节点,请先在剩余的健康 etcd
pod 上运行 etcdctl
。如需详细了解此操作,请参阅此 Kubernetes 文档。
在以下步骤中,CLUSTER_KUBECONFIG 是集群的 kubeconfig
文件的路径。
使用以下命令查找
etcd
pod:kubectl --kubeconfig CLUSTER_KUBECONFIG get \ pod -n kube-system -l component=etcd -o wide
该命令会返回以下节点列表。对于本示例,假设节点 10.200.0.8 无法访问且不可恢复:
NAME READY STATUS RESTARTS AGE IP NODE etcd-357b68f4ecf0 1/1 Running 0 9m2s 10.200.0.6 357b68f4ecf0 etcd-7d7c21db88b3 1/1 Running 0 33m 10.200.0.7 7d7c21db88b3 etcd-b049141e0802 1/1 Running 0 8m22s 10.200.0.8 b049141e0802
对剩余的一个健康
etcd
pod 执行 exec:kubectl --kubeconfig CLUSTER_KUBECONFIG exec -it -n \ kube-system etcd-357b68f4ecf0 -- /bin/sh
查询当前成员以找到故障成员的 ID。该命令将返回一个列表:
etcdctl --endpoints=https://10.200.0.6:2379,https://10.200.0.7:2379 --key=/etc/kubernetes/pki/etcd/peer.key \ --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/peer.crt member list
此命令会返回类似如下的结果:
23da9c3f2594532a, started, 7d7c21db88b3, https://10.200.0.6:2380, https://10.200.0.6:2379, false 772c1a54956b7f51, started, 357b68f4ecf0, https://10.200.0.7:2380, https://10.200.0.7:2379, false f64f66ad8d3e7960, started, b049141e0802, https://10.200.0.8:2380, https://10.200.0.8:2379, false
移除故障成员:
etcdctl --endpoints=https://10.200.0.6:2379,https://10.200.0.7:2379 --key=/etc/kubernetes/pki/etcd/peer.key \ --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/peer.crt \ member remove f64f66ad8d3e7960
更新 ClusterStatus
并移除故障 apiEndpoint
在以下步骤中,CLUSTER_KUBECONFIG 是集群的 kubeconfig
文件的路径。
在
kubeadm-config
ConfigMap 中查询ClusterStatus
部分:kubectl --kubeconfig CLUSTER_KUBECONFIG describe configmap -n \ kube-system kubeadm-config
该命令会返回类似于如下所示的结果:
... ClusterStatus: ---- apiEndpoints: 7d7c21db88b3: advertiseAddress: 10.200.0.6 bindPort: 6444 357b68f4ecf0: advertiseAddress: 10.200.0.7 bindPort: 6444 b049141e0802: advertiseAddress: 10.200.0.8 bindPort: 6444 apiVersion: kubeadm.k8s.io/v1beta2 kind: ClusterStatus ...
修改 ConfigMap 以移除包含故障 IP 的部分(此示例显示了使用
kubectl edit
命令移除10.200.0.8
的结果):kubectl --kubeconfig CLUSTER_KUBECONFIG edit configmap \ -n kube-system kubeadm-config
修改后,ConfigMap 类似于以下内容:
... ClusterStatus: | apiEndpoints: 7d7c21db88b3: advertiseAddress: 10.200.0.6 bindPort: 6444 357b68f4ecf0: advertiseAddress: 10.200.0.7 bindPort: 6444 apiVersion: kubeadm.k8s.io/v1beta2 kind: ClusterStatus ...
保存修改后的 ConfigMap 后,故障节点将从集群中移除。