5.8.4. 正常重新引导节点

在重启节点前,建议备份 etcd 数据以避免该节点上出现数据丢失。

注意

对于需要用户执行 oc login 命令而不是 kubeconfig 文件中的证书来管理集群的单节点 OpenShift 集群,oc adm 命令在封锁并排空节点后可能无法使用。这是因为 openshift-oauth-apiserver pod 没有运行,因为 cordon。您可以使用 SSH 访问节点,如以下步骤所示。

在单节点 OpenShift 集群中,在封锁和排空时无法重新调度 Pod。但是,这样做会为 pod(特别是您的工作负载 pod)提供一定的时间来正确停止和释放相关资源。

流程

执行节点正常重启:

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

    $ oc adm cordon <node1>
  2. 排空节点以删除所有正在运行的 pod:

    $ oc adm drain <node1> --ignore-daemonsets --delete-emptydir-data --force

    您可能会收到与自定义 pod 中断预算(PDB)关联的 pod 无法被驱除的错误。

    错误示例

    error when evicting pods/"rails-postgresql-example-1-72v2w" -n "rails" (will retry after 5s): Cannot evict pod as it would violate the pod's disruption budget.

    在这种情况下,再次运行 drain 命令,添加 disable-eviction 标记,这将绕过 PDB 检查:

    $ oc adm drain <node1> --ignore-daemonsets --delete-emptydir-data --force --disable-eviction
  3. 以 debug 模式访问节点:

    $ oc debug node/<node1>
  4. 将您的根目录改为 /host

    $ chroot /host
  5. 重启节点:

    $ systemctl reboot

    目前,节点进入 NotReady 状态。

    注意

    在一些单节点 OpenShift 集群中,oc 命令在 cordon 和 drain 节点后可能无法使用,因为 openshift-oauth-apiserver pod 没有运行。您可以使用 SSH 连接到节点并执行重启。

    $ ssh core@<master-node>.<cluster_name>.<base_domain>
    $ sudo systemctl reboot
  6. 重启完成后,运行以下命令将节点标记为可以调度:

    $ oc adm uncordon <node1>
    注意

    在一些单节点 OpenShift 集群中,oc 命令在 cordon 和 drain 节点后可能无法使用,因为 openshift-oauth-apiserver pod 没有运行。您可以使用 SSH 连接到节点并取消封锁它。

    $ ssh core@<target_node>
    $ sudo oc adm uncordon <node> --kubeconfig /etc/kubernetes/static-pod-resources/kube-apiserver-certs/secrets/node-kubeconfigs/localhost.kubeconfig
  7. 验证节点是否已就绪:

    $ oc get node <node1>

    输出示例

    NAME    STATUS  ROLES    AGE     VERSION
    <node1> Ready   worker   6d22h   v1.18.3+b0068a8

附加信息

有关 etcd 数据备份的详情,请参考备份 etcd 数据