YAML ファイルの変更を最小限に抑えるため、Elastic Container Instance は eci-profile 機能を提供します。 eci-profile を使用すると、クラスターレベルで Elastic Container Instance リソースを構成し、セレクターに基づいて Pod をオーケストレーションできます。 このトピックでは、eci-profile を構成する方法について説明します。
eci-profile の機能
Container Service for Kubernetes(ACK)で Elastic Container Instance を使用するには、Virtual Kubelet テクノロジーと統合された ack-virtual-node コンポーネントをデプロイする必要があります。 これにより、以下の問題が発生する可能性があります。
Elastic Container Instance で実行するように Pod をスケジューリングするには、上位層ビジネスの YAML ファイルを変更する必要があります。
Elastic Container Instance の特定の高度な機能を有効にするには、上位層ビジネスの YAML ファイルを変更する必要があります。
前述の問題は、O&M ジョブとビジネスジョブの境界線を曖昧にします。 これらの問題を回避するために、Elastic Container Instance は eci-profile 構成ファイルを提供します。 eci-profile は、以下の機能を提供します。
ECI スケジューラー
実ノードと仮想ノードがデプロイされているシナリオでは、Pod ラベル、名前空間ラベル、および Elastic Container Instance ベースのスケジューリングを構成することにより、Kubernetes Pod を Elastic Container Instance で実行するようにスケジューリングできます。 これらの構成を実行するには、クラスター内の既存のリソースを変更する必要があります。 変更によって、システムに脆弱性が発生する可能性があります。
この問題に対処するために、ECI スケジューラーは、mutating webhook に基づく新しいスケジューリングメカニズムを提供します。 eci-profile では、セレクターを構成できます。 次に、システムは、セレクターで指定された Pod ラベルまたは名前空間ラベルに基づいて Pod をフィルタリングします。 Pod またはその名前空間に、セレクターで指定された対応するラベルがある場合、Pod は Elastic Container Instance で実行するように自動的にスケジューリングされます。
ECI 効果
Elastic Container Instance の一部の機能を有効にするには、Pod にアノテーションまたはラベルを追加する必要があります。 これらの機能の例としては、Elastic Compute Service(ECS)のインスタンスタイプの指定、イメージキャッシュの有効化、Network Time Protocol(NTP)サービスの構成などがあります。 詳細については、「ECI Pod アノテーション」をご参照ください。
ECI 効果は、Pod にアノテーションとラベルを自動的に追加できます。 eci-profile でセレクターを構成するときに、フィルター条件と追加するアノテーションおよびラベルを指定できます。 セレクターのフィルター条件を満たす Pod は、Elastic Container Instance で実行するように自動的にスケジューリングされます。 指定されたアノテーションとラベルが Pod に追加されます。
ホットアップデート
eci-profile には、クラスター IP アドレス、ハイブリッドクラウド、ログ収集、および vSwitch の構成が含まれています。 要件に基づいて構成を更新できます。
構成を更新するために ack-virtual-node コンポーネントを再起動する必要はありません。
更新された構成は、新しく作成された Elastic Container Instance Pod にすぐに適用されますが、既存の Elastic Container Instance Pod には、Pod でローリングリリースが実行された後にのみ適用されます。
注意事項
eci-profile を構成する場合は、クラスター内の ack-virtual-node コンポーネントが最新バージョンであることを確認してください。 ack-virtual-node の更新方法については、「コンポーネントの管理」をご参照ください。
ECI スケジューラー機能を使用する場合は、mutating webhook を有効にする必要があります。 Serverless Kubernetes クラスター 内の Pod は、Elastic Container Instance で実行するように自動的にスケジューリングされます。 Pod をスケジューリングするために ECI スケジューラーを使用する必要はありません。
構成の説明
システムが Pod を作成すると、システムは kube-system 名前空間の eci-profile 構成ファイル(eci-profile という名前の ConfigMap)を読み取ります。 次に、システムは、構成ファイルの data セクションの構成に基づいて Pod を作成します。 kubectl get cm -n kube-system eci-profile -o yaml
コマンドを実行して、eci-profile の YAML ファイルを表示できます。 eci-profile の 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 セクションの構成を変更して、セレクターを構成したり、他の必要なパラメーターを更新したりできます。
data セクションのパラメーター | 説明 | 参照 |
selectors | 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 コンソール にログインします。
クラスター ページで、管理するクラスターを見つけ、クラスターの名前をクリックします。
クラスター管理ページの左側のナビゲーションウィンドウで、[構成] > [ConfigMap] を選択します。
名前空間ドロップダウンリストから [kube-system] を選択します。
eci-profile を見つけ、対応するアクション列の [YAML の編集] をクリックします。
セレクターを構成する
selectors パラメーターには、ECI スケジューラーと ECI 効果の構成が含まれています。 システムが Pod を作成すると、システムはセレクターに基づいて Pod を照合します。 Pod またはその名前空間にセレクターに対応するラベルがある場合、Pod は Elastic Container Instance で実行するように自動的にスケジューリングされるか、指定されたアノテーションとラベルが追加されて、Elastic Container Instance の高度な機能が有効になります。
selectors パラメーターには複数のセレクターを構成できます。 各セレクターの名前を指定する必要があります。 また、必要に応じて、各セレクターの以下の情報を指定することもできます。
namespaceSelector: 照合する名前空間ラベル。
objectSelector: 照合する Pod ラベル。
effect: Pod に動的に追加するアノテーションとラベル。
セレクターの構成テンプレート:
ビジネスシナリオに基づいてセレクターを設計します。 セレクターを構成する場合は、コメントを削除してください。
data:
selectors: |
[
{
"name": "selector-demo1", # セレクターの名前。これは必須パラメーターです。
"namespaceSelector": { # 名前空間フィルター。これは、名前空間ラベルに基づくオプションのパラメーターです。
"matchLabels": { # 照合する名前空間ラベル。複数のラベル間の論理関係は AND です。
"eci": "true"
}
},
"objectSelector": { # オブジェクトフィルター。これは、Pod ラベルに基づくオプションのパラメーターです。
"matchLabels": { # 照合する Pod ラベル。複数のラベル間の論理関係は AND です。
"eci": "true"
}
},
"effect": { # Pod に動的に追加するアノテーションとラベル。これはオプションのパラメーターです。
"annotations": {
"k8s.aliyun.com/eci-use-specs": "ecs.c6.xlarge"
},
"labels": {
"created-by-eci": "true"
}
}
},
{
"name": "selector-demo2",
"objectSelector": {
"matchLabels": {
"eci": "test"
}
}
}
]
上記のテンプレートでは、selector-demo1 という名前のセレクターが以下の機能を提供します。
Pod とその名前空間の両方に eci: true
ラベルがある場合、Pod は Elastic Container Instance で実行するように自動的にスケジューリングされます。 "k8s.aliyun.com/eci-use-specs": "ecs.c6.xlarge"
アノテーションと ラベルが Pod に追加されます。
セレクターごとに namespaceSelector と objectSelector パラメーターの少なくともいずれかを構成することをお勧めします。 namespaceSelector と objectSelector の両方が構成されている場合、Pod は両方のパラメーターの値と一致する必要があります。 いずれも構成されていないが、effect パラメーターが構成されている場合、effect 設定は、Elastic Container Instance で実行するようにスケジューリングされているすべての Pod に適用されます。
複数のセレクターを構成した場合、セレクターは順番に照合されます。 Pod が照合されると、effect 設定で指定されたアノテーションとラベルが Pod に自動的に追加されます。 これらのアノテーションとラベルは、Pod の既存のアノテーションとラベルを上書きしません。 重複するアノテーションまたはラベルが存在する場合、優先順位の高いアノテーションまたはラベルが使用されます。 Pod の既存のアノテーションとラベルは、照合されたセレクターの effect 設定で指定されたアノテーションとラベルよりも優先順位が高くなります。 セレクターの effect 設定のアノテーションまたはラベルには、セレクターが照合される順序で降順の優先順位が割り当てられます。
セレクターを構成した後、次のコマンドを実行して、セレクターが有効になっているかどうかを確認できます。 返された YAML ファイルに構成されたセレクターが含まれている場合、セレクターは有効になります。 返された YAML ファイルに構成されたセレクターが含まれていない場合は、セレクターの形式が正しいかどうかを確認してください。
kubectl get mutatingwebhookconfigurations -o yaml vk-webhook
構成例 1: 特定の Pod を Elastic Container Instance で実行するようにスケジューリングする
次のコードでは、namespaceSelector と objectSelector が構成されており、以下の機能を提供します。
Pod に created-by-eci: true
ラベルがあり、Pod の名前空間に type: eci
ラベルがある場合、Pod は Elastic Container Instance で実行するようにスケジューリングされます。
data:
selectors: |
[
{
"name":"eci-selector",
"namespaceSelector":{
"matchLabels":{
"type":"eci"
}
},
"objectSelector":{
"matchLabels":{
"created-by-eci":"true"
}
}
}
]
構成例 2: 特定の Pod を Elastic Container Instance にスケジューリングし、GPU アクセラレーション ECS インスタンスタイプを使用して Elastic Container Instance Pod を作成する
次のコードでは、namespaceSelector と effect が構成されており、以下の機能を提供します。
Pod が属する名前空間に gpu: true
ラベルがある場合、Pod は Elastic Container Instance で実行するようにスケジューリングされます。 Elastic Container Instance Pod は、ecs.gn6v-c8g1.2xlarge GPU アクセラレーション ECS インスタンスタイプに基づいて作成され、gpu: test
ラベルが追加されます。
data:
selectors: |
[
{
"name":"gpu-namespace-selector",
"namespaceSelector":{
"matchLabels":{
"gpu":"true"
}
},
"effect": {
"annotations": {
"k8s.aliyun.com/eci-use-specs":"ecs.gn6v-c8g1.2xlarge"
},
"labels":{
"gpu":"test"
}
}
}
]
構成例 3: 特定の Pod を Elastic Container Instance にスケジューリングし、イメージキャッシュの自動照合を有効にする
次のコードでは、objectSelector と effect が構成されており、以下の機能を提供します。
Pod に imc: auto
ラベルがある場合、Pod は Elastic Container Instance で実行するようにスケジューリングされます。 イメージキャッシュの自動照合機能が有効になって、Pod が作成されます。
data:
selectors: |
[
{
"name":"autoimc-object-selector",
"objectSelector":{
"matchLabels":{
"imc":"auto"
}
},
"effect": {
"annotations": {
"k8s.aliyun.com/eci-auto-imc": "true"
}
}
}
]
data セクションの他の必要なパラメーターを更新する
data セクションに含まれる他の必要なパラメーターは、Pod の作成に必要な情報を指定します。 たとえば、vpcId パラメーターは、Pod が属する virtual private cloud(VPC)を指定します。 vSwitchIds パラメーターは、Pod に関連付けられている vSwitch を指定します。 必要に応じて、必要なパラメーターを更新できます。 更新された構成は、ack-virtual-node コンポーネントを再起動しなくてもすぐに有効になります。 以下の必要なパラメーターを更新できます。
以下のパラメーターはクラスターレベルのパラメーターです。 Elastic Container Instance Pod を作成するときにパラメーターを構成しない場合、eci-profile の構成がパラメーターに使用されます。
パラメーター | 例 | 説明 |
enableClusterIp | "true" | クラスターの IP アドレスをサポートするかどうかを指定します。 |
enableLinuxArm64Node | "false" | ARM ベースのノードを有効にするかどうかを指定します。 詳細については、「ARM ベースの仮想ノードに Pod をスケジューリングする」をご参照ください。 |
enableLogController | "false" | 詳細については、「言語の選択」をご参照ください。 Simple Log Service の Custom Resource Definition(CRD)を使用して Pod のログを収集するかどうかを指定します。 このパラメーターを true に設定する場合は、slsMachineGroup パラメーターも構成する必要があります。 |
enablePVCController | "false" | オンラインディスク拡張を有効にするかどうかを指定します。 このパラメーターを true に設定すると、システムは、ディスクにバインドされている PersistentVolumeClaim(PVC)でホット拡張を実行できます。 |
enablePrivateZone | "false" | PrivateZone を使用してドメイン名を解決するかどうかを指定します。 |
enableReuseSSLKey | "false" | SSL キーの再利用を有効にするかどうかを指定します。 このパラメーターを true に設定すると、Elastic Container Instance Pod を作成するときに SSL キーが再利用されます。 これにより、Pod の作成効率が向上します。 重要 デフォルトでは、Elastic Container Instance Pod を作成すると、ack-virtual-node は各 Pod に一意の SSL 証明書を発行します。 多数の Pod を作成する場合、この動作は Pod の作成効率に大きく影響します。 SSL キーの再利用を有効にすると、ack-virtual-node はすべての Pod に同じ SSL 証明書を発行します。 これにより、セキュリティを犠牲にして効率が向上します。 |
featureGates | "WaitForFirstConsumer=false" | カナリア機能を指定します。 WaitForFirstConsumer のみを構成できます。 WaitForFirstConsumer を true に設定すると、ack-virtual-node がクラスターにデプロイされるときに、StorageClass は WaitForFirstConsumer モードを使用します。
詳細については、「ボリュームバインディングモード」をご参照ください。 |
securityGroupId | sg-2ze0b9o8pjjzts4h**** | Elastic Container Instance Pod が属するセキュリティグループ。 |
slsMachineGroup | "test-mg" | Elastic Container Instance Pod が属するマシングループ。 enableLogController パラメーターを true に設定する場合は、このパラメーターを指定する必要があります。 |
vSwitchIds | vsw-2zeet2ksvw7f14ryz**** | Elastic Container Instance Pod が関連付けられている vSwitch の ID。 vSwitch ID はカンマ(,)で区切ります。 |
vpcId | vpc-2zeghwzptn5zii0w7**** | Elastic Container Instance Pod がデプロイされている VPC の ID。 |
次のサンプルコードは、data セクションを構成する方法を示しています。
data:
enableClusterIp: "true"
enableHybridMode: "false"
enableLinuxArm64Node: "false"
enableLogController: "false"
enablePVCController: "false"
enablePrivateZone: "false"
enableReuseSSLKey: "false"
securityGroupId: sg-2zeeyaaxlkq9sppl****
selectors: ""
slsMachineGroup: ""
vSwitchIds: vsw-2ze23nqzig8inprou****,vsw-2ze94pjtfuj9vaymf****
vpcId: vpc-2zeghwzptn5zii0w7****