すべてのプロダクト
Search
ドキュメントセンター

Elastic Container Instance:ECI プロファイルを使用してポッドを仮想ノードにスケジュールする

最終更新日:Dec 28, 2024

ECI プロファイルを使用すると、クラスタ内の Elastic Container Instance を構成し、セレクタに基づいてポッドをオーケストレーションできます。このトピックでは、ECI プロファイルコンポーネントのデプロイ方法と使用方法について説明します。

ECI プロファイルの機能

ECI プロファイルを使用すると、ポッドと名前空間のラベルを使用してポッドをフィルタリングし、以下の機能を実装できます。

  • アノテーションとラベルを追加する。

  • スケジューリングポリシーを実行する。

    ECI プロファイルは、以下のスケジューリングポリシーを実行できます。

    ポリシー

    説明

    fair

    このポリシーは、公平なスケジューリングを指定します。kube-scheduler は、ポッドを実際のノードまたは仮想ノードにスケジュールするかどうかを決定します。

    normalNodePrefer

    ポッドは優先的に実際のノードにスケジュールされます。実際のノードが不足している場合は、ポッドを仮想ノードにスケジュールできます。

    virtualNodeOnly

    ポッドは仮想ノードのみにスケジュールされます。

説明

このトピックでは、ECI プロファイルはセレクタカスタムリソース定義(CRD)を使用してポッドを自動的にスケジュールします。ConfigMap を使用してポッドをスケジュールするレガシー ECI プロファイルをデプロイしている場合は、引き続き ECI プロファイルを使用できます。ConfigMap モードの ECI プロファイルからセレクタ CRD モードに更新することをお勧めします。ConfigMap モードの ECI プロファイルは、今後公開される新機能をサポートしなくなります。詳細については、このトピックのECI プロファイルの更新セクションを参照してください。

ECI プロファイルのデプロイ

VNodectl を使用して ECI プロファイルをデプロイする

VNodectl ツールをインストールして構成している場合は、以下のコマンドを実行して ECI プロファイルを簡単にデプロイできます。

  1. ECI プロファイルをデプロイします。

    vnode addon enable eci-profile --kubeconfig /path/to/kubeconfig
  2. ECI プロファイルのデプロイステータスを表示します。

    vnode addon list

    以下のコマンド出力が返されます。ECI プロファイルのステータスは有効になっています。

    |----------------|------------|------------|-------------------------------------------------|
    |   ADDON NAME   |   STATUS   | MAINTAINER |                   REPOSITORY                    |
    |----------------|------------|------------|-------------------------------------------------|
    | eci-profile    | enabled ✅ | ECI Group  | https://github.com/aliyuneci/eci-profile.git    |
    | vnode-approver | enabled ✅ | ECI Group  | https://github.com/aliyuneci/vnode-approver.git |
    |----------------|------------|------------|-------------------------------------------------|

