×

作为管理员,您可以为 Pod 创建和维护一个高效的集群。

通过保持集群高效,您可以为使用此类工具的开发人员提供更好的环境,例如 Pod 退出时会发生什么,确保始终运行所需的 Pod 数量,何时重启仅运行一次的 Pod,限制 Pod 可用的带宽,以及如何在中断期间保持 Pod 运行。

配置 Pod 重启后的行为

Pod 重启策略决定了当该 Pod 中的容器退出时 OpenShift Dedicated 的响应方式。该策略适用于该 Pod 中的所有容器。

可能的值为

  • Always - 持续尝试重启 Pod 中成功退出的容器,并采用指数退避延迟(10 秒、20 秒、40 秒),上限为 5 分钟。默认为 Always

  • OnFailure - 尝试重启 Pod 中失败的容器,并采用指数退避延迟(10 秒、20 秒、40 秒),上限为 5 分钟。

  • Never - 不尝试重启 Pod 中退出的或失败的容器。Pod 会立即失败并退出。

Pod 绑定到节点后,将永远不会绑定到其他节点。这意味着需要一个控制器才能使 Pod 在节点故障后继续存活。

条件 控制器类型 重启策略

预计会终止的 Pod(例如批处理计算)

Job

OnFailureNever

预计不会终止的 Pod(例如 Web 服务器)

副本控制器

Always.

必须每台机器运行一个的 Pod

DaemonSet

任何

如果 Pod 上的容器失败且重启策略设置为 OnFailure,则 Pod 保留在节点上,并重启容器。如果您不希望容器重启,请使用 Never 的重启策略。

如果整个 Pod 失败,OpenShift Dedicated 将启动一个新的 Pod。开发人员必须处理应用程序可能在新的 Pod 中重启的可能性。特别是,应用程序必须处理由先前运行引起的临时文件、锁、不完整输出等。

Kubernetes 架构期望云提供商提供可靠的端点。当云提供商宕机时,kubelet 会阻止 OpenShift Dedicated 重启。

如果底层云提供商端点不可靠,请不要使用云提供商集成安装集群。安装集群时,就好像它在非云环境中一样。不建议在已安装的集群中启用或禁用云提供商集成。

有关 OpenShift Dedicated 如何将重启策略与失败的容器一起使用的详细信息,请参阅 Kubernetes 文档中的示例状态

限制 Pod 可用的带宽

您可以将服务质量流量整形应用于 Pod,并有效地限制其可用的带宽。出站流量(来自 Pod)由策略处理,该策略只会丢弃超过配置速率的数据包。入站流量(到 Pod)由整形排队的数据包处理,以有效地处理数据。您对 Pod 设置的限制不会影响其他 Pod 的带宽。

步骤

要限制 Pod 上的带宽

  1. 编写对象定义 JSON 文件,并使用 kubernetes.io/ingress-bandwidthkubernetes.io/egress-bandwidth 注解指定数据流量速度。例如,要将 Pod 出站和入站带宽都限制为 10M/s

    受限的 Pod 对象定义
    {
        "kind": "Pod",
        "spec": {
            "containers": [
                {
                    "image": "openshift/hello-openshift",
                    "name": "hello-openshift"
                }
            ]
        },
        "apiVersion": "v1",
        "metadata": {
            "name": "iperf-slow",
            "annotations": {
                "kubernetes.io/ingress-bandwidth": "10M",
                "kubernetes.io/egress-bandwidth": "10M"
            }
        }
    }
  2. 使用对象定义创建 Pod

    $ oc create -f <file_or_dir_path>

了解如何使用 Pod 中断预算指定必须启动的 Pod 数量

Pod 中断预算允许在操作期间(例如,为维护而清空节点)对 Pod 指定安全约束。

PodDisruptionBudget (PDB) 是一个 API 对象,它指定了必须同时保持运行的副本的最小数量或百分比。在项目中设置这些参数有助于进行节点维护(例如缩减集群规模或集群升级),并且仅在自愿驱逐(非节点故障)时生效。

