6.2. 操作节点
作为管理员,您可以执行若干任务来提高集群的效率。
6.2.1. 了解如何撤离节点上的 pod
通过撤离 pod,您可以迁移给定的一个或多个节点上的所有或选定 pod。
您只能撤离由复制控制器支持的 pod。复制控制器在其他节点上创建新 pod,并从指定节点移除现有的 pod。
裸机 pod(即不由复制控制器支持的 pod)默认情况下不受影响。您可以通过指定 pod 选择器来撤离一小部分 pod。pod 选择器基于标签,因此带有指定标签的所有 pod 都将被撤离。
流程
在执行 pod 驱除前,标记不可调度的节点。
将节点标记为不可调度:
$ oc adm cordon <node1>
输出示例
node/<node1> cordoned
检查节点状态为
Ready,SchedulingDisabled
:$ oc get node <node1>
输出示例
NAME STATUS ROLES AGE VERSION <node1> Ready,SchedulingDisabled worker 1d v1.24.0
使用以下方法之一驱除 pod:
在一个或多个节点上驱除所有或选定的 pod:
$ oc adm drain <node1> <node2> [--pod-selector=<pod_selector>]
使用
--force
选项强制删除裸机 pod。设为true
时,即使存在不由复制控制器、副本集、作业、守护进程设置或有状态设置管理的 pod,也会继续执行删除:$ oc adm drain <node1> <node2> --force=true
使用
--grace-period
以秒为单位设置一个期限,以便每个 pod 能够安全地终止。如果为负,则使用 pod 中指定的默认值:$ oc adm drain <node1> <node2> --grace-period=-1
忽略由守护进程集管理的 pod,将
--ignore-daemonsets
标记设为true
:$ oc adm drain <node1> <node2> --ignore-daemonsets=true
使用
--timeout
标记来设置在放弃前要等待的时长。值为0
时设定无限时长:$ oc adm drain <node1> <node2> --timeout=5s
即使存在使用
emptyDir
卷的 pod,将--delete-emptydir-data
标志设为true
,也会删除 pod。节点排空时会删除本地数据:$ oc adm drain <node1> <node2> --delete-emptydir-data=true
把
--dry-run
选项设为true
,它会列出将要迁移的对象而不实际执行撤离:$ oc adm drain <node1> <node2> --dry-run=true
您可以使用
--selector=<node_selector>
选项来撤离选定节点上的 pod,而不指定具体的节点名称(如<node1> <node2>
)。
完成后将节点标记为可调度。
$ oc adm uncordon <node1>
6.2.2. 了解如何更新节点上的标签
您可以更新节点上的任何标签。
节点标签不会在节点删除后保留,即使机器备份了节点也是如此。
对 MachineSet
对象的任何更改都不会应用到机器集拥有的现有机器。例如,对现有 MachineSet
对象编辑或添加的标签不会传播到与机器集关联的现有机器和节点。
以下命令在节点上添加或更新标签:
$ oc label node <node> <key_1>=<value_1> ... <key_n>=<value_n>
例如:
$ oc label nodes webconsole-7f7f6 unhealthy=true
提示您还可以应用以下 YAML 来应用标签:
kind: Node apiVersion: v1 metadata: name: webconsole-7f7f6 labels: unhealthy: 'true' #...
以下命令更新命名空间中的所有 pod:
$ oc label pods --all <key_1>=<value_1>
例如:
$ oc label pods --all status=unhealthy
6.2.3. 了解如何将节点标记为不可调度或可以调度
默认情况下,具有 Ready
状态的健康节点被标记为可以调度,这意味着您可以在节点上放置新 pod。如果手动将节点标记为不可调度,则会阻止在该节点上调度任何新的 pod。节点上的现有 pod 不受影响。
以下命令将一个或多个节点标记为不可调度:
输出示例
$ oc adm cordon <node>
例如:
$ oc adm cordon node1.example.com
输出示例
node/node1.example.com cordoned NAME LABELS STATUS node1.example.com kubernetes.io/hostname=node1.example.com Ready,SchedulingDisabled
以下命令将当前不可调度的一个或多个节点标记为可以调度:
$ oc adm uncordon <node1>
另外,您也可以使用
--selector=<node_selector>
选项将选定的节点标记为可以调度或不可调度,而不指定具体的节点名称(如<node>
)。
6.2.4. 删除节点
6.2.4.1. 从集群中删除节点
当您使用 CLI 删除节点时,节点对象会从 Kubernetes 中删除,但该节点上存在的 pod 不会被删除。任何未由复制控制器支持的裸机 pod 都无法从 OpenShift Container Platform 访问。由复制控制器支持的 Pod 会重新调度到其他可用的节点。您必须删除本地清单 pod。
流程
要从 OpenShift Container Platform 集群中删除节点,请编辑适当的 MachineSet
对象:
如果您在裸机上运行集群,则无法通过编辑 MachineSet
对象来删除节点。机器集仅在集群与云供应商集成时才可用。相反,您必须在手动删除前取消调度并排空节点。
查看集群中的机器集:
$ oc get machinesets -n openshift-machine-api
机器集以 <clusterid>-worker-<aws-region-az> 的形式列出。
扩展机器集:
$ oc scale --replicas=2 machineset <machineset> -n openshift-machine-api
或者:
$ oc edit machineset <machineset> -n openshift-machine-api
提示您还可以应用以下 YAML 来扩展机器集:
apiVersion: machine.openshift.io/v1beta1 kind: MachineSet metadata: name: <machineset> namespace: openshift-machine-api spec: replicas: 2 #...
其他资源
- 有关使用 MachineSet 扩展集群的更多信息,请参阅手动扩展 MachineSet。
6.2.4.2. 从裸机集群中删除节点
当您使用 CLI 删除节点时,节点对象会从 Kubernetes 中删除,但该节点上存在的 pod 不会被删除。任何未由复制控制器支持的裸机 pod 都无法从 OpenShift Container Platform 访问。由复制控制器支持的 Pod 会重新调度到其他可用的节点。您必须删除本地清单 pod。
流程
通过完成以下步骤,从裸机上运行的 OpenShift Container Platform 集群中删除节点:
将节点标记为不可调度:
$ oc adm cordon <node_name>
排空节点上的所有 pod:
$ oc adm drain <node_name> --force=true
如果节点离线或者无响应,此步骤可能会失败。即使节点没有响应,它仍然在运行写入共享存储的工作负载。为了避免数据崩溃,请在进行操作前关闭物理硬件。
从集群中删除节点:
$ oc delete node <node_name>
虽然节点对象现已从集群中删除,但它仍然可在重启后或 kubelet 服务重启后重新加入集群。要永久删除该节点及其所有数据,您必须弃用该节点。
- 如果您关闭了物理硬件,请重新打开它以便节点可以重新加入集群。