4.2. 操作节点

作为管理员,您可以执行若干任务来提高集群的效率。

4.2.1. 了解如何撤离节点上的 pod

通过撤离 pod,您可以迁移给定的一个或多个节点上的所有或选定 pod。

您只能撤离由复制控制器支持的 pod。复制控制器在其他节点上创建新 pod,并从指定节点移除现有的 pod。

裸机 pod(即不由复制控制器支持的 pod)默认情况下不受影响。您可以通过指定 pod 选择器来撤离一小部分 pod。pod 选择器基于标签,因此带有指定标签的所有 pod 都将被撤离。

注意

节点必须首先标记为不可调度,然后才能执行 pod 撤离。

$ oc adm cordon <node1>
node/<node1> cordoned

$ oc get node <node1>
NAME        STATUS                        ROLES     AGE       VERSION
<node1>     NotReady,SchedulingDisabled   worker    1d        v1.16.2

完成后,使用 oc adm uncordon 将节点标记为可以调度。

$ oc adm uncordon <node1>
  • 以下命令撤离一个或多个节点上的所有或选定 pod:

    $ oc adm drain <node1> <node2> [--pod-selector=<pod_selector>]
  • 以下命令使用 --force 选项来强制删除裸机 pod。设为 true 时,即使存在不由复制控制器、ReplicaSet、作业、daemonset 或 StatefulSet 管理的 pod,也会继续执行删除:

    $ oc adm drain <node1> <node2> --force=true
  • 以下命令使用 --grace-period 以秒为单位设置一个期限,以便各个 pod 能够安全地终止。如果为负,则使用 pod 中指定的默认值:

    $ oc adm drain <node1> <node2> --grace-period=-1
  • 以下命令使用了 --ignore-daemonsets 标记(设为 true),以忽略由 DaemonSet 管理的 pod:

    $ oc adm drain <node1> <node2> --ignore-daemonsets=true
  • 以下命令使用 --timeout 标记来设置在放弃前要等待的时长。值为 0 时设定无限时长:

    $ oc adm drain <node1> <node2> --timeout=5s
  • 以下命令使用了 --delete-local-data 标记(设为 true),在存在使用 emptyDir 的 pod 时也仍然删除 pod。节点排空时会删除本地数据:

    $ oc adm drain <node1> <node2> --delete-local-data=true
  • 以下命令使用了 --dry-run 选项(设为 true),它会列出将要迁移的对象而不实际执行撤离:

    $ oc adm drain <node1> <node2>  --dry-run=true

    您可以使用 --selector=<node_selector> 选项来撤离选定节点上的 pod,而不指定具体的节点名称(如 <node1> <node2>)。

4.2.2. 了解如何更新节点上的标签

您可以更新节点上的任何标签。

节点标签不会在节点删除后保留,即使机器备份了节点也是如此。

注意

对 MachineSet 的任何更改都不会应用到 MachineSet 拥有的现有机器。例如,对现有 MachineSet 编辑或添加的标签不会传播到与该 MachineSet 关联的现有机器和节点。

  • 以下命令在节点上添加或更新标签:

    $ oc label node <node> <key_1>=<value_1> ... <key_n>=<value_n>

    例如:

    $ oc label nodes webconsole-7f7f6 unhealthy=true
  • 以下命令更新命名空间中的所有 pod:

    $ oc label pods --all <key_1>=<value_1>

    例如:

    $ oc label pods --all status=unhealthy

4.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>)。

4.2.4. 将 master 节点配置为可以调度

自 OpenShift Container Platform 4.2 起,您可以将 master 节点配置为可以调度,即允许在 master 节点上放置新的 Pod。默认情况下,master 节点不可调度。但是,如果集群不包含任何 worker 节点,那么 master 节点会默认标记为可以调度。

重要

在版本 4.3 中,创建没有 worker 节点的集群只能在裸机上部署,且为一个技术预览功能。对于所有其他集群类型,您可以将 master 设置为可调度,但必须保留 worker 节点。

您可以通过配置 mastersSchedulable 字段,来允许或禁止调度 master 节点。

流程

  1. 编辑 schedulers.config.openshift.io 资源。

    $ oc edit schedulers.config.openshift.io cluster
  2. 配置 mastersSchedulable 字段。

    apiVersion: config.openshift.io/v1
    kind: Scheduler
    metadata:
      creationTimestamp: "2019-09-10T03:04:05Z"
      generation: 1
      name: cluster
      resourceVersion: "433"
      selfLink: /apis/config.openshift.io/v1/schedulers/cluster
      uid: a636d30a-d377-11e9-88d4-0a60097bee62
    spec:
      mastersSchedulable: false 1
      policy:
        name: ""
    status: {}
    1
    设置为 true 以允许调度 master 节点,或设置为 false 以禁止调度 master 节点。
  3. 保存文件以应用更改。

