如果某个节点损坏并且需要从集群中移除以进行修复或更换,您可以强制将该节点从集群中移除。
在 Anthos clusters on Bare Metal 1.6.0 中强制移除节点
在 Anthos on Bare Metal 1.6.0 版中,从节点的父节点池中移除节点会导致以下操作:
- 排空节点
- 从 Kubernetes 集群中移除节点
- 将机器重置为安装 Anthos on Bare Metal 之前的状态
但是,如果无法访问节点,则节点排空不会完成。控制器会反复尝试排空节点,并且始终没有进展。
作为临时解决方法,您可以应用以下更改来绕过排空和重置步骤。
注意:此操作要求您谨慎更新 Kubernetes 自定义资源中的特定实现字段。除非您确定节点无法恢复,否则请勿继续。
将损坏的节点从节点池中物理移除并在管理员集群中应用更改后,执行以下步骤。
在管理员集群中查询集群 API 机器自定义资源,其中 ADMIN_KUBECONFIG 是
kubeconfig
文件的路径,CLUSTER_NAMESPACE 是受影响的集群命名空间:kubectl --kubeconfig ADMIN_KUBECONFIG \ -n CLUSTER_NAMESPACE get ma 10.200.0.8
该命令会返回类似于以下内容的结果:
NAME PROVIDERID PHASE 10.200.0.8 baremetal://10.200.0.8 Deleting
在此示例中,10.200.0.8 是卡在删除阶段的节点的 IP 地址。
修改机器自定义资源并添加
machine.cluster.x-k8s.io/exclude-node-draining
注释。请注意,注释值本身并不重要,因为只要键存在,排空就会被跳过:kubectl --kubeconfig ADMIN_KUBECONFIG -n CLUSTER_NAMESPACE \ annotate ma 10.200.0.8 machine.cluster.x-k8s.io/exclude-node-draining=true
在管理员集群中查询 Bare Metal 机器自定义资源:
kubectl --kubeconfig ADMIN_KUBECONFIG -n CLUSTER_NAMESPACE \ get baremetalmachine 10.200.0.8
该命令会返回类似于以下内容的结果:
NAME CLUSTER READY INSTANCEID MACHINE 10.200.0.8 cluster1 true baremetal://10.200.0.8 10.200.0.8
移除终结器以跳过重置步骤并取消阻止节点移除:
kubectl --kubeconfig ADMIN_KUBECONFIG -n CLUSTER_NAMESPACE \ patch baremetalmachine 10.200.0.8 --type json -p='[{"op": "remove", "path": "/metadata/finalizers"}]'
几秒钟后,节点将从集群中移除。
在 Anthos clusters on Bare Metal 1.6.1 中强制移除节点
在 Anthos clusters on Bare Metal 1.6.1 中,您可以添加注解来标记要强制移除的节点。
从父节点池中移除节点后,运行以下命令,以使用 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 后,故障节点将从集群中移除。