ECI プロファイルを手動でデプロイする

  1. eci-profile.yaml という名前の YAML ファイルを作成します。

    クラスタのバージョンに基づいて、以下の内容を YAML ファイルにコピーします。

    V1.16 以後

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      name: eci-profile
    rules:
      - apiGroups:
          - ""
        resources:
          - nodes
          - namespaces
          - resourcequotas
        verbs:
          - get
          - list
          - watch
      - apiGroups:
          - ""
        resources:
          - pods
        verbs:
          - get
          - list
          - watch
          - create
          - patch
      - apiGroups:
          - "admissionregistration.k8s.io"
        resources:
          - mutatingwebhookconfigurations
        verbs:
          - get
          - patch
          - create
          - delete
      - apiGroups:
          - "eci.aliyun.com"
        resources:
          - selectors
        verbs:
          - get
          - watch
          - list
    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: eci-profile
      namespace: kube-system
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: eci-profile
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: eci-profile
    subjects:
    - kind: ServiceAccount
      name: eci-profile
      namespace: kube-system
    ---
    apiVersion: apiextensions.k8s.io/v1
    kind: CustomResourceDefinition
    metadata:
      annotations:
        controller-gen.kubebuilder.io/version: (devel)
      creationTimestamp: null
      name: selectors.eci.aliyun.com
    spec:
      group: eci.aliyun.com
      names:
        kind: Selector
        listKind: SelectorList
        plural: selectors
        singular: selector
      scope: Namespaced
      versions:
      - name: v1
        schema:
          openAPIV3Schema:
            properties:
              apiVersion:
                description: 'APIVersion は、オブジェクトのこの表現のバージョン付きスキーマを定義します。サーバーは、認識されたスキーマを最新の内部値に変換する必要があり、認識されない値を拒否する場合があります。詳細:https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'
                type: string
              kind:
                description: 'Kind は、このオブジェクトが表す REST リソースを表す文字列値です。サーバーは、クライアントがリクエストを送信するエンドポイントからこれを推測する場合があります。更新できません。キャメルケースです。詳細:https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
                type: string
              metadata:
                type: object
              spec:
                properties:
                  effect:
                    properties:
                      annotations:
                        additionalProperties:
                          type: string
                        type: object
                      labels:
                        additionalProperties:
                          type: string
                        type: object
                    type: object
                  namespaceLabels:
                    description: ラベルセレクタは、リソースのセットに対するラベルクエリです。matchLabels と matchExpressions の結果は AND で結合されます。空のラベルセレクタはすべてのオブジェクトに一致します。null ラベルセレクタはどのオブジェクトにも一致しません。
                    properties:
                      matchExpressions:
                        description: matchExpressions は、ラベルセレクタ要件のリストです。要件は AND で結合されます。
                        items:
                          description: ラベルセレクタ要件は、値、キー、およびキーと値を関連付ける演算子を含むセレクタです。
                          properties:
                            key:
                              description: key は、セレクタが適用されるラベルキーです。
                              type: string
                            operator:
                              description: operator は、キーと値のセットの関係を表します。有効な演算子は In、NotIn、Exists、および DoesNotExist です。
                              type: string
                            values:
                              description: values は文字列値の配列です。演算子が In または NotIn の場合、values 配列は空であってはなりません。演算子が Exists または DoesNotExist の場合、values 配列は空である必要があります。この配列は、戦略的マージパッチ中に置き換えられます。
                              items:
                                type: string
                              type: array
                          required:
                          - key
                          - operator
                          type: object
                        type: array
                      matchLabels:
                        additionalProperties:
                          type: string
                        description: matchLabels は {key,value} ペアのマップです。matchLabels マップ内の単一の {key,value} は、キーフィールドが "key"、演算子が "In" で、values 配列に "value" のみが含まれる matchExpressions の要素と同等です。要件は AND で結合されます。
                        type: object
                    type: object
                    x-kubernetes-map-type: atomic
                  objectLabels:
                    description: ラベルセレクタは、リソースのセットに対するラベルクエリです。matchLabels と matchExpressions の結果は AND で結合されます。空のラベルセレクタはすべてのオブジェクトに一致します。null ラベルセレクタはどのオブジェクトにも一致しません。
                    properties:
                      matchExpressions:
                        description: matchExpressions は、ラベルセレクタ要件のリストです。要件は AND で結合されます。
                        items:
                          description: ラベルセレクタ要件は、値、キー、およびキーと値を関連付ける演算子を含むセレクタです。
                          properties:
                            key:
                              description: key は、セレクタが適用されるラベルキーです。
                              type: string
                            operator:
                              description: operator は、キーと値のセットの関係を表します。有効な演算子は In、NotIn、Exists、および DoesNotExist です。
                              type: string
                            values:
                              description: values は文字列値の配列です。演算子が In または NotIn の場合、values 配列は空であってはなりません。演算子が Exists または DoesNotExist の場合、values 配列は空である必要があります。この配列は、戦略的マージパッチ中に置き換えられます。
                              items:
                                type: string
                              type: array
                          required:
                          - key
                          - operator
                          type: object
                        type: array
                      matchLabels:
                        additionalProperties:
                          type: string
                        description: matchLabels は {key,value} ペアのマップです。matchLabels マップ内の単一の {key,value} は、キーフィールドが "key"、演算子が "In" で、values 配列に "value" のみが含まれる matchExpressions の要素と同等です。要件は AND で結合されます。
                        type: object
                    type: object
                    x-kubernetes-map-type: atomic
                  policy:
                    properties:
                      fair:
                        type: object
                      namespaceResourceLimit:
                        properties:
                          limits:
                            additionalProperties:
                              anyOf:
                              - type: integer
                              - type: string
                              pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
                              x-kubernetes-int-or-string: true
                            description: ResourceList は、(リソース名、数量) ペアのセットです。
                            type: object
                          namespace:
                            type: string
                        required:
                        - limits
                        - namespace
                        type: object
                      normalNodeOnly:
                        type: object
                      normalNodePrefer:
                        properties:
                          cpuRatio:
                            type: integer
                          memoryRatio:
                            type: integer
                        type: object
                      virtualNodeOnly:
                        type: object
                    type: object
                  priority:
                    format: int32
                    type: integer
                type: object
            required:
            - spec
            type: object
        served: true
        storage: true
    ---
    apiVersion: v1
    kind: Service
    metadata:
      labels:
        role: eci-profile
      name: eci-profile
      namespace: kube-system
    spec:
      ports:
        - port: 443
          targetPort: 443
      selector:
        app: eci-profile
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: eci-profile
      namespace: kube-system
      labels:
        app: eci-profile
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: eci-profile
      template:
        metadata:
          labels:
            app: eci-profile
        spec:
          serviceAccount: eci-profile
          containers:
          - name: eci-profile
            image: registry.cn-beijing.aliyuncs.com/eci-release/eci-profile:0.0.3
            imagePullPolicy: Always
            resources:
              requests: 
                cpu: 2
                memory: 4Gi   
              limits:
                cpu: 4    
                memory: 8Gi   
            env:
            - name: KUBERNETES_MASTER
              value: https://kubernetes:443

    V1.16 より前

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      name: eci-profile
    rules:
    - apiGroups:
        - ""
      resources:
        - nodes
        - namespaces
        - resourcequotas
      verbs:
        - get
        - list
        - watch
    - apiGroups:
        - ""
      resources:
        - pods
      verbs:
        - get
        - list
        - watch
        - create
        - patch
    - apiGroups:
        - "admissionregistration.k8s.io"
      resources:
        - mutatingwebhookconfigurations
      verbs:
        - get
        - patch
        - create
        - delete
    - apiGroups:
      - "eci.aliyun.com"
      resources:
        - selectors
      verbs:
        - get
        - watch
        - list
    ---
    apiVersion: apiextensions.k8s.io/v1beta1
    #apiVersion: apiextensions.k8s.io/v1
    kind: CustomResourceDefinition
    metadata:
      name: selectors.eci.aliyun.com
    spec:
      group: eci.aliyun.com
      version: v1beta1
      names:
        kind: Selector
        plural: selectors
        shortNames:
          - selectors
        categories:
          - all
      scope: Cluster
      validation:
        openAPIV3Schema:
          type: object
          required:
          - metadata
          - spec
          properties:
            apiVersion:
              type: string
            kind:
              type: string
            metadata:
              type: object
            spec:
              type: object
    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: eci-profile
      namespace: kube-system
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: eci-profile
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: eci-profile
    subjects:
    - kind: ServiceAccount
      name: eci-profile
      namespace: kube-system
    ---
    apiVersion: v1
    kind: Service
    metadata:
      labels:
        role: eci-profile
      name: eci-profile
      namespace: kube-system
    spec:
      ports:
      - port: 443
        targetPort: 443
      selector:
        app: eci-profile
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: eci-profile
      namespace: kube-system
      labels:
        app: eci-profile
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: eci-profile
      template:
        metadata:
          labels:
            app: eci-profile
        spec:
          serviceAccount: eci-profile
          containers:
          - name: eci-profile
            image: registry.cn-beijing.aliyuncs.com/eci-release/eci-profile:2.0.0-477875b-aliyun
            imagePullPolicy: Always
            resources:
              requests: 
                cpu: 2
                memory: 4Gi   
              limits:
                cpu: 4    
                memory: 8Gi   
            env:
            - name: KUBERNETES_MASTER
              value: https://kubernetes:443

  2. ECI プロファイルをデプロイします。

    kubectl create -f eci-profile.yaml
  3. デプロイ結果を表示します。

    kubectl -n kube-system get pods

    以下のコマンド出力が返されます。ECI プロファイルに対応するポッドは Running 状態です。

    NAME                                                     READY   STATUS    RESTARTS   AGE
    eci-profile-6454756cb8-8xlz8                   1/1      Running    0                76s

