YAMLファイルへの変更を最小限に抑えるために、Elastic Container Instanceはeci-profile機能を提供します。 eci-profileを使用すると、クラスターレベルでElastic Container Instanceリソースを設定し、セレクターに基づいてポッドを調整できます。 このトピックでは、eci-profileを設定する方法について説明します。
eci-プロファイルの特徴
Container Service for Kubernetes (ACK) でElastic Container Instanceを使用するには、virtual Kubeletテクノロジと統合されたack-Virtual-nodeコンポーネントをデプロイする必要があります。 これにより、次の問題が発生する可能性があります。
ポッドをElastic Container Instanceで実行するようにスケジュールするには、上位層のビジネスのYAMLファイルを変更する必要があります。
Elastic Container Instanceの特定の高度な機能を有効にするには、上位層のビジネスのYAMLファイルを変更する必要があります。
上記の問題は、O&Mジョブとビジネスジョブの境界線を曖昧にしています。 これらの問題を回避するために、Elastic Container Instanceはeci-profile設定ファイルを提供します。 eci-プロファイルは次の機能を提供します。
ECIスケジューラ
実ノードと仮想ノードがデプロイされているシナリオでは、ポッドラベル、名前空間ラベル、およびElastic Container Instanceベースのスケジューリングを設定することで、KubernetesポッドをElastic Container Instanceで実行するようにスケジュールできます。 これらの設定を実行するには、クラスター内の既存のリソースを変更する必要があります。 この変更により、システムに脆弱性が生じる可能性があります。
この問題に対処するために、ECI Schedulerは、Webhookの変化に基づく新しいスケジューリングメカニズムを提供します。 eci-profileでは、セレクターを設定できます。 次に、システムは、セレクターで指定されたポッドラベルまたは名前空間ラベルに基づいてポッドをフィルター処理します。 ポッドまたはその名前空間に対応するラベルがセレクターで指定されている場合、ポッドは自動的にElastic Container Instanceで実行されるようにスケジュールされます。
ECI効果
Elastic Container Instanceの一部の機能を有効にするには、ポッドにアノテーションまたはラベルを追加する必要があります。 これらの機能の例としては、ECS (Elastic Compute Service) のインスタンスタイプの指定、イメージキャッシュの有効化、NTP (Network Time Protocol) サービスの設定などがあります。 詳細については、「ECIポッド注釈」をご参照ください。
ECI Effectは、ポッドにアノテーションとラベルを自動的に追加できます。 eci-profileでセレクターを設定するときに追加するフィルター条件と注釈とラベルを指定できます。 セレクターでフィルター条件を満たすポッドは、Elastic Container Instanceで実行されるように自動的にスケジュールされます。 指定されたアノテーションとラベルがポッドに追加されます。
ホットアップデート
eci-profileには、クラスターIPアドレス、ハイブリッドクラウド、ログ収集、およびvSwitchの設定が含まれます。 要件に基づいて設定を更新できます。
設定を更新するためにack-virtual-nodeコンポーネントを再起動する必要はありません。
更新された設定は、新しく作成されたElastic Container Instanceポッドにすぐに適用されますが、既存のElastic Container Instanceポッドには、ポッドでローリングリリースが実行された後にのみ適用されます。
注意事項
eci-profileを設定するときは、クラスター内のack-virtual-nodeコンポーネントが最新バージョンであることを確認してください。 ack-virtual-nodeの更新方法については、「コンポーネントの管理」をご参照ください。
ECIスケジューラ機能を使用する場合は、変化するwebhooksを有効にする必要があります。 ACKサーバーレスクラスターのポッドは、エラスティックコンテナインスタンスで実行されるように自動的にスケジュールされます。 ポッドをスケジュールするためにECIスケジューラを使用する必要はありません。
設定の説明
システムがポッドを作成するとき、システムはkube-system名前空間のeci-profile構成ファイル (eci-profileという名前のConfigMap) を読み取ります。 次に、システムは構成ファイルのdataセクションの構成に基づいてポッドを作成します。 kubectl get cm -n kube-system eci-profile -o yaml
コマンドを実行すると、eci-profileのYAMLファイルを表示できます。 eci-profilesのYAMLファイルテンプレート:
apiVersion: v1
data:
enableClusterIp: "true"
enableHybridMode: "false"
enableLinuxArm64Node: "false"
enableLogController: "false"
enablePVCController: "false"
enablePrivateZone: "false"
enableReuseSSLKey: "false"
featureGates: "WaitForFirstConsumer=false"
securityGroupId: sg-2zeeyaaxlkq9sppl****
selectors: ""
slsMachineGroup: ""
vSwitchIds: vsw-2ze23nqzig8inprou****,vsw-2ze94pjtfuj9vaymf****
vpcId: vpc-2zeghwzptn5zii0w7****
kind: ConfigMap
metadata:
creationTimestamp: "2023-01-11T08:28:14Z"
name: eci-profile
namespace: kube-system
resourceVersion: "356"
uid: b345fa8c-919e-41fc-a981-57864b1a****
eci-profileのdataセクションの設定を変更して、セレクターを設定したり、その他の必要なパラメーターを更新したりできます。
データセクションのパラメーター | 説明 | 関連ドキュメント |
セレクター | セレクタとエフェクトを追加して、ECIスケジューラとECIエフェクト機能を実装できます。 セレクターには、objectSelectorsとnamespaceSelectorsがあります。 要件に基づいてセレクターを設定できます。 | |
vpcIdやvSwitchIdsなどのその他の必須パラメーター | クラスターレベルのパラメーター。 ホットアップデートは、パラメータに対して実行することができる。 要件に基づいてパラメータを更新できます。 |
次のいずれかの方法を使用して、eci-profileを変更できます。
kubectl editコマンドを実行します。
kubectl edit configmap eci-profile -n kube-system
Container Service for Kubernetes (ACK) コンソールを使用します。
Container Service ACKコンソールにログインします。
[クラスター] ページで、管理するクラスターを見つけ、クラスターの名前をクリックします。
クラスター管理ページの左側のナビゲーションウィンドウで、[設定]> [設定] を選択します。
[名前空間] ドロップダウンリストから [kube-system] を選択します。
eci-profileを見つけて、対応する操作列で [YAMLの編集] をクリックします。
セレクターの設定
selectorsパラメーターには、ECI SchedulerとECI Effectの設定が含まれます。 システムがポッドを作成すると、システムはセレクタに基づいてポッドを照合します。 ポッドまたはその名前空間に対応するラベルがセレクターに含まれている場合、ポッドは自動的にElastic Container Instanceで実行されるようにスケジュールされるか、Elastic Container Instanceの高度な機能を有効にするために指定されたアノテーションとラベルが追加されます。
セレクターパラメーターには複数のセレクターを設定できます。 各セレクターの名前を指定する必要があります。 要件に基づいて、各セレクタの次の情報を指定することもできます。
namespaceSelector: 一致する名前空間ラベル。
objectSelector: 一致するポッドのラベル。
effect: ポッドに動的に追加する注釈とラベル。
セレクタの設定テンプレート:
ビジネスシナリオに基づいてセレクタを設計します。 セレクターを設定するときにコメントを削除します。
data:
selectors: |
[
{
"name": "selector-demo1", # The name of the selector. This is a required parameter.
"namespaceSelector": { # The namespace filter. This is an optional parameter based on namespace labels.
"matchLabels": { # The namespace labels to match. The logical relationship among multiple labels is AND.
"eci": "true"
}
},
"objectSelector": { # The object filter. This is an optional parameter based on pod labels.
"matchLabels": { # The pod labels to match. The logical relationship among multiple labels is AND.
"eci": "true"
}
},
"effect": { # The annotations and labels to dynamically add to the pods. This is an optional parameter.
"annotations": {
"k8s.aliyun.com/eci-use-specs": "ecs.c6.xlarge"
},
"labels": {
"created-by-eci": "true"
}
}
},
{
"name": "selector-demo2",
"objectSelector": {
"matchLabels": {
"eci": "test"
}
}
}
]
上記のテンプレートでは、selector-demo1という名前のセレクターは次の機能を提供します。
ポッドとその名前空間の両方にeci: true
ラベルが付いている場合、ポッドは自動的にElastic Container Instanceで実行されるようにスケジュールされます。 "k8s.aliyun.com/eci-use-specs": "ecs.c6.xlarge"
とcreated-by-eci: true
ラベルがポッドに追加されます。
各セレクターにnamespaceSelectorパラメーターとobjectSelectorパラメーターの少なくとも1つを設定することを推奨します。 namespaceSelectorとobjectSelectorの両方が設定されている場合、ポッドは両方のパラメーターの値と一致する必要があります。 いずれも設定されていないが、effectパラメーターが設定されている場合、Elastic Container Instanceで実行するようにスケジュールされているすべてのポッドに効果設定が適用されます。
複数のセレクターを設定すると、セレクターは順番に一致します。 ポッドが一致すると、エフェクト設定で指定されたアノテーションとラベルが自動的にポッドに追加されます。 これらのアノテーションとラベルは、ポッドの既存のアノテーションとラベルを上書きしません。 重複する注釈またはラベルが存在する場合、より高い優先度を有する注釈またはラベルが使用される。 ポッドの既存のアノテーションとラベルは、一致したセレクターのエフェクト設定で指定されたアノテーションとラベルよりも優先度が高くなります。 セレクタの効果設定の注釈またはラベルには、セレクタが一致する順序で降順の優先順位が割り当てられます。
セレクターを設定したら、次のコマンドを実行して、セレクターが有効かどうかを確認できます。 返されたYAMLファイルに設定済みのセレクターが含まれている場合、セレクターは有効になります。 返されたYAMLファイルに設定済みのセレクターが含まれていない場合は、セレクターが正しくフォーマットされているかどうかを確認します。
kubectl get mutatingwebhookconfigurations -o yaml vk-webhook
設定例1: Elastic Container Instanceで実行する特定のポッドをスケジュールする
次のコードでは、namespaceSelectorとobjectSelectorは次の機能を提供するように構成されています。
ポッドにcreated-by-eci: true
ラベルがあり、ポッドの名前空間にtype: eci
ラベルがある場合、ポッドはエラスティックコンテナインスタンスで実行されるようにスケジュールされます。
data:
selectors: |
[
{
"name":"eci-selector",
"namespaceSelector":{
"matchLabels":{
"type":"eci"
}
},
"objectSelector":{
"matchLabels":{
"created-by-eci":"true"
}
}
}
]
設定例2: 特定のポッドをElastic Container Instanceにスケジュールし、GPU高速化されたECSインスタンスタイプを使用してElastic Container instanceポッドを作成する
次のコードでは、namespaceSelectorとeffectは次の機能を提供するように構成されています。
ポッドが属する名前空間にgpu: true
ラベルが付いている場合、ポッドはElastic Container Instanceで実行されるようにスケジュールされます。 Elastic Container Instanceポッドは、ecs.gn6v-c8g1.2xlarge GPU高速化ECSインスタンスタイプに基づいて作成され、gpu: test
ラベルが追加されます。
データ:
セレクター: |
[
{
"name":"gpu-namespace-selector" 、
"namespaceSelector":{
"matchLabels":{
"gpu":"true"
}
},
"effect": {
"annotations": {
"k8s.aliyun.com/eci-use-specs":"ecs.gn6v-c8g1.2xlarge"
},
"labels":{
"gpu":"test"
}
}
}
]
構成例3: 特定のポッドをElastic Container Instanceにスケジュールし、イメージキャッシュの自動マッチングを有効にする
次のコードでは、objectSelectorとeffectは次の機能を提供するように構成されています。
ポッドにimc: auto
ラベルがある場合、ポッドはElastic Container Instanceで実行されるようにスケジュールされます。 ポッドを作成するには、イメージキャッシュの自動マッチング機能が有効になります。
データ:
セレクター: |
[
{
"name":"autoimc-object-selector" 、
"objectSelector":{
"matchLabels":{
"imc":"auto"
}
},
"effect": {
"annotations": {
"k8s.aliyun.com/eci-auto-imc": "true"
}
}
}
]
データセクションの他の必要なパラメータを更新する
データセクションに含まれるその他の必須パラメーターでは、ポッドの作成に必要な情報を指定します。 たとえば、vpcIdパラメーターは、ポッドが属する仮想プライベートクラウド (VPC) を指定します。 vSwitchIdsパラメーターは、ポッドに関連付けられているvSwitchを指定します。 要件に基づいて、必要なパラメーターを更新できます。 更新された設定は、ack-virtual-nodeコンポーネントを再起動しなくてもすぐに有効になります。 次の必須パラメータを更新できます。
次のパラメーターは、クラスターレベルのパラメーターです。 Elastic Container Instanceポッドの作成時にパラメーターを設定しない場合、パラメーターにはeci-profileの設定が使用されます。
パラメーター | 例 | 説明 |
enableClusterIp | "true" | クラスターのIPアドレスをサポートするかどうかを指定します。 |
enableLinuxArm64Node | "false" | ARMベースのノードを有効にするかどうかを指定します。 詳細については、「ARMベースの仮想ノードへのポッドのスケジュール」をご参照ください。 |
enableLogController | "false" | Simple Log Serviceのカスタムリソース定義 (CRD) を使用してポッドのログを収集するかどうかを指定します。 このパラメーターをtrueに設定する場合は、 slsMachineGroupパラメーター。 |
enablePVCController | "false" | オンラインディスク拡張を有効にするかどうかを指定します。 このパラメーターをtrueに設定すると、システムはディスクにバインドされているPersistentVolumeClaimes (PVC) でホット拡張を実行できます。 |
enablePrivateZone | "false" | PrivateZoneを使用してドメイン名を解決するかどうかを指定します。 |
enableReuseSSLKey | "false" | SSLキーの再利用を有効にするかどうかを指定します。 このパラメーターをtrueに設定すると、Elastic Container Instanceポッドの作成時にSSLキーが再利用されます。 これにより、ポッドの作成がより効率的になります。 重要 デフォルトでは、Elastic Container Instanceポッドを作成すると、ack-virtual-nodeは各ポッドに一意のSSL証明書を発行します。 多数のポッドを作成する場合、この動作はポッドの作成効率に大きく影響します。 SSLキーの再利用を有効にすると、ack-virtual-nodeはすべてのポッドに同じSSL証明書を発行します。 これは、セキュリティを犠牲にして効率を改善する。 |
featureGates | 「WaitForFirstConsumer=false」 | カナリア機能を指定します。 WaitForFirstConsumerのみを設定できます。 WaitForFirstConsumerをtrueに設定すると、ack-virtual-nodeがクラスターにデプロイされている場合、StorageClassはWaitForFirstConsumerモードを使用します。
詳細については、「ボリュームバインディングモード」をご参照ください。 |
securityGroupId | sg-2ze0b9o8pjjzts4h **** | Elastic Container Instanceポッドが属するセキュリティグループ。 |
slsMachineGroup | "テスト-mg" | Elastic Container Instanceポッドが属するマシングループ。 enableLogControllerパラメーターをtrueに設定した場合、このパラメーターを指定する必要があります。 |
vSwitchIds | vsw-2zeet2ksvw7f14ryz **** | Elastic Container Instanceポッドが関連付けられているvSwitchのID。 vSwitch IDはコンマ (,) で区切ります。 |
vpcId | vpc-2zeghwzptn5zii0w7 **** | Elastic Container InstanceポッドがデプロイされているVPCのID。 |
次のサンプルコードは、データセクションを設定する方法を示しています。
data:
enableClusterIp: "true"
enableHybridMode: "false"
enableLinuxArm64Node: "false"
enableLogController: "false"
enablePVCController: "false"
enablePrivateZone: "false"
enableReuseSSLKey: "false"
featureGates: "WaitForFirstConsumer=false"
securityGroupId: sg-2zeeyaaxlkq9sppl****
selectors: ""
slsMachineGroup: ""
vSwitchIds: vsw-2ze23nqzig8inprou****,vsw-2ze94pjtfuj9vaymf****
vpcId: vpc-2zeghwzptn5zii0w7****