eci-profile の ECI Effect 機能を使用すると、セレクターを定義して、一致する Pod にイメージキャッシュ関連のアノテーションを自動的に挿入できます。Pod がセレクターのラベル条件に一致すると、システムは手動での介入なしに指定されたアノテーションを追加します。これにより、個々の Pod スペックを変更することなく、Pod の作成を高速化できます。
注: eci-profile の背景情報については、「eci-profile の設定」をご参照ください。
前提条件
開始する前に、以下が準備できていることを確認してください:
ECI が有効化された Kubernetes クラスターへのアクセス
kube-system名前空間にあるeci-profileConfigMap を編集する権限クラスターと通信するように設定された
kubectl
仕組み
eci-profile は、ミューテーティング Webhook (vk-webhook) を使用して Pod 作成リクエストをインターセプトします。Pod が作成されると、Webhook は Pod のラベルと Pod が属する名前空間のラベルを、eci-profile で定義されたセレクターと照合します。一致が見つかった場合、Webhook は対応するアノテーションを Pod に挿入し、イメージキャッシュによる高速化を自動的に有効にします。
イメージキャッシュのアノテーション
Pod の作成時にイメージキャッシュがどのように使用されるかは、以下のアノテーションによってコントロールされます。
| アノテーション | 値の例 | 説明 |
|---|---|---|
k8s.aliyun.com/eci-auto-imc | "true" | 自動イメージキャッシュマッチングを有効にします。"true" に設定すると、システムはイメージの一致度、イメージサイズ、作成時刻に基づいて最適なイメージキャッシュを選択します。完全に一致するキャッシュが存在しない場合、Pod の作成時に新しいイメージキャッシュが作成されます。デフォルト値: "true"。 |
k8s.aliyun.com/imc-perfect-match | "true" | Pod 内のすべてのコンテナイメージがイメージキャッシュと完全に一致することを要求します。デフォルト値: "false"。 |
k8s.aliyun.com/imc-match-count-request | "2" | Pod 内でイメージキャッシュと完全に一致させたいコンテナイメージの数を指定します。 |
k8s.aliyun.com/eci-imc-id | imc-2zebxkiifuyzzlhl**** | ID によって Pod を特定のイメージキャッシュに固定します。 |
セレクターのフィールド
eci-profile の selectors 配列内の各セレクターには、以下のフィールドがあります:
| フィールド | 必須 | 説明 |
|---|---|---|
name | はい | セレクターの一意の名前。 |
namespaceSelector | いいえ | 名前空間のラベルに基づいて Pod をマッチングします。省略した場合、すべての名前空間が対象となります。 |
objectSelector | いいえ | Pod のラベルに基づいて Pod をマッチングします。省略した場合、一致する名前空間内のすべての Pod が対象となります。 |
effect.annotations | はい | 一致した Pod に挿入するアノテーション。 |
namespaceSelector.matchLabels または objectSelector.matchLabels で複数のラベルが指定された場合、すべてのラベルが一致する必要があります (AND ロジック)。
セレクターの設定
eci-profile ConfigMap を開いて編集します:
kubectl -n kube-system edit cm eci-profileselectorsフィールドにセレクターを配列形式で追加します:selectors: | [ { "name": "demo", "namespaceSelector": { "matchLabels": { "app": "nginx" } }, "objectSelector": { "matchLabels": { "type": "test" } }, "effect": { "annotations": { "k8s.aliyun.com/eci-auto-imc": "true" } } } ]エディターを保存して終了します。Kubernetes は変更を自動的に適用します。
設定の確認
次のコマンドを実行して、セレクターがアクティブであることを確認します:
kubectl get mutatingwebhookconfigurations -o yaml vk-webhook返された YAML に設定したセレクターが含まれている場合、セレクターは有効になっています。セレクターが存在しない場合は、ConfigMap の selectors フィールドに JSON フォーマットのエラーがないか確認してください。
例
以下の例では、異なるマッチング戦略を持つ 2 つのセレクターを定義します。
eci-profile ConfigMap を編集します:
kubectl -n kube-system edit cm eci-profileselectors フィールドに以下の内容を追加します:
[
...
{
"name": "image-cache-selector-1",
"objectSelector": {
"matchLabels": {
"image-cache": "true"
}
},
"effect": {
"annotations": {
"k8s.aliyun.com/eci-imc-id": "imc-uf6ic***************"
}
}
},
{
"name": "image-cache-selector-2",
"namespaceSelector": {
"matchLabels": {
"image-cache": "true"
}
},
"effect": {
"annotations": {
"k8s.aliyun.com/eci-auto-imc": "true"
}
}
}
]各セレクターの仕組み:
image-cache-selector-1:
image-cache: trueラベルを持つ Pod には、アノテーションk8s.aliyun.com/eci-imc-id: imc-uf6ic***************が自動的に挿入され、指定されたイメージキャッシュに固定されます。image-cache-selector-2:
image-cache: trueラベルを持つ名前空間で作成された Pod には、アノテーションk8s.aliyun.com/eci-auto-imc: "true"が自動的に挿入され、その名前空間内のすべての Pod で自動イメージキャッシュマッチングが有効になります。