4.2.5. 删除节点

4.2.5.1. 从集群中删除节点

当您使用 CLI 删除节点时,节点对象会从 Kubernetes 中删除,但该节点上存在的 Pod 不会被删除。任何未由复制控制器支持的裸机 Pod 都无法从 OpenShift Container Platform 访问。由复制控制器支持的 Pod 会重新调度到其他可用的节点。您必须删除本地清单 Pod。

流程

要从 OpenShift Container Platform 集群中删除节点,请编辑相应的 MachineSet:

注意

如果您在裸机上运行集群,则无法通过编辑 MachineSet 来删除节点。只有在集群与云供应商集成时才会使用 MachineSet。相反,您必须在手动删除前取消调度并排空节点。

  1. 查看集群中的 MachineSet:

    $ oc get machinesets -n openshift-machine-api

    MachineSet 以 <clusterid>-worker-<aws-region-az> 的形式列出。

  2. 缩放 MachineSet:

    $ oc scale --replicas=2 machineset <machineset> -n openshift-machine-api

如需有关使用 MachineSet 缩放集群的更多信息,请参见“手动缩放 MachineSet”。

4.2.5.2. 从裸机集群中删除节点

当您使用 CLI 删除节点时,节点对象会从 Kubernetes 中删除,但该节点上存在的 Pod 不会被删除。任何未由复制控制器支持的裸机 Pod 都无法从 OpenShift Container Platform 访问。由复制控制器支持的 Pod 会重新调度到其他可用的节点。您必须删除本地清单 Pod。

流程

通过完成以下步骤,从裸机上运行的 OpenShift Container Platform 集群中删除节点:

  1. 将节点标记为不可调度。

    $ oc adm cordon <node_name>
  2. 排空节点上的所有 Pod:

    $ oc adm drain <node_name> --force=true
  3. 从集群中删除您的节点:

    $ oc adm delete node <node_name>

虽然节点对象现已从集群中删除,但它仍然可在重启后或 kubelet 服务重启后重新加入集群。要永久删除该节点及其所有数据,您必须弃用该节点

4.2.6. 为节点添加内核参数

在一些特殊情况下,您可能需要为集群中的一组节点添加内核参数。进行此操作时应小心谨慎,而且您必须先清楚了解所设参数的影响。

警告

不当使用内核参数会导致系统变得无法引导。

您可以设置的内核参数示例包括:

  • selinux=0:禁用 Security Enhanced Linux (SELinux)。虽然不建议在生产环境中这样操作,但禁用 SELinux 可将性能提高 2%- 3%。
  • nosmt:在内核中禁用对称多线程 (SMT)。多线程允许每个 CPU 有多个逻辑线程。您可以在多租户环境中考虑使用 nosmt,以减少潜在的跨线程攻击风险。禁用 SMT 在本质上相当于选择安全性而非性能。

如需内核参数的列表和描述,请参阅 Kernel.org 内核参数

在下列步骤中,您要创建一个用于标识以下对象的 MachineConfig:

  • 您要添加内核参数的一组机器。本例中为具有 worker 角色的机器。
  • 附加到现有内核参数末尾的内核参数。
  • 指示 MachineConfig 列表中应用更改的位置的标签。

先决条件

  • 具有正常运行的 OpenShift Container Platform 集群的管理特权。

