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 プロファイルを簡単にデプロイできます。
ECI プロファイルをデプロイします。
vnode addon enable eci-profile --kubeconfig /path/to/kubeconfig
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 プロファイルを手動でデプロイする
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
ECI プロファイルをデプロイします。
kubectl create -f eci-profile.yaml
デプロイ結果を表示します。
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 | スケジューリングポリシー。有効な値:
|
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 プロファイルを更新するには、次の操作を実行します。
レガシー ECI プロファイルの kube-system 名前空間のセレクタの内容を記録します。
レガシー ECI プロファイルを削除します。
新しい ECI プロファイルをデプロイします。
元のセレクタに基づいて新しいセレクタを作成します。
ECI プロファイルの使用に関する質問がある場合は、DingTalk グループ(ID:44666389)に参加してテクニカルサポートを受けてください。