イメージ
コンテナイメージは、アプリケーションおよびそのすべてのソフトウェア依存関係を含むバイナリデータを表します。 コンテナイメージは、スタンドアロンで実行可能なソフトウェアバンドルで、動作するためのランタイム環境が明確に規定されているのが特徴です。
通常、アプリケーションのコンテナイメージを作成してレジストリにプッシュし、その後、Podから参照します。
このページでは、コンテナイメージの概要を説明します。
備考:
Kubernetesのリリース(たとえばv1.33のような最新のマイナーリリース)に対応するコンテナイメージを探している場合は、Kubernetesのダウンロードを参照してください。イメージ名
コンテナイメージは通常、pause
、example/mycontainer
、またはkube-apiserver
のような名前がつけられます。
イメージには、レジストリのホスト名を含めることもできます。たとえば、fictional.registry.example/imagename
のようになります。また、同じようにポート番号を含めることもでき、その場合はfictional.registry.example:10443/imagename
のようになります。
レジストリのホスト名を指定しない場合、KubernetesはDockerパブリックレジストリを意味しているものと見なします。 この挙動は、コンテナランタイムの設定でデフォルトのイメージレジストリを指定することで変更できます。
イメージ名の後には、タグ や ダイジェスト を追加できます(これはdocker
やpodman
などのコマンドを使う場合と同様です)。
タグは、同じ系列のイメージの異なるバージョンを識別するために使用します。
ダイジェストは、イメージの特定のバージョンに対する一意の識別子であり、イメージの内容に基づくハッシュで構成され、変更不可能です。
タグは異なるイメージを指すように移動が可能ですが、ダイジェストは固定です。
イメージタグには、小文字および大文字のアルファベット、数字、アンダースコア(_
)、ピリオド(.
)、ハイフン(-
)を使用できます。
タグの長さは最大128文字で、次の正規表現パターンに従う必要があります: [a-zA-Z0-9_][a-zA-Z0-9._-]{0,127}
。
この仕様の詳細や検証用の正規表現については、OCI Distribution Specificationを参照してください。
タグを指定しない場合、Kubernetesはlatest
タグを指定したものと見なします。
イメージダイジェストは、ハッシュアルゴリズム(sha256
など)とハッシュ値で構成されます。
たとえば、sha256:1ff6c18fbef2045af6b9c16bf034cc421a29027b800e4f9b68ae9b1cb3e9ae07
のようになります。
ダイジェスト形式の詳細について詳しく知りたい場合は、OCI Image Specificationを参照してください。
Kubernetesで使用可能なイメージ名の例は次のとおりです:
busybox
— イメージ名のみで、タグやダイジェストは指定されていません。KubernetesはDockerパブリックレジストリとlatestタグを使用します。docker.io/library/busybox:latest
と同等です。busybox:1.32.0
— タグ付きのイメージ名。KubernetesはDockerパブリックレジストリを使用します。docker.io/library/busybox:1.32.0
と同等です。registry.k8s.io/pause:latest
— カスタムレジストリとlatestタグを指定したイメージ名。registry.k8s.io/pause:3.5
— カスタムレジストリと非latestタグを指定したイメージ名。registry.k8s.io/pause@sha256:1ff6c18fbef2045af6b9c16bf034cc421a29027b800e4f9b68ae9b1cb3e9ae07
— ダイジェストを含むイメージ名。registry.k8s.io/pause:3.5@sha256:1ff6c18fbef2045af6b9c16bf034cc421a29027b800e4f9b68ae9b1cb3e9ae07
— タグとダイジェストの両方を含むイメージ名。プル時にはダイジェストのみが使用されます。
イメージの更新
PodTemplateを含むDeployment、StatefulSet、Pod、またはその他のオブジェクトを初めて作成する際に、プルポリシーが明示的に指定されていない場合、デフォルトでそのPod内のすべてのコンテナのプルポリシーはIfNotPresent
に設定されます。
このポリシーでは、対象のイメージがすでに存在する場合、kubeletはそのイメージのプルをスキップします。
イメージプルポリシー
コンテナのimagePullPolicy
とイメージのタグの両方が、kubeletが指定されたイメージのプル(ダウンロード)を試みる タイミング に影響します。
以下は、imagePullPolicy
に設定できる値とその効果の一覧です。
IfNotPresent
- イメージがローカルにまだ存在しない場合にのみプルされます。
Always
- kubeletがコンテナを起動するたびに、コンテナイメージレジストリに問い合わせ、イメージ名をイメージダイジェストに解決します。 kubeletがそのダイジェストに完全一致するイメージをローカルにキャッシュしている場合は、そのキャッシュされたイメージを使用します。存在しない場合は、kubeletは解決されたダイジェストのイメージをプルし、そのイメージを使ってコンテナを起動します。
Never
- kubeletは、イメージを取得しようとしません。何らかの理由でローカルにイメージがすでに存在する場合、kubeletはコンテナを起動しようとします。それ以外の場合、起動に失敗します。 詳細は、事前にプルされたイメージを参照してください。
レジストリに確実にアクセスできるのであれば、基盤となるイメージプロバイダーのキャッシュセマンティクスによりimagePullPolicy: Always
でも効率的です。
コンテナランタイムは、イメージレイヤーがすでにノード上に存在することを認識できるので、再度ダウンロードする必要がありません。
備考:
本番環境でコンテナをデプロイする場合は、:latest
タグの使用を避けるべきです。
実行中のイメージのバージョンを追跡するのが難しく、正しくロールバックすることがより困難になるためです。
代わりに、v1.42.0
のような意味のあるタグやダイジェストを指定してください。
Podがいつも同じバージョンのコンテナイメージを使用するようにするためには、イメージのダイジェストを指定します。<image-name>:<tag>
を<image-name>@<digest>
に置き換えてください(たとえば、image@sha256:45b23dee08af5e43a7fea6c4cf9c25ccf269ee113168c19722f87876677c5cb2
)。
イメージタグを使用している場合、レジストリ側でそのタグが指すコードが変更されると、古いコードと新しいコードを実行するPodが混在する可能性があります。 イメージダイジェストは特定のバージョンのイメージを一意に識別するため、Kubernetesは特定のイメージ名とダイジェストが指定されたコンテナを起動するたびに同じコードを実行します。 イメージをダイジェストで指定することで、実行するコードのバージョンが固定され、レジストリ側の変更によってバージョンが混在する事態を防ぐことができます。
サードパーティー製のアドミッションコントローラーの中には、Pod(およびPodTemplate)の作成時にそれらを変更し、実行されるワークロードがタグではなくイメージのダイジェストに基づいて定義されるようにするものがあります。 レジストリでどのようなタグの変更があっても、すべてのワークロードが必ず同じコードを実行するようにしたい場合に有用かもしれません。
デフォルトのイメージプルポリシー
あなた(またはコントローラー)が新しいPodをAPIサーバーに送信すると、特定の条件が満たされた場合に、クラスターはimagePullPolicy
フィールドを設定します。
imagePullPolicy
フィールドを省略し、かつコンテナイメージにダイジェストを指定した場合、imagePullPolicy
には自動的にIfNotPresent
に設定される。imagePullPolicy
フィールドを省略し、コンテナイメージのタグに:latest
を指定した場合、imagePullPolicy
には自動的にAlways
が設定される。imagePullPolicy
フィールドを省略し、コンテナイメージのタグを指定しなかった場合、imagePullPolicy
には自動的にAlways
が設定される。imagePullPolicy
フィールドを省略し、コンテナイメージのタグに:latest
以外を指定した場合、imagePullPolicy
には自動的にIfNotPresent
が設定される。
備考:
コンテナのimagePullPolicy
の値は、そのオブジェクトが最初に 作成 されたときに常に設定され、その後イメージのタグやダイジェストが変更されても更新されません。
たとえば、タグが:latest
でない イメージを使ってDeploymentを作成した場合、後でDeploymentのイメージを:latest
タグに変更しても、imagePullPolicy
はAlways
に更新 されません。初回作成後にプルポリシーを変更したい場合は、手動で更新しなければいけません。
イメージプルを強制する
常に強制的にプルしたい場合は、以下のいずれかを実行できます:
- コンテナの
imagePullPolicy
にAlways
を設定する。 imagePullPolicy
を省略し、使用するイメージのタグに:latest
を指定する(KubernetesはPodを送信する際にポリシーをAlways
に設定します)。imagePullPolicy
と使用するイメージのタグを省略する(KubernetesはPodを送信する際にポリシーをAlways
に設定します)。- AlwaysPullImagesアドミッションコントローラーを有効にする。
ImagePullBackOff
kubeletがコンテナランタイムを使ってPodのコンテナの作成を開始するとき、ImagePullBackOff
のためにコンテナがWaiting状態になる可能性があります。
ImagePullBackOff
状態は、Kubernetesがコンテナイメージをプルできず、コンテナを開始できないことを意味します(イメージ名が無効である、imagePullSecret
無しでプライベートレジストリからプルしたなどの理由のため)。BackOff
は、バックオフの遅延を増加させながらKubernetesがイメージをプルしようとし続けることを示します。
Kubernetesは、組み込まれた制限である300秒(5分)に達するまで、試行するごとに遅延を増加させます。
ランタイムクラスごとのイメージプル
Kubernetes v1.29 [alpha]
(enabled by default: false)
RuntimeClassInImageCriApi
フィーチャーゲートを有効にすると、kubeletはイメージ名やダイジェストだけでなく、イメージ名とランタイムハンドラーのタプルでコンテナイメージを参照するようになります。
コンテナランタイム
は、選択されたランタイムハンドラーに基づいて動作を変更する可能性があります。
ランタイムクラスに応じたイメージプルを行う機能は、Windows Hyper-VコンテナのようなVMベースのコンテナにおいて有用です。
直列・並列イメージプル
デフォルトでは、kubeletはイメージを直列にプルします。 言い換えれば、kubeletはイメージサービスに対して一度に1つのイメージプル要求しか送信しません。 他のイメージプル要求は、処理中の要求が完了するまで待機する必要があります。
ノードは、イメージのプルを他のノードと独立して判断します。そのため、イメージプルを直列で実行していても、異なるノード上では同じイメージを並列でプルすることが可能です。
並列イメージプルを有効にしたい場合は、kubeletの設定でserializeImagePulls
フィールドをfalseに設定します。
serializeImagePulls
をfalseにすると、イメージプル要求は即座にイメージサービスへ送信され、複数のイメージが同時にプルされるようになります。
並列イメージプルを有効にする場合は、使用しているコンテナランタイムのイメージサービスが並列プルに対応していることを確認してください。
なお、kubeletは1つのPodに対して複数のイメージを並列でプルすることはありません。 たとえば、1つのPodがinitコンテナとアプリケーションコンテナを持つ場合、その二つのコンテナのイメージプルは並列化されません。 しかし、異なるPodがそれぞれ異なるイメージを使用しており、並列イメージプル機能が有効になっている場合、kubeletはその2つの異なるPodのためにイメージを並列でプルします。
最大並行イメージプル数
Kubernetes v1.32 [beta]
serializeImagePulls
がfalseに設定されている場合、kubeletはデフォルトで同時にプルできるイメージ数に制限を設けません。
並行でプルできるイメージ数を制限したい場合は、kubeletの設定でmaxParallelImagePulls
フィールドを指定します。
maxParallelImagePulls
に n を設定すると、同時にプルできるイメージは最大で n 件となり、n 件を超えるイメージプルは、少なくとも1件のイメージプルが完了するまで待機する必要があります。
並列イメージプルを有効にしている場合、同時プル数を制限することで、イメージのプルによるネットワーク帯域やディスクI/Oの過剰な消費を防ぐことができます。
maxParallelImagePulls
には1以上の正の整数を指定できます。
maxParallelImagePulls
を2以上に設定する場合は、serializeImagePulls
をfalseに設定する必要があります。
無効なmaxParallelImagePulls
の設定を行うと、kubeletは起動に失敗します。
イメージインデックスを用いたマルチアーキテクチャイメージ
コンテナレジストリはバイナリイメージの提供だけでなく、コンテナイメージインデックスも提供可能です。
イメージインデックスはコンテナのアーキテクチャ固有バージョンに関する複数のイメージマニフェストを指すことができます。
イメージには(たとえばpause
、example/mycontainer
、kube-apiserver
などの)名前を付け、各システムが自身のマシンアーキテクチャに適したバイナリイメージを取得できるようにする、という考え方です。
Kubernetesプロジェクトでは、通常、リリースごとに-$(ARCH)
というサフィックスを含む名前でコンテナイメージを作成します。
後方互換性のために、従来の形式のサフィックス付きイメージも生成されます。
たとえば、pause
という名前のイメージは、サポートされているすべてのアーキテクチャ向けのマニフェストを含むマルチアーキテクチャ対応のイメージですが、pause-amd64
は旧来の構成や、サフィックス付きのイメージ名をハードコードしているYAMLファイルとの互換性のために用意されたイメージです。
プライベートレジストリの使用
プライベートレジストリでは、イメージの検索やプルを行うために認証が必要となる場合があります。 認証情報は、以下のいくつかの方法で提供できます:
-
独自の認証情報を提供したPodのみが、プライベートレジストリへアクセスできます。
-
- すべてのPodが、設定されたプライベートレジストリからイメージを読み取れます。
- クラスター管理者によるノード構成が必要です。
-
kubelet credential provider プラグインを使用してプライベートレジストリ用の認証情報を動的に取得する
kubeletは、それぞれのプライベートレジストリに対してcredential provider execプラグインを使用するよう構成できます。
-
- すべてのPodがノードにキャッシュされたイメージを使用できます。
- すべてのノードに対してrootアクセスによるセットアップが必要です。
-
ベンダー固有またはローカルの拡張機能
カスタムノード構成を使用している場合、あなた自身(またはクラウドプロバイダー)が、コンテナレジストリに対するノードの認証手段を実装できます。
これらのオプションについて、以下で詳しく説明します。
PodでimagePullSecrets
を指定する
備考:
この方法がプライベートレジストリのイメージに基づいてコンテナを実行するための推奨の方法です。Kubernetesは、Podに対してコンテナイメージレジストリ用のキーを指定できます。
すべてのimagePullSecrets
は、そのPodと同じNamespace内に存在するSecretでなければなりません。
これらのSecretは、型がkubernetes.io/dockercfg
またはkubernetes.io/dockerconfigjson
である必要があります。
ノードを構成してプライベートレジストリに対して認証を行う
認証情報の具体的な設定手順は、使用するコンテナランタイムやレジストリによって異なります。 最も正確な情報については、使用しているソリューションのドキュメントを参照してください。
プライベートコンテナイメージレジストリの構成例については、イメージをプライベートレジストリから取得するを参照してください。 この例では、Docker Hubのプライベートレジストリを使用しています。
kubelet credential providerによる認証付きイメージプル
kubeletを構成して、プラグインバイナリを呼び出し、コンテナイメージのレジストリ認証情報を動的に取得させることができます。 これは、プライベートレジストリ用の認証情報を取得するための最も堅牢かつ柔軟な方法ですが、有効化するにはkubeletレベルでの設定が必要です。
この手法は、プライベートレジストリにホストされたコンテナイメージを必要とするStatic Podを実行する際に特に有用です。 ServiceAccountやSecretを使ってプライベートレジストリの認証情報を提供することは、Static Podの仕様で不可能です。 Static Podは、その仕様として他のAPIリソースへの参照を含めることが できない ためです。
詳細については、kubelet image credential providerを設定するを参照してください。
config.jsonの解釈
config.json
の解釈は、元のDockerの実装とKubernetesにおける解釈で異なります。
Dockerでは、auths
キーにはルートURLしか指定できませんが、Kubernetesではワイルドカード形式のURLや接頭辞一致のパスも許容されます。
唯一の制約は、ワイルドカード(*
)を使用する場合、各サブドメインに対して.
を含める必要があるという点です。
一致するサブドメインの数は、指定されたワイルドカードパターンの数(*.
)と一致している必要があります。
例:
*.kubernetes.io
は、kubernetes.io
には一致 しません が、abc.kubernetes.io
には一致します。*.*.kubernetes.io
は、abc.kubernetes.io
には一致 しません が、abc.def.kubernetes.io
には一致します。prefix.*.io
は、prefix.kubernetes.io
に一致します。*-good.kubernetes.io
は、prefix-good.kubernetes.io
に一致します。
つまり、次のようなconfig.json
は有効です:
{
"auths": {
"my-registry.example/images": { "auth": "…" },
"*.my-registry.example/images": { "auth": "…" }
}
}
イメージプル操作では、すべての有効なパターンに対して、認証情報がCRIコンテナランタイムに渡されます。 たとえば、次のようなコンテナイメージ名は正常にマッチします。
my-registry.example/images
my-registry.example/images/my-image
my-registry.example/images/another-image
sub.my-registry.example/images/my-image
しかし、次のようなコンテナイメージ名はマッチ しません。
a.sub.my-registry.example/images/my-image
a.b.sub.my-registry.example/images/my-image
kubeletは、見つかった各認証情報に対してイメージプルを順番に実行します。
つまり、config.json
内に異なるパスに対する複数のエントリを含めることも可能です。
{
"auths": {
"my-registry.example/images": {
"auth": "…"
},
"my-registry.example/images/subpath": {
"auth": "…"
}
}
}
このとき、コンテナがmy-registry.example/images/subpath/my-image
というイメージをプルするよう指定している場合、kubeletは、いずれかの認証元で失敗した場合でも、両方の認証情報を使ってイメージのダウンロードを試みます。
事前にプルされたイメージ
備考:
この方法は、ノードの構成を自分で制御できる場合に適しています。 クラウドプロバイダーがノードを管理し、自動的に置き換えるような環境では、信頼性のある動作は期待できません。デフォルトでは、kubeletは指定されたレジストリからそれぞれのイメージをプルしようとします。
ただし、コンテナのimagePullPolicy
プロパティがIfNotPresent
またはNever
に設定されている場合は、ローカルのイメージが(それぞれ優先的に、あるいは専用で)使用されます。
レジストリ認証の代替として事前にプルされたイメージを利用したい場合、クラスターのすべてのノードが同じ事前にプルされたイメージを持っていることを確認する必要があります。
これは、特定のイメージをあらかじめロードしておくことで高速化したり、プライベートレジストリへの認証の代替手段として利用したりすることができます。
kubelet credential providerの利用と同様に、 事前にプルされたイメージは、プライベートレジストリにホストされたイメージに依存するStatic Podを起動する場合にも適しています。
備考:
Kubernetes v1.33 [alpha]
(enabled by default: false)
事前にプルされたイメージへのアクセスは、イメージプルの認証情報の検証に基づいて許可される場合があります。
イメージプルの認証情報の検証を保証する
Kubernetes v1.33 [alpha]
(enabled by default: false)
クラスターでKubeletEnsureSecretPulledImages
フィーチャーゲートが有効になっている場合、Kubernetesは、プルに認証が必要なすべてのイメージに対して、たとえそのイメージがノード上にすでに存在していても、認証情報を検証します。
この検証により、Podが要求するイメージのうち、指定された認証情報で正常にプルされなかったものは、レジストリから再度プルする必要があることが保証されます。
さらに、以前に成功したイメージプルと同じ認証情報を使用する場合には、再プルは不要で、レジストリにアクセスせずローカルで検証が行われます(該当のイメージがローカルに存在する場合)。
この動作は、kubeletの設定におけるimagePullCredentialsVerificationPolicy
フィールドによって制御されます。
この設定は、イメージがすでにノード上に存在する場合に、イメージプルの認証情報を検証する必要があるかどうかの挙動を制御します:
NeverVerify
: このフィーチャーゲートが無効な場合と同じ動作を模倣します。イメージがローカルに存在する場合、イメージプルの認証情報は検証されません。NeverVerifyPreloadedImages
: kubeletの外部でプルされたイメージは検証されませんが、それ以外のすべてのイメージについては認証情報が検証されます。これがデフォルトの動作です。NeverVerifyAllowListedImages
: kubeletの外部でプルされたイメージと、kubelet設定内で指定されたpreloadedImagesVerificationAllowlist
に記載されたイメージは検証されません。AlwaysVerify
: すべてのイメージは、使用前に認証情報の検証が行われます。
この検証は、事前にプルされたイメージ、ノード全体のSecretを使用してプルされたイメージ、PodレベルのSecretを使用してプルされたイメージに適用されます。
備考:
認証情報がローテーションされた場合でも、以前にイメージのプルに使用された認証情報は、レジストリへアクセスすることなく検証に成功し続けます。 一方、新しい認証情報やローテーション後の認証情報を使用する場合には、イメージを再度レジストリからプルする必要があります。Docker設定を用いたSecretの作成
レジストリに対して認証を行うには、ユーザー名、レジストリのパスワード、クライアントのメールアドレス、およびレジストリのホスト名を把握しておく必要があります。 プレースホルダーを適切な値に置換したうえで、以下のコマンドを実行してください。
kubectl create secret docker-registry <name> \
--docker-server=<docker-registry-server> \
--docker-username=<docker-user> \
--docker-password=<docker-password> \
--docker-email=<docker-email>
すでにDockerの認証情報ファイルを持っている場合は、上記のコマンドを使用する代わりに、その認証情報ファイルをKubernetesのSecretとしてインポートすることができます。 既存のDocker認証情報に基づいてSecretを作成するに、その設定方法が説明されています。
これは、複数のプライベートコンテナレジストリを使用している場合に特に有用です。
kubectl create secret docker-registry
で作成されるSecretは、単一のプライベートレジストリにしか対応していないためです。
備考:
Podは自身のNamespace内にあるイメージプル用のSecretしか参照できないため、この手順はNamespaceごとに1回ずつ実行する必要があります。PodでimagePullSecrets
を参照する
次に、Pod定義にimagePullSecrets
セクションを追加することで、そのSecretを参照するPodを作成できます。
imagePullSecrets
配列の各要素は、同じNamespace内の1つのSecretのみを参照できます。
たとえば、以下のように記述します:
cat <<EOF > pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: foo
namespace: awesomeapps
spec:
containers:
- name: foo
image: janedoe/awesomeapp:v1
imagePullSecrets:
- name: myregistrykey
EOF
cat <<EOF >> ./kustomization.yaml
resources:
- pod.yaml
EOF
この作業は、プライベートレジストリを使用する各Podごとに実施する必要があります。
ただし、ServiceAccountリソースの中でimagePullSecrets
セクションを指定することで、この手順を自動化することが可能です。
詳細な手順については、ServiceAccountにImagePullSecretsを追加するを参照してください。
また、各ノードにある.docker/config.json
と併用することもできます。
これらの認証情報はマージされて使用されます。
ユースケース
プライベートレジストリを構成するにはいくつかの手段があります。 ここでは、いくつかの一般的なユースケースと推奨される解決方法を示します。
-
非専有(たとえば、オープンソースの)イメージだけを実行し、イメージを非公開にする必要がないクラスターの場合
- パブリックレジストリのパブリックイメージを利用する。
- 設定は必要ない。
- 一部のクラウドプロバイダーは、パブリックイメージを自動的にキャッシュまたはミラーリングすることで、可用性を向上させ、イメージのプルにかかる時間を短縮する。
- パブリックレジストリのパブリックイメージを利用する。
-
社外には非公開にすべきだが、クラスターユーザー全員には見える必要がある専有イメージを実行しているクラスターの場合
- ホスティング型のプライペートレジストリを使用する。
- プライベートレジストリにアクセスする必要があるノードには、手動設定が必要となる場合がある。
- または、ファイアウォールの内側で内部向けのプライベートレジストリを実行し、読み取りアクセスを開放して運用する。
- Kubernetesの設定は必要ない。
- イメージへのアクセスを制御できるホスティング型のコンテナイメージレジストリサービスを利用する。
- ノードを手動で構成する場合よりも、ノードのオートスケーリングと組み合わせた方がうまく機能する。
- あるいは、ノードの構成を変更するのが困難なクラスターでは、
imagePullSecrets
を使用する。
- ホスティング型のプライペートレジストリを使用する。
-
一部に、より厳格なアクセス制御を必要とする専有イメージを含むクラスターの場合
- AlwaysPullImagesアドミッションコントローラーが有効化されていることを確認する。これが無効な場合、すべてのPodがすべてのイメージにアクセスできてしまう可能性がある。
- 機密データはイメージ内に含める代わりに、Secretリソースに移行する。
-
それぞれのテナントが独自のプライベートレジストリを必要とするマルチテナントのクラスターである場合
- AlwaysPullImagesアドミッションコントローラーが有効化されていることを確認する。これが無効な場合、すべてのPodがすべてのイメージにアクセスできてしまう可能性がある。
- 認証が必要なプライベートレジストリを運用する。
- 各テナントごとにレジストリの認証情報を生成し、それをSecretに保存して、各テナントのNamespaceへ配布する。
- テナントは、そのSecretを各Namespaceの
imagePullSecrets
に追加する。
複数のレジストリへのアクセスが必要な場合、レジストリごとに1つのSecretを作成する事ができます。
レガシーな組み込みkubelet credential provider
古いバージョンのKubernetesでは、kubeletがクラウドプロバイダーの認証情報と直接統合されていました。 これにより、イメージレジストリの認証情報を動的に取得することが可能でした。
このkubelet credential provider統合には、以下の3つの組み込み実装がありました: ACR(Azure Container Registry)、ECR(Elastic Container Registry)、GCR(Google Container Registry)です。
Kubernetesバージョン1.26以降では、このレガシーな仕組みは削除されたため、以下のいずれかの対応が必要です:
- 各ノードにkubelet image credential providerを構成する
imagePullSecrets
と少なくとも1つのSecretを使用して、イメージプルの認証情報を指定する