流程

  1. 列出 OpenShift Container Platform 集群的现有 MachineConfig,以确定如何标记您的 MachineConfig:

    $ oc get MachineConfig
    NAME                                                        GENERATEDBYCONTROLLER                      IGNITIONVERSION   CREATED
    00-master                                                   577c2d527b09cd7a481a162c50592139caa15e20   2.2.0             30m
    00-worker                                                   577c2d527b09cd7a481a162c50592139caa15e20   2.2.0             30m
    01-master-container-runtime                                 577c2d527b09cd7a481a162c50592139caa15e20   2.2.0             30m
    01-master-kubelet                                           577c2d527b09cd7a481a162c50592139caa15e20   2.2.0             30m
    01-worker-container-runtime                                 577c2d527b09cd7a481a162c50592139caa15e20   2.2.0             30m
    01-worker-kubelet                                           577c2d527b09cd7a481a162c50592139caa15e20   2.2.0             30m
    99-master-1131169f-dae9-11e9-b5dd-12a845e8ffd8-registries   577c2d527b09cd7a481a162c50592139caa15e20   2.2.0             30m
    99-master-ssh                                                                                          2.2.0             30m
    99-worker-114e8ac7-dae9-11e9-b5dd-12a845e8ffd8-registries   577c2d527b09cd7a481a162c50592139caa15e20   2.2.0             30m
    99-worker-ssh                                                                                          2.2.0             30m
    rendered-master-b3729e5f6124ca3678188071343115d0            577c2d527b09cd7a481a162c50592139caa15e20   2.2.0             30m
    rendered-worker-18ff9506c718be1e8bd0a066850065b7            577c2d527b09cd7a481a162c50592139caa15e20   2.2.0             30m
  2. 创建一个用来标识内核参数的 MachineConfig 文件(如 05-worker-kernelarg-selinuxoff.yaml

    apiVersion: machineconfiguration.openshift.io/v1
    kind: MachineConfig
    metadata:
      labels:
        machineconfiguration.openshift.io/role: worker1
      name: 05-worker-kernelarg-selinuxoff2
    spec:
      config:
        ignition:
          version: 2.2.0
      kernelArguments:
        - selinux=03
    1
    仅将新内核参数应用到 worker 节点。
    2
    用于标识它插入到 MachineConfig 中的什么位置 (05) 以及发挥什么作用(添加一个内核参数来关闭 SELinux)。
    3
    将确切的内核参数标识为 selinux=0
  3. 创建新的 MachineConfig:

    $ oc create -f 05-worker-kernelarg-selinuxoff.yaml
  4. 检查 MachineConfig 以查看是否添加了新配置:

    $ oc get MachineConfig
    NAME                                                        GENERATEDBYCONTROLLER                      IGNITIONVERSION   CREATED
    00-master                                                   577c2d527b09cd7a481a162c50592139caa15e20   2.2.0             31m
    00-worker                                                   577c2d527b09cd7a481a162c50592139caa15e20   2.2.0             31m
    01-master-container-runtime                                 577c2d527b09cd7a481a162c50592139caa15e20   2.2.0             31m
    01-master-kubelet                                           577c2d527b09cd7a481a162c50592139caa15e20   2.2.0             31m
    01-worker-container-runtime                                 577c2d527b09cd7a481a162c50592139caa15e20   2.2.0             31m
    01-worker-kubelet                                           577c2d527b09cd7a481a162c50592139caa15e20   2.2.0             31m
    
    05-worker-kernelarg-selinuxoff                                                                         2.2.0             105s
    
    99-master-1131169f-dae9-11e9-b5dd-12a845e8ffd8-registries   577c2d527b09cd7a481a162c50592139caa15e20   2.2.0             31m
    99-master-ssh                                                                                          2.2.0             30m
    99-worker-114e8ac7-dae9-11e9-b5dd-12a845e8ffd8-registries   577c2d527b09cd7a481a162c50592139caa15e20   2.2.0             31m
    99-worker-ssh                                                                                          2.2.0             31m
    rendered-master-b3729e5f6124ca3678188071343115d0            577c2d527b09cd7a481a162c50592139caa15e20   2.2.0             31m
    rendered-worker-18ff9506c718be1e8bd0a066850065b7            577c2d527b09cd7a481a162c50592139caa15e20   2.2.0             31m
  5. 检查节点:

    $ oc get nodes
    NAME                           STATUS                     ROLES    AGE   VERSION
    ip-10-0-136-161.ec2.internal   Ready                      worker   28m   v1.16.2
    ip-10-0-136-243.ec2.internal   Ready                      master   34m   v1.16.2
    ip-10-0-141-105.ec2.internal   Ready,SchedulingDisabled   worker   28m   v1.16.2
    ip-10-0-142-249.ec2.internal   Ready                      master   34m   v1.16.2
    ip-10-0-153-11.ec2.internal    Ready                      worker   28m   v1.16.2
    ip-10-0-153-150.ec2.internal   Ready                      master   34m   v1.16.2

    您可以发现,在应用更改时每个 worker 节点上的调度都会被禁用。

  6. 前往其中一个 worker 节点并列出内核命令行参数(主机上的 /proc/cmdline 中),以检查内核参数确实已发挥作用:

    $ oc debug node/ip-10-0-141-105.ec2.internal
    Starting pod/ip-10-0-141-105ec2internal-debug ...
    To use host binaries, run `chroot /host`
    
    sh-4.3# cat /host/proc/cmdline
    BOOT_IMAGE=/ostree/rhcos-... console=tty0 console=ttyS0,115200n8
    rootflags=defaults,prjquota rw root=UUID=fd0... ostree=/ostree/boot.0/rhcos/16...
    coreos.oem.id=qemu coreos.oem.id=ec2 ignition.platform.id=ec2 selinux=0
    
    sh-4.3# exit

    您应该会看到 selinux=0 参数已添加至其他内核参数。

4.2.7. 其他资源

如需有关使用 MachineSet 缩放集群的更多信息,请参见手动缩放 MachineSet


为了尽快向用户提供最新的信息,本文档可能会包括由机器自动从英文原文翻译的内容。如需更多信息,请参阅此说明。