イメージ・レジストリーのセットアップ
開発者が Docker イメージを使用して IBM Cloud® Kubernetes Service にアプリ・コンテナーを作成できるように、イメージ・レジストリーを計画およびセットアップします。
イメージ・レジストリーの計画
イメージは通常、レジストリーに保管されます。だれでもアクセスできるレジストリー (パブリック・レジストリー) を使用することも、小さなグループのユーザーだけにアクセスを限定したレジストリー (プライベート・レジストリー) をセットアップすることもできます。
Docker Hub などのパブリック・レジストリーは、Docker および Kubernetes の入門として最初のコンテナー化アプリをクラスター内に作成する時に使用できます。 しかしエンタープライズ・アプリケーションを作成する場合は、許可されていないユーザーが勝手にイメージを使用したり変更したりすることがないように、 IBM Cloud Container Registry で提供されているようなプライベート・レジストリーを使用してください。 プライベート・レジストリーはクラスター管理者がセットアップする必要があります。プライベート・レジストリーにアクセスするための資格情報をクラスター・ユーザーに提供する必要があるためです。
IBM Cloud Kubernetes Service では、複数のレジストリーを使用してアプリをクラスターにデプロイできます。
レジストリ― | 説明 | メリット |
---|---|---|
IBM Cloud Container Registry | このオプションを使用すると、保護された独自の Docker イメージ・リポジトリーを IBM Cloud Container Registry 内にセットアップできます。そこでイメージを安全に保管してクラスター・ユーザー間で共有することができます。 |
|
他のすべてのプライベート・レジストリー | イメージプルシークレットを作成することで、既存のプライベートレジストリをクラスタに接続します。 このシークレットは、レジストリーの URL と資格情報を Kubernetes シークレットに安全に保存するために使用されます。 | ソース (Docker Hub、組織が所有するレジストリー、または他のプライベート・クラウド・レジストリー) と無関係に既存のプライベート・レジストリーを使用できる。 |
パブリック Docker Hub | Dockerfileの変更が不要な場合、 Docker Hubから既存の公開イメージを直接 Kubernetes のデプロイで使用するには、このオプションを使用します。 注: このオプションは組織のセキュリティー要件 (アクセス管理、脆弱性スキャン、アプリ・プライバシーなど) を満たさない可能性があるということに留意してください。 |
クラスターに追加セットアップは不要です。
|
イメージ・レジストリーをセットアップすると、クラスター・ユーザーがそれらのイメージを使用してクラスターにアプリをデプロイできるようになります。
コンテナー・イメージを使用する際の個人情報の保護の詳細を確認してください。
プライベート・レジストリーからイメージをプルする権限をクラスターに与える方法について
レジストリーからイメージをプルするために、IBM Cloud Kubernetes Service クラスターは特別なタイプの Kubernetes シークレットである imagePullSecret
を使用します。 このイメージ・プル・シークレットには、コンテナー・レジストリーにアクセスするための資格情報が保管されます。
コンテナー・レジストリーとして以下を使用できます。
- 自分が所有している IBM Cloud Container Registry のプライベート名前空間。
- 別の IBM Cloud Container Registry アカウントが所有している IBM Cloud のプライベート名前空間。
- その他のプライベート・レジストリー (Docker など)。
ただし、デフォルトでは、クラスターは、本人のアカウントの IBM Cloud Container Registry の名前空間からのみイメージをプルし、それらのイメージからクラスターの Kubernetes の default
名前空間にコンテナーをデプロイするようにセットアップされています。 クラスターの他の名前空間、または他のコンテナー・レジストリーからイメージをプルする必要がある場合は、独自のイメージ・プル・シークレットをセットアップする必要があります。
デフォルトのイメージ・プル・シークレットのセットアップ
一般に、IBM Cloud Kubernetes Service クラスターは、icr.io
Kubernetes 名前空間内のすべての、IBM Cloud Container Registry default
ドメインからのみ、イメージをプルできるようにセットアップされます。 他の Kubernetes ネームスペースまたはアカウントからイメージをプルする方法、プルアクセスを制限する方法、またはクラスタにデフォルトのイメージプルシークレットがない理由について、さらに詳しく知りたい場合は、以下のFAQを参照してください。
default
Kubernetes 名前空間からイメージをプルするようにクラスタを設定するにはどうすればよいですか?- クラスターを作成すると、そのクラスターの IBM Cloud IAM サービス ID に、IBM Cloud Container Registry に対するリーダーの IAM サービス・アクセス役割ポリシーが与えられます。 このサービス ID の資格情報が擬人化され、有効期限のない API キーの中に含められ、API キーがクラスターのイメージ・プル・シークレットに保管されます。 そのイメージ・プル・シークレットが、Kubernetes
名前空間
default
に追加され、その Kubernetes 名前空間のdefault
サービス・アカウントのシークレットのリストに含められます。 イメージ・プル・シークレットを使用することで、デプロイメントはグローバルおよびリージョンの IBM Cloud Container Registry からイメージをプル (読み取り専用アクセス) して、コンテナーを Kubernetes のdefault
名前空間にデプロイできます。
- グローバル・レジストリーには、IBM 提供のパブリック・イメージが安全に保管されています。 各リージョン・レジストリーに保管されたイメージを別々に参照することなく、すべてのデプロイメントでこれらのパブリック・イメージを参照できます。
- リージョンレジストリーには、独自のプライベート Docker イメージが安全に保管されます。
default
Kubernetes ネームスペースにイメージプル用の秘密がない場合はどうすればよいですか?- クラスターにログインし、
kubectl get secrets -n default | grep "icr-io"
を実行してイメージ・プル・シークレットを確認できます。icr
シークレットがリストされない場合は、クラスターを作成したユーザーが、IAM で IBM Cloud Container Registry に対する必要な許可を持っていなかった可能性があります。 API キーのイメージ・プル・シークレットを使用するように既存のクラスターを更新するを参照してください。 - 特定の地域レジストリへのプルアクセスを制限することはできますか?
- はい。サービス ID の既存の IAM ポリシーを編集して、リーダーのサービス・アクセス役割をそのリージョン・レジストリーまたはレジストリー・リソース (名前空間など) に制限できます。 レジストリーの IAM ポリシーをカスタマイズする前に IBM Cloud で IBM Cloud Container Registry IAM ポリシーを有効にしておく必要があります。
レジストリー資格情報の安全性をさらに高めたいですか? クラスター内の Kubernetes シークレット (レジストリー資格情報を保管するイメージ・プル・シークレットなど) を暗号化するために、クラスターで鍵管理サービス・プロバイダーを有効にするようにクラスター管理者に依頼してください。
- Kubernetes のネームスペースで、
default
以外の画像を呼び出すことはできますか? - デフォルトではできません。 デフォルトのクラスター・セットアップを使用することで、IBM Cloud Container Registry 名前空間内に保管されている任意のイメージからのコンテナーを、クラスターの
default
Kubernetes 名前空間にデプロイできます。 これらのイメージを他の Kubernetes 名前空間や他の IBM Cloud アカウントで使用するためには、イメージ・プル・シークレットをコピーするか作成します。 - IBM Cloud の別のアカウントから画像を引っ張ってくることはできますか?
- はい。使用する IBM Cloud アカウントで API キーを作成してください。 次に、その IBM Cloud アカウントからイメージをプルする各クラスターの名前空間ごとに、API キーを入れたシークレットを作成します。 詳しくは、許可されたサービス ID の API キーを使用するこちらの例の手順に従ってください。
Docker などの非 IBM Cloud レジストリーを使用する場合は、他のプライベート・レジストリーに格納されたイメージへのアクセスを参照してください。
- APIキーはサービスID用のものである必要がありますか? アカウントのサービスIDの上限に達した場合、どうなりますか?
- デフォルトのクラスター・セットアップでは、IBM Cloud IAM API キー資格情報をイメージ・プル・シークレットに保管するためのサービス ID が作成されます。 ただし、個別ユーザー用の API キーを作成して、それらの資格情報をイメージ・プル・シークレットに保管することもできます。 サービス ID の IAM 制限 に到達した場合、クラスターはサービス
ID とイメージ・プル・シークレットなしで作成され、デフォルトでは
icr.io
レジストリー・ドメインからイメージをプルできません。 独自のイメージ・プル・シークレットを作成する必要がありますが、そのためには、IBM Cloud IAM サービス ID ではなく、部門 ID などの個別ユーザー用の API キーを使用します。 - 地域レジストリドメインとすべてのレジストリドメインのイメージプルに関する秘密事項を確認します。 どれを使えばいいの?
- 以前は、IBM Cloud Kubernetes Service によって、リージョンのパブリック
icr.io
レジストリー・ドメインごとに別々のイメージ・プル・シークレットが作成されていました。 現在は、すべてのリージョンのパブリックとプライベートのすべてのicr.io
レジストリー・ドメインが、クラスターのall-icr-io
Kubernetes 名前空間に自動的に作成される単一のdefault
イメージ・プル・シークレットに保管されます。
クラスターの他の Kubernetes 名前空間のワークロードでプライベート・レジストリーからコンテナー・イメージをプルする場合に、all-icr-io
イメージ・プル・シークレットをその Kubernetes 名前空間にコピーするだけで済むようになりました。 その後、サービス・アカウントまたはデプロイメントに all-icr-io
シークレットを指定します。 イメージのリージョン別レジストリーと一致するイメージ・プル・シークレットをコピーする必要がなくなりました。
また、認証を必要としないパブリック・レジストリーのイメージ・プル・シークレットは必要ないことに注意してください。
- Kubernetes の別の名前空間で画像プル秘密をコピーまたは作成したら、完了ですか?
- 十分ではありません。 コンテナーが、作成したシークレットを使用してイメージをプルすることを許可されている必要があります。 イメージ・プル・シークレットを名前空間のサービス・アカウントに追加することも、各デプロイメントでシークレットを参照することもできます。 手順については、イメージ・プル・シークレットを使用したコンテナーのデプロイを参照してください。
icr.io
レジストリーへのプライベート・ネットワーク接続
サービス・エンドポイントを使用するように IBM Cloud アカウントをセットアップすると、IBM Cloud Container Registry との間で行うイメージのプッシュとプルにプライベート・ネットワーク接続を使用できます。
icr.io
レジストリへのプライベート接続を使用するクラスタを設定するには、何が必要ですか?
- IBM Cloud インフラストラクチャアカウントで 仮想ルーター機能(VRF) を有効にすると、 IBM Cloud Container Registry プライベートクラウドサービスエンドポイントを使用できるようになります。 VRF を有効にするには、VRF の有効化を参照してください。
VRF が既に有効になっているかどうかを確認するには、
ibmcloud account show
コマンドを使用します。 - IBM Cloud アカウントでサービス・エンドポイントを使用できるようにします。
IBM Cloud Container Registry 自動的にプライベートクラウドサービスのエンドポイントを使用します。 IBM Cloud Kubernetes Service クラスターのプライベート・クラウド・サービス・エンドポイントを有効にする必要はありません。
API キーのイメージ・プル・シークレットを使用するように既存のクラスターを更新する
新しい IBM Cloud Kubernetes Service クラスターでは、IBM Cloud Container Registry へのアクセス権限を与えるためのイメージ・プル・シークレットに API キーが保管されます。 それらのイメージ・プル・シークレットを使用すれば、icr.io
レジストリー・ドメインに保管されているイメージからコンテナーをデプロイできます。 クラスターの作成時にイメージ・プル・シークレットを使用しなかった場合は、シークレットをクラスターに追加できます。
2019 年 2 月 25 日より前に作成されたクラスターは、レジストリー・トークンではなく API キーをイメージ・プル・シークレットに保管するように更新する必要があります。
開始前に
-
アカウントにログインします。 該当する場合は、適切なリソース・グループをターゲットにします。 クラスターのコンテキストを設定します。
-
以下のアクセス権を持っていることを確認します。IBM Cloud に対する IBM Cloud Kubernetes Service IAM のオペレーターまたは管理者のプラットフォーム・アクセス役割。 アカウント所有者は、次のコマンドを実行することでユーザーにこの役割を付与できます。
ibmcloud iam user-policy-create EMAIL --service-name containers-kubernetes --roles "Administrator,Operator"
-
すべてのリージョンとリソース・グループにおける、IBM Cloud に対する IBM Cloud Container Registry IAM 管理者プラットフォーム・アクセス役割。 ポリシーのスコープを特定のリージョンまたはリソース・グループに設定することはできません。 アカウント所有者は、次のコマンドを実行することでユーザーにこの役割を付与できます。
秘密鍵が正しく作成されたことを確認する
ibmcloud iam user-policy-create <your_user_email> --service-name container-registry --roles Administrator
-
アカウントでサービス ID の作成を制限している場合は、**「ID およびアクセス管理」に対する「サービス ID 作成者」**の役割を追加します (コンソールの場合)(API または CLI の場合は
iam-identity
)。 -
アカウントで API キーの作成を制限している場合は、**「ID およびアクセス管理」に対する「ユーザー API キー作成者」**の役割を追加します (コンソールの場合)(API または CLI の場合は
iam-identity
)。
イメージ・プル・シークレットの更新
Kubernetes の default
名前空間にあるクラスターのイメージ・プル・シークレットを更新するには、以下のようにします。
-
クラスター ID を取得します。
ibmcloud ks cluster ls
-
クラスターのサービス ID を作成し、そのサービス ID に IBM Cloud Container Registry に対するリーダーの IAM サービス・アクセス役割を割り当てるために、以下のコマンドを実行します。 また、このコマンドは、サービス ID の資格情報を擬人化する API キーを作成し、クラスター内の Kubernetes イメージ・プル・シークレットに保管します。 このイメージ・プル・シークレットは、Kubernetes 名前空間
default
にあります。ibmcloud ks cluster pull-secret apply --cluster <cluster_name_or_ID>
このコマンドを実行すると、IAM 資格情報とイメージ・プル・シークレットの作成が開始されます。これが完了するまで、しばらく時間がかかる場合があります。 イメージ・プル・シークレットが作成されるまでは、IBM Cloud Container Registry
icr.io
ドメインからイメージをプルするコンテナーをデプロイできません。 -
クラスター内にイメージ・プル・シークレットが作成されていることを確認します。
kubectl get secrets | grep icr-io
出力例
all-icr-io kubernetes.io/dockerconfigjson 1 16d
-
ドメイン名からイメージをプルするようコンテナー・デプロイメント
icr.io
を更新します。 -
オプション: ファイアウォールがある場合は、使用するドメインでレジストリー・サブネットへのアウトバウンド・ネットワーク・トラフィックを許可してください。
-
以下のいずれかのオプションを使用して、セットアップを完了します。
default
以外の Kubernetes 名前空間にイメージをプルしたり、他の IBM Cloud アカウントからイメージをプルしたりする場合は、別のイメージ・プル・シークレットをコピーまたは作成します。- イメージ・プル・シークレットのアクセスを特定のレジストリー・リソース (名前空間やリージョンなど) に制限する場合は、以下のようにします。
外部プライベートレジストリ内の画像にアクセスするための秘密の画像プル機能を使用する
クラスター内の独自のイメージ・プル・シークレットのセットアップ内容に応じて、default
以外の Kubernetes 名前空間にコンテナーをデプロイしたり、他の IBM Cloud アカウントに保管されているイメージを使用したり、外部プライベート・レジストリーに保管されているイメージを使用したりできます。 さらに、独自のイメージ・プル・シークレットを作成して、特定のレジストリー・イメージ名前空間または操作 (push
や
pull
など) にアクセス権を制限する IAM アクセス・ポリシーを適用することも可能です。
イメージ・プル・シークレットを作成したら、コンテナーがそのシークレットを使用してレジストリーからイメージをプルすることを許可する必要があります。 イメージ・プル・シークレットを名前空間のサービス・アカウントに追加することも、各デプロイメントでシークレットを参照することもできます。 手順については、イメージ・プル・シークレットを使用したコンテナーのデプロイを参照してください。
イメージ・プル・シークレットは、それらが作成された対象の Kubernetes 名前空間に対してのみ有効です。 コンテナーをデプロイする名前空間ごとに、以下の手順を繰り返してください。 DockerHub からのイメージには、イメージ・プル・シークレットは必要ありません。
始める前に
- IBM Cloud Container Registry に名前空間をセットアップして、その名前空間にイメージをプッシュします。
- クラスターを作成します。
- アカウントにログインします。 該当する場合は、適切なリソース・グループをターゲットにします。 クラスターのコンテキストを設定します。
独自のイメージ・プル・シークレットを使用する方法としては、以下の選択肢があります。
- default の Kubernetes 名前空間からクラスター内の他の名前空間にイメージ・プル・シークレットをコピーする。
- 新しい IAM API キー資格情報を作成して、それらをイメージ・プル・シークレット内に保管することで、他の IBM Cloud アカウント内のイメージにアクセスしたり、特定のレジストリー・ドメインやレジストリー名前空間へのアクセスを制限する IAM ポリシーを適用したりする。
- 外部プライベート・レジストリーのイメージにアクセスするためのイメージ・プル・シークレットを作成する。
デプロイメントで使用する名前空間にイメージ・プル・シークレットを既に作成した場合は、作成済みの imagePullSecret
を使用したコンテナーのデプロイを参照してください。
既存のイメージ・プル・シークレットのコピー
イメージ・プル・シークレットをクラスター内の他の名前空間にコピーできます (default
Kubernetes 名前空間用に自動的に作成されたイメージ・プル・シークレットなど)。 例えば、特定の名前空間へのアクセスを制限するために、または他の IBM Cloud アカウントからイメージをプルするために、この名前空間で別の IBM Cloud IAM API キー資格情報を使用する必要がある場合は、代わりに、イメージ・プル・シークレットを作成します。
-
クラスター内に存在する Kubernetes 名前空間をリストするか、使用する名前空間を作成します。
kubectl get namespaces
出力例
default Active 79d ibm-cert-store Active 79d ibm-system Active 79d kube-public Active 79d kube-system Active 79d
名前空間を作成する
kubectl create namespace <namespace_name>
-
IBM Cloud Container Registry の Kubernetes 名前空間
default
にある既存のイメージ・プル・シークレットをリストします。kubectl get secrets -n default | grep icr-io
出力例
all-icr-io kubernetes.io/dockerconfigjson 1 16d
-
all-icr-io
イメージ・プル・シークレットをdefault
名前空間から任意の名前空間にコピーします。 新しいイメージ・プル・シークレットの名前は<namespace_name>-icr-<region>-io
です。kubectl get secret all-icr-io -n default -o yaml | sed 's/default/<new-namespace>/g' | kubectl create -n <new-namespace> -f -
-
シークレットが正常に作成されたことを確認します。
kubectl get secrets -n <namespace_name> | grep icr-io
-
コンテナーをデプロイするために、各デプロイメントにイメージ・プル・シークレットを追加します。または、名前空間のサービス・アカウントにイメージ・プル・シークレットを追加して、その名前空間のすべてのデプロイメントでレジストリーからイメージをプルできるようにします。
異なる IAM API キー資格情報を使用したイメージ・プル・シークレットの作成
IBM Cloud の IAM アクセス・ポリシーをユーザーまたはサービス ID に割り当てて、特定のレジストリー・イメージ名前空間または操作 (push
や pull
など) にアクセス権を制限できます。 次に、API キーを作成して、これらのレジストリー資格情報をクラスターのイメージ・プル・シークレットに保管します。
例えば、他の IBM Cloud アカウント内のイメージにアクセスするには、そのアカウント内のユーザーまたはサービス ID の IBM Cloud Container Registry 資格情報を保管する API キーを作成します。 次に、クラスターのアカウント内で、それぞれのクラスターとクラスター名前空間のイメージ・プル・シークレットにその API キー資格情報を保存します。
以下のステップでは、IBM Cloud の IAM サービス ID の資格情報を保管する API キーを作成します。 サービス ID を使用する代わりに、IBM Cloud に対する IBM Cloud Container Registry IAM サービス・アクセス・ポリシーを割り当てたユーザー ID の API キーを作成することもできます。 ただし、そのユーザー ID は部門 ID にしてください。あるいは、その特定のユーザーがいなくなってもクラスターがレジストリーにアクセスできるように計画しておいてください。
-
クラスター内に存在する Kubernetes 名前空間をリストするか、レジストリー・イメージからコンテナーをデプロイする場所として使用する名前空間を作成します。
kubectl get namespaces
出力例
default Active 79d ibm-cert-store Active 79d ibm-system Active 79d kube-public Active 79d kube-system Active 79d
名前空間を作成する
kubectl create namespace <namespace_name>
-
イメージ・プル・シークレットの IAM ポリシーと API キー資格情報のために使用するクラスターの IBM Cloud IAM サービス ID を作成します。 サービス ID には、後からサービス ID を特定できるように、必ず説明を付けておいてください。例えば、クラスター名と名前空間名の両方を記載してください。
ibmcloud iam service-id-create <cluster_name>-<namespace>-id --description "Service ID for IBM Cloud Container Registry in Kubernetes cluster <cluster_name> namespace <namespace>"
-
IBM Cloud へのアクセス権を与えるカスタム IBM Cloud Container Registry IAM ポリシーを、クラスター・サービス ID に対して作成します。
ibmcloud iam service-policy-create <cluster_service_ID> --roles <service_access_role> --service-name container-registry [--region <IAM_region>] [--resource-type namespace --resource <registry_namespace>]
cluster_service_ID
- 必須。 Kubernetes クラスター用に以前に作成した
<cluster_name>-<kube_namespace>-id
サービス ID に置き換えます。 --service-name container-registry
- 必須。
container-registry
を入力して、IAM ポリシーの対象を IBM Cloud Container Registry にします。 --roles <service_access_role>
- 必須。 サービス ID のアクセス権限の範囲にする IBM Cloud Container Registry に対するサービス・アクセス役割を入力します。 指定できる値は、
Reader
、Writer
、Manager
です。 --region <IAM_region>
- オプション。 アクセス・ポリシーの有効範囲を特定の IAM リージョンに制限する場合は、コンマ区切りリスト形式でリージョンを入力します。 指定可能な値は
global
およびローカル・レジストリーのリージョンです。 --resource-type namespace --resource <registry_namespace>
- オプション。 特定の IBM Cloud Container Registry 名前空間 内のイメージのみにアクセスを制限する場合は、リソース・タイプとして
namespace
を入力し、<registry_namespace>
を指定します。 レジストリーの名前空間をリストするには、ibmcloud cr namespaces
を実行します。
-
サービス ID の API キーを作成します。 APIキーにサービスIDと同様の名前を付け、以前に作成したサービスIDを含めます
<cluster_name>-<kube_namespace>-id
. 必ず、後でキーを思い出せるように説明を付けてください。ibmcloud iam service-api-key-create <cluster_name>-<namespace>-key <cluster_name>-<namespace>-id --description "API key for service ID <service_id> in Kubernetes cluster <cluster_name> namespace <namespace>"
-
前のコマンドの出力から API キーの値を取得します。
Please preserve the API key! It can't be retrieved after it's created. Name <cluster_name>-<kube_namespace>-key Description key_for_registry_for_serviceid_for_kubernetes_cluster_multizone_namespace_test Bound To crn:v1:bluemix:public:iam-identity::a/1bb222bb2b33333ddd3d3333ee4ee444::serviceid:ServiceId-ff55555f-5fff-6666-g6g6-777777h7h7hh Created At 2019-02-01T19:06+0000 API Key i-8i88ii8jjjj9jjj99kkkkkkkkk_k9-llllll11mmm1 Locked false UUID ApiKey-222nn2n2-o3o3-3o3o-4p44-oo444o44o4o4
-
クラスター名前空間に API キーの資格情報を保管するためのイメージ・プル・シークレットを作成します。 各クラスターの各名前空間で、イメージをプルする
icr.io
ドメインごとに、この手順を繰り返します。kubectl --namespace <namespace> create secret docker-registry <secret_name> --docker-server=<registry_URL> --docker-username=iamapikey --docker-password=<api_key_value> --docker-email=<docker_email>
--namespace <namespace>
- 必須。 サービス ID 名に使用したクラスターの Kubernetes 名前空間を指定します。
<secret_name>
- 必須。 イメージ・プル・シークレットの名前を入力します。
--docker-server <registry_URL>
- 必須。 レジストリーの名前空間がセットアップされているイメージ・レジストリーの URL を設定します。 使用可能なドメインについては、ローカルのリージョンを参照してください。
--docker-username iamapikey
- 必須。 プライベート・レジストリーにログインするためのユーザー名を入力します。 IBM Cloud Container Registry を使用する場合は、
iamapikey
を入力します。 --docker-password <token_value>
- 必須。 前に取得した
API Key
の値を入力します。 --docker-email <docker-email>
- 必須。 Docker E メール・アドレスがある場合は、その値を入力します。 ない場合は、
a@b.c
のような架空の E メール・アドレスを入力します。 この E メールは、Kubernetes シークレットの作成には必要ですが、作成後は使用されません。
-
シークレットが正常に作成されたことを確認します。
<namespace>
を、イメージ・プル・シークレットを作成したnamespace
に置き換えます。kubectl get secrets --namespace <namespace>
-
コンテナーをデプロイする際に、名前空間内の任意のポッドでそのイメージ・プル・シークレットを使用できるよう、イメージ・プル・シークレットを Kubernetes サービス・アカウントに追加します。
他のプライベート・レジストリー内に保管されているイメージへのアクセス
プライベート・レジストリーが既にある場合は、そのレジストリーの資格情報を Kubernetes イメージ・プル・シークレットに保管し、構成ファイルからそのシークレットを参照する必要があります。
始める前に
イメージ・プル・シークレットを作成するには、以下のようにします。
-
プライベート・レジストリーの資格情報を保管する Kubernetes シークレットを作成します。
kubectl --namespace <namespace> create secret docker-registry <secret_name> --docker-server=<registry_URL> --docker-username=<docker_username> --docker-password=<docker_password> --docker-email=<docker_email>
--namespace <namespace>
- 必須。 シークレットを使用してコンテナーをデプロイする、クラスターの Kubernetes 名前空間。 クラスター内に存在する名前空間をリストするには、
kubectl get namespaces
を実行します。 <secret_name>
- 必須。 イメージ・プル・シークレットに使用する名前。
--docker-server <registry_URL>
- 必須。 プライベート・イメージが保管されているレジストリーの URL。
--docker-username <docker_username>
- 必須。 プライベート・レジストリーにログインするためのユーザー名。
--docker-password <token_value>
- 必須。 プライベート・レジストリーにログインするためのパスワード (トークン値など)。
--docker-email <docker-email>
- 必須。 Docker E メール・アドレスがある場合は、その値を入力します。 ない場合は、
a@b.c
などの架空の E メール・アドレスを入力します。 この E メールは、Kubernetes シークレットの作成には必要ですが、作成後は使用されません。
-
シークレットが正常に作成されたことを確認します。
<namespace>
を、イメージ・プル・シークレットを作成した名前空間の名前で置き換えます。kubectl get secrets --namespace <namespace>
イメージ・プル・シークレットを使用したコンテナーのデプロイ
ポッド・デプロイメントでイメージ・プル・シークレットを定義するか、Kubernetes サービス・アカウントにイメージ・プル・シークレットを保管して、名前空間で Kubernetes サービス・アカウントを指定しないすべてのデプロイメントでそのイメージ・プル・シークレットを使用できるようにすることが可能です。
クラスターでイメージ・プル・シークレットを使用する方法を計画するときには、以下の選択肢があります。
- ポッド・デプロイメントでイメージ・プル・シークレットを参照する: このオプションは、名前空間内のすべてのポッドにデフォルトでレジストリーへのアクセス権限を付与するわけではない場合に使用します。 開発者は、レジストリーにアクセスする必要がある各ポッドのデプロイメントに、イメージ・プル・シークレットを含めることができます。
- Kubernetes サービス・アカウントにイメージ・プル・シークレットを保管する: 選択した Kubernetes 名前空間内のすべてのデプロイメントについて、レジストリー内のイメージへのアクセス権限を付与する場合は、このオプションを使用します。 Kubernetes サービス・アカウントにイメージ・プル・シークレットを保管するには、以下の手順を使用します。
選択した名前空間の Kubernetes サービス・アカウントにイメージ・プル・シークレットを保管する
すべての Kubernetes 名前空間に、default
という名前の Kubernetes サービス・アカウントがあります。 名前空間内で、イメージ・プル・シークレットをこのサービス・アカウントに追加すると、レジストリーからイメージをプルするためのアクセス権限をポッドに付与できます。 サービス・アカウントを指定しないデプロイメントでは、この Kubernetes 名前空間の default
サービス・アカウントが自動的に使用されます。
-
default サービス・アカウントにイメージ・プル・シークレットが既に存在しているかどうかを確認します。
kubectl describe serviceaccount default -n <namespace_name>
<none>
が イメージ・プル・シークレット エントリーに表示される場合、イメージ・プル・シークレットは存在しません。 -
イメージ・プル・シークレットを default サービス・アカウントに追加します。
-
イメージ・プル・シークレットが定義されていない場合に、イメージ・プル・シークレットを追加するコマンドの例。
kubectl patch -n <namespace_name> serviceaccount/default -p '{"imagePullSecrets":[{"name": "<image_pull_secret_name>"}]}'
-
イメージ・プル・シークレットが既に定義されている場合に、イメージ・プル・シークレットを追加するコマンドの例。
kubectl patch -n <namespace_name> serviceaccount/default --type='json' -p='[{"op":"add","path":"/imagePullSecrets/-","value":{"name":"<image_pull_secret_name>"}}]'
-
-
イメージ・プル・シークレットが default サービス・アカウントに追加されたことを確認します。
kubectl describe serviceaccount default -n <namespace_name>
出力例
Name: default Namespace: <namespace_name> Labels: <none> Annotations: <none> Image pull secrets: <image_pull_secret_name> Mountable secrets: default-token-sh2dx Tokens: default-token-sh2dx Events: <none>
イメージ・プル・シークレットで
<secret> (not found)
が示される場合は、kubectl get secrets -n namespace
を実行して、サービス・アカウントと同じ名前空間にイメージ・プル・シークレットが存在することを確認します。 -
レジストリー内の
mypod.yaml
イメージからコンテナーをデプロイするために、 という名前のポッド構成ファイルを作成します。apiVersion: v1 kind: Pod metadata: name: mypod spec: containers: - name: mypod-container image: <region>.icr.io/<namespace>/<image>:<tag>
-
mypod.yaml
構成ファイルを適用して、クラスターにポッドを作成します。kubectl apply -f mypod.yaml
使用権付きソフトウェアをプルするようにクラスターをセットアップする
使用権付きソフトウェアをプルするように IBM Cloud Kubernetes Service クラスターをセットアップできます。使用権付きソフトウェアとは、IBM から使用のライセンス交付を受けた、Helm チャート内でパッケージ化されている保護されたコンテナー・イメージの集合です。 使用権付きソフトウェアは、IBM Cloud Container Registry の cp.icr.io
という特別なドメインに保管されます。 このドメインにアクセスするには、クラスターの使用権キーを使用してイメージ・プル・シークレットを作成し、この使用権付きソフトウェアをデプロイする各名前空間の
Kubernetes サービス・アカウントにこのイメージ・プル・シークレットを追加する必要があります。
始める前に: アカウントにログインします。 該当する場合は、適切なリソース・グループをターゲットにします。 クラスターのコンテキストを設定します。
-
使用権付きソフトウェア・ライブラリーのための使用権キーを取得します。
- MyIBM.com にログインし、 コンテナソフトウェアライブラリセクションまでスクロールします。 **「ライブラリーの表示」**をクリックします。
- **「Access your container software」>「Entitlement keys」ページで、「キーのコピー」**をクリックします。 このキーは、コンテナー・ソフトウェア・ライブラリー内のすべての使用権付きソフトウェアへのアクセスを許可します。
-
使用権付きコンテナーをデプロイする名前空間でイメージ・プル・シークレットを作成して、使用権付きレジストリー
cp.icr.io
にアクセスできるようにします。 先ほど取得した使用権キーを--docker-password
の値として使用します。 詳しくは、他のプライベート・レジストリー内に保管されているイメージへのアクセスを参照してください。kubectl create secret docker-registry entitled-cp-icr-io --docker-server=cp.icr.io --docker-username=cp --docker-password=<entitlement_key> --docker-email=<docker_email> -n <namespace>
-
名前空間のサービス・アカウントにイメージ・プル・シークレットを追加して、その名前空間のすべてのコンテナーが使用権キーを使用して使用権付きイメージをプルできるようにします。 詳しくは、イメージ・プル・シークレットを使用したコンテナーのデプロイを参照してください。
kubectl patch -n <namespace> serviceaccount/default --type='json' -p='[{"op":"add","path":"/imagePullSecrets/-","value":{"name":"entitled-cp-icr-io"}}]'
-
使用権付きレジストリー内のイメージからコンテナーをビルドするポッドを名前空間内で作成します。
kubectl run <pod_name> --image=cp.icr.io/<image_name> -n <namespace> --generator=run-pod/v1
-
ポッドが**「実行中」**状況になっていることを検証することによって、使用権付きイメージからコンテナーが正常にビルドされたことを確認します。
kubectl get pod <pod_name> -n <namespace>
次に何をしますか? entitled Helm チャート・リポジトリーをセットアップできます。使用権付きソフトウェアを取り込んでいる Helm チャートはそこに保管されています。 クラスター内に Helm が既にインストールされている場合は、helm repo add entitled https://raw.githubusercontent.com/IBM/charts/master/repo/entitled
を実行します。
IBM Cloud Kubernetes Service containerd カスタム・レジストリー構成の更新
Kubernetes バージョン 1.22 以降では、ワーカー・ノード上で containerd 構成ファイルを使用して、コンテナー・レジストリーからのプルを構成できます。 daemonset を使用して、クラスター内のすべてのノードの構成を更新することができます。これにより、ワーカー・ノードの再ロード時や新規ワーカーの追加時に構成がワイプされなくなります。
containerd カスタム・レジストリー構成を更新する daemonset の例
YAML ファイルの例を使用して、すべてのワーカー・ノードで実行されるデーモン・セットを定義し、containerd レジストリー・ホスト構成を設定または更新し、対応する containerd レジストリー・パスにマウントします。
この例では、dockerhub の以下のレジストリー・ホスト構成を設定します。 このレジストリー・ホスト構成は既に提供されており、ワーカー・プロビジョニング・フェーズ中に自動的に構成されます。 init
コンテナは、デプロイ後、およびワーカーノードのリロードまたは再起動後に、すべてのワーカーノード上で hosts.toml
を初期化します。
server = "https://docker.io"
[host."https://registry-1.docker.io"]
capabilities = ["pull", "resolve"]
YAML ファイルの例:
apiVersion: apps/v1
kind: DaemonSet
metadata:
labels:
name: containerd-dockerhub-registry-config
name: containerd-dockerhub-registry-config
namespace: kube-system
spec:
selector:
matchLabels:
name: containerd-dockerhub-registry-config
template:
metadata:
labels:
name: containerd-dockerhub-registry-config
spec:
initContainers:
- image: alpine:3.13.6
name: containerd-dockerhub-registry-config
command:
- /bin/sh
- -c
- |
#!/bin/sh
set -uo pipefail
cat << EOF > /etc/containerd/certs.d/docker.io/hosts.toml
server = "https://docker.io"
[host."https://registry-1.docker.io"]
capabilities = ["pull", "resolve"]
EOF
volumeMounts:
- mountPath: /etc/containerd/certs.d/docker.io/
name: dockerhub-registry-config
containers:
- name: pause
image: "us.icr.io/armada-master/pause:3.5"
imagePullPolicy: IfNotPresent
volumes:
- name: dockerhub-registry-config
hostPath:
path: /etc/containerd/certs.d/docker.io/
containerd レジストリー・ホスト構成の更新について詳しくは、 containerd の資料を参照してください。