×

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

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

配置Pod重启后的行为

Pod重启策略决定了在该Pod中的容器退出时,AWS上的Red Hat OpenShift Service如何响应。该策略适用于该Pod中的所有容器。

可能的值为

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

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

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

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

条件 控制器类型 重启策略

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

Job

OnFailureNever

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

副本控制器

Always.

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

DaemonSet

任意

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

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

Kubernetes架构期望云提供商提供可靠的端点。当云提供商关闭时,kubelet将阻止AWS上的Red Hat OpenShift Service重新启动。

如果底层云提供商端点不可靠,请不要使用云提供商集成安装集群。安装集群时,应将其视为无云环境。不建议在已安装的集群中启用或禁用云提供商集成。

有关AWS上的Red Hat OpenShift Service如何使用失败容器的重启策略的详细信息,请参阅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是一个API对象,它指定了必须同时启动的最小副本数量或百分比。在项目中设置这些内容在节点维护期间(例如缩减集群规模或集群升级)可能会有所帮助,并且仅在自愿驱逐(而不是节点故障)时才会被遵守。

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

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

  • 可用性级别,它指定必须同时可用的Pod的最小数量,或者

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

    • maxUnavailable是在中断期间可以不可用的Pod数量。

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

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

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

您可以使用以下命令检查所有项目中的Pod中断预算:

$ oc get poddisruptionbudget --all-namespaces

以下示例包含一些特定于AWS上的AWS上的Red Hat OpenShift Service的值。

示例输出
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中断预算要求,低优先级的Pod也可能会被删除。

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

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

步骤

要配置Pod中断预算

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

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

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