×

本文档描述了优雅关闭集群的过程。您可能需要出于维护原因或节省资源成本而暂时关闭集群。

先决条件

  • 在关闭集群之前,请进行etcd备份

    在执行此过程之前进行etcd备份非常重要,这样如果在重新启动集群时遇到任何问题,都可以恢复集群。

    例如,以下情况可能导致重新启动的集群出现故障

    • 关机期间etcd数据损坏

    • 由于硬件故障导致的节点故障

    • 网络连接问题

    如果您的集群无法恢复,请按照步骤恢复到之前的集群状态

关闭集群

您可以以优雅的方式关闭集群,以便以后重新启动。

您可以关闭集群,直到安装日期一年后,并期望它可以优雅地重启。安装日期一年后,集群证书将过期。但是,当集群重新启动时,您可能需要手动批准挂起的证书签名请求 (CSR) 以恢复 kubelet 证书。

先决条件
  • 您可以作为具有cluster-admin角色的用户访问集群。

  • 您已进行etcd备份。

步骤
  1. 如果您要长时间关闭集群,请确定证书到期日期并运行以下命令

    $ oc -n openshift-kube-apiserver-operator get secret kube-apiserver-to-kubelet-signer -o jsonpath='{.metadata.annotations.auth\.openshift\.io/certificate-not-after}'
    示例输出
    2022-08-05T14:37:50Zuser@user:~ $ (1)
    
    1 为确保集群能够优雅地重新启动,请计划在指定日期或之前重新启动它。当集群重新启动时,该过程可能需要您手动批准挂起的证书签名请求 (CSR) 以恢复 kubelet 证书。
  2. 将集群中的所有节点标记为不可调度。您可以通过云提供商的 Web 控制台执行此操作,也可以运行以下循环

    $ for node in $(oc get nodes -o jsonpath='{.items[*].metadata.name}'); do echo ${node} ; oc adm cordon ${node} ; done
    示例输出
    ci-ln-mgdnf4b-72292-n547t-master-0
    node/ci-ln-mgdnf4b-72292-n547t-master-0 cordoned
    ci-ln-mgdnf4b-72292-n547t-master-1
    node/ci-ln-mgdnf4b-72292-n547t-master-1 cordoned
    ci-ln-mgdnf4b-72292-n547t-master-2
    node/ci-ln-mgdnf4b-72292-n547t-master-2 cordoned
    ci-ln-mgdnf4b-72292-n547t-worker-a-s7ntl
    node/ci-ln-mgdnf4b-72292-n547t-worker-a-s7ntl cordoned
    ci-ln-mgdnf4b-72292-n547t-worker-b-cmc9k
    node/ci-ln-mgdnf4b-72292-n547t-worker-b-cmc9k cordoned
    ci-ln-mgdnf4b-72292-n547t-worker-c-vcmtn
    node/ci-ln-mgdnf4b-72292-n547t-worker-c-vcmtn cordoned
  3. 使用以下方法驱逐 Pod

    $ for node in $(oc get nodes -l node-role.kubernetes.io/worker -o jsonpath='{.items[*].metadata.name}'); do echo ${node} ; oc adm drain ${node} --delete-emptydir-data --ignore-daemonsets=true --timeout=15s --force ; done
  4. 关闭集群中的所有节点。您可以通过云提供商的 Web 控制台执行此操作,也可以运行以下循环。使用这些方法之一关闭节点允许 Pod 优雅地终止,这可以减少数据损坏的可能性。

    确保分配了 API VIP 的控制平面节点是循环中最后一个处理的节点。否则,关机命令将失败。

    $ for node in $(oc get nodes -o jsonpath='{.items[*].metadata.name}'); do oc debug node/${node} -- chroot /host shutdown -h 1; done (1)
    1 -h 1 表示此过程在控制平面节点关闭之前持续多长时间(以分钟为单位)。对于拥有 10 个或更多节点的大型集群,请设置为-h 10 或更长时间,以确保所有计算节点都有时间先关闭。
    示例输出
    Starting pod/ip-10-0-130-169us-east-2computeinternal-debug ...
    To use host binaries, run `chroot /host`
    Shutdown scheduled for Mon 2021-09-13 09:36:17 UTC, use 'shutdown -c' to cancel.
    Removing debug pod ...
    Starting pod/ip-10-0-150-116us-east-2computeinternal-debug ...
    To use host binaries, run `chroot /host`
    Shutdown scheduled for Mon 2021-09-13 09:36:29 UTC, use 'shutdown -c' to cancel.

    在关闭之前,无需清空 OpenShift Container Platform 附带的标准 Pod 的控制平面节点。集群管理员有责任确保在集群重新启动后其自身工作负载的干净重启。如果您由于自定义工作负载而在关闭之前清空了控制平面节点,则必须在集群重新启动后才能再次运行之前,将控制平面节点标记为可调度。

  5. 关闭不再需要的任何集群依赖项,例如外部存储或 LDAP 服务器。请务必在执行此操作之前咨询您的供应商文档。

    如果您在云提供商平台上部署了集群,请不要关闭、暂停或删除关联的云资源。如果您删除了已暂停虚拟机的云资源,OpenShift Container Platform 可能无法成功恢复。