構成の説明と構成例

ECI プロファイルをデプロイした後、セレクタを作成してポッドスケジューリングポリシーと追加するアノテーションとラベルを構成できます。セレクタの YAML ファイルの例:

apiVersion: eci.aliyun.com/v1beta1
kind: Selector
metadata:
  name: test-fair
spec:
  objectLabels:
    matchLabels:
      app: nginx
  namespaceLabels:
    matchLabels:
      app: test
  effect:
    annotations:
      k8s.aliyun.com/eci-auto-imc: "true"
    labels:
      eci-schedulable: "true"
  policy:
    fair: {}
  priority: 3

次の表は、spec セクションのパラメータについて説明しています。

パラメータ

説明

objectLabels.matchLabels

一致させるポッドラベル。

namespaceLabels.matchLabels

一致させる名前空間ラベル。

effect.annotations

追加するアノテーション。

effect.labels

追加するラベル。

policy

スケジューリングポリシー。有効な値:

  • fair

  • normalNodePrefer

  • virtualNodeOnly

priority

セレクタの優先順位。複数の競合するセレクタを構成する場合、優先順位の高いセレクタが有効になります。パラメータの値が大きいほど、セレクタの優先順位が高くなります。

説明

objectLabels と namespaceLabels パラメータの少なくとも一方を指定する必要があります。両方のパラメータを指定する場合、ポッドは両方のパラメータに一致する必要があります。