PodDisruptionBudget 对象的配置包含以下关键部分:

  • 标签选择器,这是一个针对一组 Pod 的标签查询。

  • 可用性级别,它指定了必须同时可用的 Pod 的最小数量,可以是:

    • minAvailable:即使在中断期间,也必须始终可用的 Pod 数量。

    • maxUnavailable:中断期间允许不可用的 Pod 数量。

Available 指的是状态为 Ready=True 的 Pod 数量。Ready=True 指的是能够服务请求并应添加到所有匹配服务的负载均衡池中的 Pod。

允许 maxUnavailable0%0,或 minAvailable100% 或等于副本数量,但这可能会阻止节点被 draining。

在 OpenShift Dedicated 中,所有机器配置池的 maxUnavailable 默认设置为 1。建议不要更改此值,并一次更新一个控制平面节点。请勿将控制平面池的此值更改为 3

您可以使用以下命令检查所有项目中的 Pod Disruption Budgets:

$ oc get poddisruptionbudget --all-namespaces

以下示例包含一些 AWS 上 OpenShift Dedicated 特有的值。

示例输出
NAMESPACE                              NAME                                    MIN AVAILABLE   MAX UNAVAILABLE   ALLOWED DISRUPTIONS   AGE
openshift-apiserver                    openshift-apiserver-pdb                 N/A             1                 1                     121m
openshift-cloud-controller-manager     aws-cloud-controller-manager            1               N/A               1                     125m
openshift-cloud-credential-operator    pod-identity-webhook                    1               N/A               1                     117m
openshift-cluster-csi-drivers          aws-ebs-csi-driver-controller-pdb       N/A             1                 1                     121m
openshift-cluster-storage-operator     csi-snapshot-controller-pdb             N/A             1                 1                     122m
openshift-cluster-storage-operator     csi-snapshot-webhook-pdb                N/A             1                 1                     122m
openshift-console                      console                                 N/A             1                 1                     116m
#...

当系统中至少运行 minAvailable 个 Pod 时,PodDisruptionBudget 被认为是健康的。超过此限制的每个 Pod 都可以被驱逐。

根据您的 Pod 优先级和抢占设置,即使满足 Pod Disruption Budget 要求,较低优先级的 Pod 也可能被移除。

使用 Pod Disruption Budgets 指定必须保持运行的 Pod 数量

您可以使用 PodDisruptionBudget 对象来指定必须同时保持运行的副本的最小数量或百分比。

步骤

配置 Pod Disruption Budget:

  1. 创建一个 YAML 文件,其中包含类似于以下的对象定义:

    apiVersion: policy/v1 (1)
    kind: PodDisruptionBudget
    metadata:
      name: my-pdb
    spec:
      minAvailable: 2  (2)
      selector:  (3)
        matchLabels:
          name: my-pod
    1 PodDisruptionBudget 属于 policy/v1 API 组。
    2 必须同时可用的 Pod 的最小数量。这可以是整数,也可以是指定百分比的字符串,例如 20%
    3 对一组资源的标签查询。matchLabelsmatchExpressions 的结果是逻辑上连接的。将此参数留空,例如 selector {},以选择项目中的所有 Pod。

    或者

    apiVersion: policy/v1 (1)
    kind: PodDisruptionBudget
    metadata:
      name: my-pdb
    spec:
      maxUnavailable: 25% (2)
      selector: (3)
        matchLabels:
          name: my-pod
    1 PodDisruptionBudget 属于 policy/v1 API 组。
    2 可以同时不可用的 Pod 的最大数量。这可以是整数,也可以是指定百分比的字符串,例如 20%
    3 对一组资源的标签查询。matchLabelsmatchExpressions 的结果是逻辑上连接的。将此参数留空,例如 selector {},以选择项目中的所有 Pod。
  2. 运行以下命令将对象添加到项目:

    $ oc create -f </path/to/file> -n <project_name>