日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

實(shí)現(xiàn)ECI Pod可用區(qū)打散或親和調(diào)度

高可用以及高性能是分布式任務(wù)執(zhí)行過程中的重要要求。在ACK Pro版集群或ACK Serverless集群Pro版中,您可以通過Kubernetes原生調(diào)度語義實(shí)現(xiàn)分布式任務(wù)的跨可用區(qū)打散,以達(dá)到高可用區(qū)部署的要求,或者通過Kubernetes原生調(diào)度語義實(shí)現(xiàn)分布式任務(wù)在指定可用區(qū)中的親和性部署,以達(dá)到高性能部署的要求。本文介紹如何實(shí)現(xiàn)ECI Pod可用區(qū)打散或親和調(diào)度。

背景信息

在某些情況下,您可能需要將Pod分散部署到多個(gè)不同的可用區(qū),或者部署到某個(gè)指定可用區(qū),以實(shí)現(xiàn)高可用或者高性能的需求。此時(shí),您可以通過Kubernetes原生調(diào)度語義中的Pod拓?fù)浞植技s束(topologySpreadConstraints)、節(jié)點(diǎn)親和性(nodeAffinity)和Pod親和性(podAffinity)來實(shí)現(xiàn)。

重要

僅當(dāng)Pod中帶有nodeAffinitypodAffinitytopologySpreadConstraints字段或存在匹配的ResourcePolicy時(shí)才會啟用可用區(qū)打散或親和調(diào)度。

更多信息,請參見Kubernetes官方文檔:

前提條件

使用限制

  • 目前僅支持設(shè)置topologyKeytopology.kubernetes.io/zone的用法。

  • 不支持設(shè)置ECI Pod的交換機(jī)順序。

    如果ECI Pod通過k8s.aliyun.com/eci-schedule-strategy: "VSwitchOrdered"的Annotation聲明了多可用區(qū)調(diào)度策略為按照交換機(jī)的指定順序,該功能將被自動禁用。

  • 不支持設(shè)置ECI Pod的故障處理策略為fail-fast

    如果ECI Pod通過k8s.aliyun.com/eci-fail-strategy: "fail-fast"的Annotation設(shè)置了Pod故障處理策略為fail-fast,該功能將被自動禁用。

配置示例

下文將在1.22版本的ACK Serverless集群Pro版本集群中演示ECI Pod可用區(qū)打散和親和調(diào)度功能。

示例一:通過topologySpreadConstraints實(shí)現(xiàn)可用區(qū)打散

說明

以下為一個(gè)配置了拓?fù)浯蛏⒓s束的示例。默認(rèn)情況下,Scheduler會將所有Pod均勻調(diào)度到所有可用區(qū)上,但并不會考慮Pod的生產(chǎn)結(jié)果。更多信息,請參見ECI嚴(yán)格拓?fù)浯蛏⒐δ芙榻B

  1. 在工作負(fù)載申明中增加拓?fù)浞植技s束。

    Pod的Spec字段中或Deployment、Job等工作負(fù)載的PodTemplate的Spec字段中,可以通過以下方式申明一個(gè)拓?fù)浞植技s束。

      topologySpreadConstraints:
        - maxSkew: <integer>
          minDomains: <integer> # 可選,從v1.25開始成為Beta。
          topologyKey: <string>
          whenUnsatisfiable: <string>
          labelSelector: <object>
          matchLabelKeys: <list> # 可選,從v1.27開始成為Beta。
          nodeAffinityPolicy: [Honor|Ignore] # 可選,從v1.26開始成為Beta。
          nodeTaintsPolicy: [Honor|Ignore] # 可選,從v1.26開始成為Beta。

    本示例將創(chuàng)建一個(gè)在多個(gè)可用區(qū)上均勻分布的Deployment。關(guān)于參數(shù)的詳細(xì)信息,請參見topologySpreadConstraints字段。以下為該Deployment的YAML文件。

    展開查看YAML文件

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: with-pod-topology-spread
      labels:
        app: with-pod-topology-spread
    spec:
      replicas: 10
      selector:
        matchLabels:
          app: with-pod-topology-spread
      template:
        metadata:
          labels:
            app: with-pod-topology-spread
        spec:
          topologySpreadConstraints:
            - maxSkew: 1
              topologyKey: topology.kubernetes.io/zone
              whenUnsatisfiable: DoNotSchedule
              labelSelector:
                matchLabels:
                  app: with-pod-topology-spread
          containers:
          - name: with-pod-topology-spread
            image: registry.k8s.io/pause:2.0
            resources:
              requests:
                cpu: "1"
                memory: "256Mi"
  2. 創(chuàng)建工作負(fù)載。

    將上面的代碼保存為deployment.yaml,并執(zhí)行以下命令將Deployment提交到集群中。

    kubectl apply -f deployment.yaml
  3. 驗(yàn)證工作負(fù)載調(diào)度結(jié)果。

    • 通過以下命令查看生產(chǎn)出的Pod所在的節(jié)點(diǎn)。

      kubectl get po -lapp=with-pod-topology-spread -ocustom-columns=NAME:.metadata.name,NODE:.spec.nodeName --no-headers | grep -v "<none>"
    • 通過以下命令查看生產(chǎn)出的Pod在各個(gè)可用區(qū)中的數(shù)量。

      kubectl get po -lapp=with-pod-topology-spread -ocustom-columns=NODE:.spec.nodeName --no-headers | grep -v "<none>" | xargs -I {} kubectl get no {} -ojson | jq '.metadata.labels["topology.kubernetes.io/zone"]' | sort | uniq -c