例 1:スケジューリングポリシーを fair に設定する

以下のセレクタを作成します。このセレクタを使用することにより、ECI プロファイルはapp: nginxラベルを持つポッドに仮想ノード toleration を追加します。kube-scheduler は、ポッドを実際のノードまたは仮想ノードにスケジュールするかどうかを決定します。ECI プロファイルは、effect セクションで定義されているアノテーションとラベルもポッドに追加します。

apiVersion: eci.aliyun.com/v1beta1
kind: Selector
metadata:
  name: test-fair
spec:
  objectLabels:
    matchLabels:
      app: nginx
  effect:
    annotations:
      k8s.aliyun.com/eci-auto-imc: "true"
    labels:
      eci-schedulable: "true"
  policy:
    fair: {}

例 2:スケジューリングポリシーを normalNodePrefer に設定する

以下のセレクタを作成します。このセレクタを使用することにより、ECI プロファイルは実際のノードが不足している場合にapp: nginxラベルを持つポッドを仮想ノードにスケジュールします。ECI プロファイルは、effect セクションで定義されているアノテーションとラベルもポッドに追加します。

apiVersion: eci.aliyun.com/v1beta1
kind: Selector
metadata:
  name: test-normal-node-prefer
spec:
  objectLabels:
    matchLabels:
      app: nginx
  effect:
    annotations:
      k8s.aliyun.com/eci-image-cache: "true"
    labels:
      eci-schedulable: "true"
  policy:
    normalNodePrefer: {}

例 3:スケジューリングポリシーを virtualNodeOnly に設定する

以下のセレクタを作成します。このセレクタを使用することにより、ECI プロファイルはapp: nginxラベルを持つポッドに仮想ノード toleration と仮想ノード nodeSelector を追加します。ECI プロファイルは、effect セクションで定義されているアノテーションとラベルもポッドに追加します。

apiVersion: eci.aliyun.com/v1beta1
kind: Selector
metadata:
  name: test-virtual-node-only
spec:
  objectLabels:
    matchLabels:
      app: nginx
  effect:
    annotations:
      k8s.aliyun.com/eci-auto-imc: "true"
    labels:
      eci-schedulable: "true"
  policy:
    virtualNodeOnly: {}

ECI プロファイルの更新

ConfigMap を使用してポッドをスケジュールするレガシー ECI プロファイルをデプロイしている場合は、セレクタ CRD を使用してポッドをスケジュールする ECI プロファイルに更新することをお勧めします。ECI プロファイルを更新するには、次の操作を実行します。

  1. レガシー ECI プロファイルの kube-system 名前空間のセレクタの内容を記録します。

  2. レガシー ECI プロファイルを削除します。

  3. 新しい ECI プロファイルをデプロイします。

  4. 元のセレクタに基づいて新しいセレクタを作成します。

説明

ECI プロファイルの使用に関する質問がある場合は、DingTalk グループ(ID:44666389)に参加してテクニカルサポートを受けてください。