YAMLファイルへの変更を最小限に抑えるために、ECIはECIプロファイル機能を提供します。 この機能を使用すると、クラスター内にエラスティックコンテナーインスタンスを設定し、セレクターに基づいてポッドを調整できます。 このトピックでは、ECIプロファイルを設定する方法について説明します。
ECIプロファイルの概要
ECIプロファイル機能は、次の機能を提供します。
ECIスケジューラ
実ノードと仮想ノード (VNodes) の両方が使用されるシナリオでは、ポッドのラベルまたは名前空間のラベルを構成してポッドをVNodeにスケジュールし、VNodeにデプロイされたエラスティックコンテナインスタンスでポッドを実行できます。 同じ操作を実行するようにnodeSelectorとtolerationsパラメーターを設定することもできます。 これらの方法を使用するには、既存のリソースを変更する必要があります。 これらの変更は、システムに脆弱性を引き起こす可能性があります。
ECI Schedulerは、Mutating Webhookに基づくスケジューリングメカニズムを使用します。 eci-profileコンポーネントで照合する名前空間ラベルまたはポッドラベルを宣言できます。 宣言されたラベルを持つポッドは、自動的にVNodesにスケジュールされ、VNodesにデプロイされたエラスティックコンテナインスタンスで実行されます。
ECI効果
Elastic Compute Service (ECS) インスタンスタイプを指定したり、イメージキャッシュを有効にしたりする場合など、一部のElastic Container Instance機能を有効にするには、ポッドにアノテーションまたはラベルを追加する必要があります。 ECI Effectは自動的に注釈とラベルを追加します。 eci-profileコンポーネントでは、照合する名前空間ラベルまたはポッドラベルを宣言し、追加するアノテーションとラベルを指定できます。 指定されたアノテーションとラベルは、宣言されたラベルを持つポッドに自動的に追加されます。
追加できるアノテーションの詳細については、「Elastic Container Instanceでサポートされているアノテーション」をご参照ください。
eci-profileコンポーネントのデプロイ
ECIプロファイル機能を使用する前に、eci-Profileコンポーネントをクラスターにデプロイする必要があります。
次の内容をeci-profile.yamlファイルとして保存します。
apiVersion: v1 kind: ConfigMap メタデータ: 名前: eci-profile 名前空間: kube-system データ: セレクター: | [ { "name":"default-pod-selector" 、 "objectSelector":{ "matchLabels":{ "alibabacloud.com/eci": "true" } } }, { "name":"default-namespace-selector" 、 "namespaceSelector":{ "matchLabels":{ "alibabacloud.com/eci": "true" } } } ] --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole メタデータ: 名前: alicloud-eci-profile ルール: - apiGroups: - "" resources: - namespaces verbs: - get - list - watch - apiGroups: - "" resources: -イベント verbs: - create - patch - update - apiGroups: - "" resources: - configmaps verbs: - get - list - watch - create - patch - apiGroups: - "" resources: -ノード verbs: - get - apiGroups: - "admissionregistration.k8s.io" resources: -mutatingwebhookconfigurations verbs: - get - patch -作成 --- apiVersion: v1 kind: ServiceAccount メタデータ: 名前: alicloud-eci-profile 名前空間: kube-system --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding メタデータ: 名前: alicloud-eci-profile roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole 名前: alicloud-eci-profile 主題: - kind: ServiceAccount 名前: alicloud-eci-profile 名前空間: kube-system --- apiVersion: v1 種類: サービス メタデータ: labels: role: eci-profile 名前: eci-profile 名前空間: kube-system spec: ports: - port: 443 targetPort: 443 selector: アプリ: eci-profile --- apiVersion: apps/v1 kind: 配置 メタデータ: 名前: alicloud-eci-profile namespace: kube-system labels: アプリ: eci-profile webhook: eci-profile spec: replicas: 1 selector: matchLabels: アプリ: eci-profile template: metadata: labels: アプリ: eci-profile spec: serviceAccount: alicloud-eci-profile terminationGracePeriodSeconds: 60 containers: -name: eci-profile 画像: registry.cn-hangzhou.aliyuncs.com/eci/eci-profile:v1.0.0 imagePullPolicy: Always command: - /eci-profile args: --- profileProvider -cm resources: requests: メモリ: 30M cpu: 100m
デフォルトでは、次のセレクタが前述のテンプレートに追加されます。
default-pod-selector:
alibabacloud.com/eci: true
ラベルを持つポッドは、自動的にVNodeにスケジュールされます。default-namespace-selector:
alibabacloud.com/eci: true
ラベルを持つ名前空間内のポッドは、自動的にVNodeにスケジュールされます。
さらに、eci-profileコンポーネントをVNodeにスケジュールする場合は、nodeSelectorとtolerationsをeci-profileに追加する必要があります。
nodeSelector: k8s.aliyun.com/vnode: "true" 寛容: -キー: k8s.aliyun.com/vnode 演算子: "等しい" value: "true" 効果: 「NoSchedule」
eci-profileコンポーネントをデプロイします。
kubectl create -f eci-profile.yaml
デプロイの結果を表示します。
kubectl -n kube-system getポッド
次のコマンド出力が返されると、eci-profileコンポーネントがデプロイされます。
の名前準備ができているステータスの履歴書 alicloud-eci-profile-568d64cf84-f7sz8 1/1ランニング0 26h
設定の説明とサンプル設定
ECIプロファイルは、ポッドを一致させるためにeci-Profileのセレクタを読み取ります。 セレクターにラベルが含まれているポッドは、自動的にVNodesにスケジュールされるか、Elastic Container Instanceの機能を有効にするためにアノテーションとラベルが追加されます。
eci-profileのデプロイ後、次のコマンドを実行してeci-profileの設定を変更できます。
kubectl edit configmap eci-profile -n kube-system
次のコードは、セレクターを設定する方法を示しています。
セレクター: |
[
{
"name":"デモ" 、
"namespaceSelector":{
"matchLabels":{
"eci":"true"
}
},
"objectSelector":{
"matchLabels":{
"eci":"true"
}
},
"effect":{
"annotations":{
"k8s.aliyun.com/eci-image-cache": "true"
},
"labels":{
"created-by-eci":"true"
}
}
}
]
上記のテンプレートでは、次の機能を有効にするためにdemoという名前のセレクターが宣言されています。
ポッドが属する名前空間とポッド自体の両方にeci: true
ラベルが付いている場合、ポッドは自動的にVNodeにスケジュールされます。 さらに、"k8s.aliyun.com/eci-image-cache": "true"
アノテーションとcreated-by-eci: true
ラベルがポッドに追加されます。
各セレクターの名前を宣言する必要があります。 ビジネス要件に基づいて次のフィールドを宣言することもできます。
namespaceSelector: 一致する名前空間ラベル。
objectSelector: 一致するポッドのラベル。
effect: 動的に追加される注釈とラベル。
セレクターでは、namespaceSelector、objectSelector、またはその両方を設定する必要があります。 両方を構成する場合、namespaceSelectorとobjectSelectorの両方で指定されたすべてのラベルを持つポッドのみが自動的にVNodeにスケジュールされます。
クラスタのバージョンが1.16以降の場合、objectSelector機能がサポートされます。 クラスタのバージョンが1.16より前の場合は、feature-gateを使用してobjectSelector機能を有効にしてください。
サンプル設定1: 特定のポッドをelasticコンテナインスタンスにスケジュールする
シナリオ: created-by-eci: true
ラベルを持ち、名前空間にtype: eci
ラベルを持つポッドをVNodeにスケジュールします。 次のコードは、サンプルYAMLファイルを提供します。
apiVersion: v1
kind: ConfigMap
メタデータ:
名前: eci-profile
名前空間: kube-system
データ:
セレクター: |
[
{
"name":"eci-selector-1" 、
"namespaceSelector":{
"matchLabels":{
"type":"eci"
}
},
"objectSelector":{
"matchLabels":{
"created-by-eci":"true"
}
}
}
]
サンプル設定2: 特定の名前空間内のすべてのポッドをGPU高速化エラスティックコンテナインスタンスにスケジュールする
シナリオ: gpu: true
ラベルを持つ名前空間内のすべてのポッドをVNodeにスケジュールします。 さらに、エラスティックコンテナインスタンスは、ECS. gn6v-c8g1.2xlarge
GPUアクセラレーションインスタンスタイプのecsインスタンスに基づいて作成されます。 次のコードは、サンプルYAMLファイルを提供します。
apiVersion: v1
kind: ConfigMap
メタデータ:
名前: eci-profile
名前空間: kube-system
データ:
セレクター: |
[
{
"name":"gpu-namespace-selector-1" 、
"namespaceSelector":{
"matchLabels":{
"gpu":"true"
}
},
"effect": {
"annotations": {
"k8s.aliyun.com/eci-use-specs":"ecs.gn6v-c8g1.2xlarge"
}
}
}
]
サンプル設定3: 特定のポッドをAMDベースのエラスティックコンテナインスタンスにスケジュールする
シナリオ: amd: true
ラベルを持つポッドをVNodeにスケジュールします。 さらに、エラスティックコンテナインスタンスは、ECS. c6a.xlarge
AMDベースのecsインスタンスタイプのECSインスタンスに基づいて作成されます。 次のコードは、サンプルYAMLファイルを提供します。
apiVersion: v1
kind: ConfigMap
メタデータ:
名前: eci-profile
名前空間: kube-system
データ:
セレクター: |
[
{
"name":"amd-object-selector-1" 、
"objectSelector":{
"matchLabels":{
"amd":"true"
}
},
"effect": {
"annotations": {
"k8s.aliyun.com/eci-use-specs": "ecs.c6a.xlarge"
}
}
}
]