示例二:通過nodeAffinity和podAffinity實(shí)現(xiàn)可用區(qū)親和

  1. 在工作負(fù)載申明中增加親和性約束。

    本示例將創(chuàng)建在單個(gè)可用區(qū)上聚集分布的Deployment。關(guān)于參數(shù)的詳細(xì)信息,請參見節(jié)點(diǎn)親和性。以下為該Deployment的YAML文件。

    展開查看YAML文件

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: with-affinity
      labels:
        app: with-affinity
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: with-affinity
      template:
        metadata:
          labels:
            app: with-affinity
        spec:
          affinity:
            podAffinity:
              requiredDuringSchedulingIgnoredDuringExecution:
              - labelSelector:
                  matchExpressions:
                  - key: app
                    operator: In
                    values:
                    - with-affinity
                topologyKey: topology.kubernetes.io/zone
          containers:
          - name: with-affinity
            image: registry.k8s.io/pause:2.0

    若您希望指定可用區(qū)進(jìn)行部署,可以將示例中的podAffinity刪去,在nodeAffinity添加如下約束。下方約束表明Pod必須在可用區(qū)cn-beijing-a上進(jìn)行部署。

    requiredDuringSchedulingIgnoredDuringExecution:
      nodeSelectorTerms:
      - matchExpressions:
        - key: topology.kubernetes.io/zone
          operator: In
          values:
          - cn-beijing-a

    以下為nodeAffinity的完整示例,表明Pod必須在可用區(qū)cn-beijing-a上進(jìn)行部署。

    展開查看YAML詳情

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: with-affinity
      labels:
        app: with-affinity
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: with-affinity
      template:
        metadata:
          labels:
            app: with-affinity
        spec:
          affinity:
            nodeAffinity:
              requiredDuringSchedulingIgnoredDuringExecution:
                nodeSelectorTerms:
                - matchExpressions:
                  - key: topology.kubernetes.io/zone
                    operator: In
                    values:
                    - cn-beijing-a
          containers:
          - name: with-affinity
            image: registry.k8s.io/pause:2.0
  2. 創(chuàng)建工作負(fù)載。

    將上面的代碼保存為deployment.yaml,并執(zhí)行以下命令將Deployment提交到集群中。

    kubectl apply -f deployment.yaml
  3. 驗(yàn)證工作負(fù)載調(diào)度結(jié)果。

    • 通過以下命令查看生產(chǎn)出的Pod所在的節(jié)點(diǎn)。

      kubectl get po -lapp=with-affinity -ocustom-columns=NAME:.metadata.name,NODE:.spec.nodeName --no-headers | grep -v "<none>"
    • 通過以下命令查看生產(chǎn)出的Pod在各個(gè)可用區(qū)中的數(shù)量。

      kubectl get po -lapp=with-affinity -ocustom-columns=NODE:.spec.nodeName --no-headers | grep -v "<none>" | xargs -I {} kubectl get no {} -ojson | jq '.metadata.labels["topology.kubernetes.io/zone"]' | sort | uniq -c

ECI嚴(yán)格拓?fù)浯蛏⒐δ芙榻B

在保持默認(rèn)狀態(tài)不變的情況下,當(dāng)配置了強(qiáng)制打散約束時(shí),Scheduler會將所有Pod均勻放置到所有可用區(qū)上,但并不考慮ECI Pod的生產(chǎn)結(jié)果。如下圖所示,假設(shè)將打散功能的maxSkew設(shè)置為1。關(guān)于maxSkew,請參見maxSkew

image

此時(shí)若可用區(qū)B和C中生產(chǎn)ECI Pod失敗,則可用區(qū)A上會放置2個(gè)ECI Pod,其他兩個(gè)可用區(qū)沒有ECI Pod,從而破壞打散功能的maxSkew約束。

當(dāng)嚴(yán)格拓?fù)浯蛏⒐δ荛_啟后,在ACK Serverless集群Pro版中,調(diào)度器將嚴(yán)格保證Pod的強(qiáng)制打散需求得到滿足。Scheduler會在可用區(qū)A、B、C上各放置1個(gè)Pod,剩下的Pod將處于Pending狀態(tài),等待現(xiàn)有Pod生產(chǎn),如下圖所示。

image

當(dāng)PodA1生產(chǎn)成功后,Pending狀態(tài)的Pod將繼續(xù)Pending,這是由于可用區(qū)B以及可用區(qū)C上的ECI Pod仍然可能生產(chǎn)失敗,Pod放置于任意可用區(qū)仍然可能導(dǎo)致生產(chǎn)結(jié)束后破壞maxSkew約束。當(dāng)PodB1生產(chǎn)成功后,Scheduler將會放置一個(gè)Pod在可用區(qū)C。如下圖所示,其中綠色背景的Pod為生產(chǎn)完成的Pod。

image

若您不需要嚴(yán)格拓?fù)浯蛏⒐δ埽垖⑼負(fù)浯蛏⒓s束中的調(diào)度條件whenUnsatisfiable設(shè)置為ScheduleAnyway。詳細(xì)信息,請參見分布約束定義