イメージをプライベートレジストリから取得する

このページでは、Secretを用いるPodを作成するためにイメージをプライベートコンテナイメージレジストリもしくはリポジトリから取得する方法について説明します。 多くのプライベートレジストリが存在しますが、このタスクではDocker Hubをレジストリの一例として使用します。

始める前に

  • Kubernetesクラスターが必要、かつそのクラスターと通信するためにkubectlコマンドラインツールが設定されている必要があります。 このチュートリアルは、コントロールプレーンのホストとして動作していない少なくとも2つのノードを持つクラスターで実行することをおすすめします。 まだクラスターがない場合、minikubeを使って作成するか、 以下のいずれかのKubernetesプレイグラウンドも使用できます:

  • この演習を行うためには、dockerコマンドラインツールと自身のDocker IDが必要です。

  • 別のプライベートコンテナレジストリを使用している場合は、そのレジストリのコマンドラインツールとログイン情報が必要です。

Docker Hubにログインする

ラップトップ(ローカル環境)上では、プライベートイメージを取得するためにレジストリに認証する必要があります。

dockerツールを使用してDocker Hubにログインしてください。詳細はDocker IDアカウントSign in セクションを参照してください。

docker login

プロンプトが表示されたら、Docker IDと使用したい認証情報(アクセストークンまたはDocker IDのパスワード)を入力してください。

ログインプロセスは、認証トークンを保持するconfig.jsonファイルを作成または更新します。Kubernetesがこのファイルを解釈する方法を確認してください。

以下のようにconfig.jsonファイルを確認します:

cat ~/.docker/config.json

出力には以下のような部分が含まれています:

{
    "auths": {
        "https://index.docker.io/v1/": {
            "auth": "c3R...zE2"
        }
    }
}

既存の認証情報を用いるSecretを作成する

Kubernetesクラスターはプライベートイメージを取得するためのレジストリとの認証にkubernetes.io/dockerconfigjsonタイプのSecretを使用します。

既にdocker loginを実行済みの場合、その認証情報をKubernetesにコピーできます:

kubectl create secret generic regcred \
    --from-file=.dockerconfigjson=<path/to/.docker/config.json> \
    --type=kubernetes.io/dockerconfigjson

新しいSecretをカスタマイズする必要がある場合(例えば、新しいSecretにNamespaceやLabelを設定する場合)は、保存する前にSecretをカスタマイズできます。 必ず以下を行ってください:

  • data項目の名前を.dockerconfigjsonに設定する
  • Dockerの設定ファイルをbase64エンコードし、その文字列を分割せずにdata[".dockerconfigjson"]の値として貼り付ける
  • typekubernetes.io/dockerconfigjsonに設定する

Secretをカスタマイズする場合のマニフェストの例:

apiVersion: v1
kind: Secret
metadata:
  name: myregistrykey
  namespace: awesomeapps
data:
  .dockerconfigjson: UmVhbGx5IHJlYWxseSByZWVlZWVlZWVlZWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGx5eXl5eXl5eXl5eXl5eXl5eXl5eSBsbGxsbGxsbGxsbGxsbG9vb29vb29vb29vb29vb29vb29vb29vb29vb25ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubmdnZ2dnZ2dnZ2dnZ2dnZ2dnZ2cgYXV0aCBrZXlzCg==
type: kubernetes.io/dockerconfigjson

error: no objects passed to createをエラーメッセージとして受け取った場合、base64エンコードされた文字列が無効である可能性があります。 Secret "myregistrykey" is invalid: data[.dockerconfigjson]: invalid value ...をエラーメッセージとして受け取った場合は、data内のbase64エンコードされた文字列は正常にデコードされたものの、.docker/config.jsonファイルとして読み込むことができなかったことを意味します。

コマンドライン上で認証情報を入力してSecretを作成する

このSecretをregcredという名前で作成します:

kubectl create secret docker-registry regcred --docker-server=<your-registry-server> --docker-username=<your-name> --docker-password=<your-pword> --docker-email=<your-email>

ここでは:

  • <your-registry-server>は、プライベートDockerレジストリのFQDN(完全修飾ドメイン名)です。 Docker Hubを使用する場合は、https://index.docker.io/v1/を設定して下さい。
  • <your-name>は、Dockerのユーザー名です。
  • <your-pword>は、Dockerのパスワードです。
  • <your-email>は、Dockerのメールアドレスです。

Dockerレジストリの認証情報がSecretとしてregcredという名前でクラスターに正常に設定されました。

regcredSecretを確認する

作成したregcredSecretの内容を理解するために、まずYAML形式でSecretを表示します:

kubectl get secret regcred --output=yaml

出力は以下のようになります:

apiVersion: v1
kind: Secret
metadata:
  ...
  name: regcred
  ...
data:
  .dockerconfigjson: eyJodHRwczovL2luZGV4L ... J0QUl6RTIifX0=
type: kubernetes.io/dockerconfigjson

.dockerconfigjsonフィールドの値は、Docker認証情報をbase64でエンコードしたものです。

.dockerconfigjsonフィールドの内容を理解するために、認証情報のデータを読解可能な形式に変換します:

kubectl get secret regcred --output="jsonpath={.data.\.dockerconfigjson}" | base64 --decode

出力は以下のようになります:

{"auths":{"your.private.registry.example.com":{"username":"janedoe","password":"xxxxxxxxxxx","email":"jdoe@example.com","auth":"c3R...zE2"}}}

authフィールドの内容を理解するために、base64エンコードされたデータを読解可能な形式に変換します:

echo "c3R...zE2" | base64 --decode

出力はユーザー名とパスワードが:で連結された以下のような形式になります:

janedoe:xxxxxxxxxxx

Secretのdataには、ローカルの~/.docker/config.jsonファイルと同様の認証トークンが含まれていることが分かります。

クラスターにregcredという名前のSecretとしてDockerの認証情報が正常に設定されました。

作成したSecretを利用するPodを作成する

以下はregcredという名前のDockerの認証情報へのアクセスが必要なPodのマニフェストの例です:

apiVersion: v1
kind: Pod
metadata:
  name: private-reg
spec:
  containers:
  - name: private-reg-container
    image: <your-private-image>
  imagePullSecrets:
  - name: regcred

上記のファイルをあなたのコンピューターにダウンロードします:

curl -L -o my-private-reg-pod.yaml https://k8s.io/examples/pods/private-reg-pod.yaml

my-private-reg-pod.yamlファイル内の<your-private-image>を、以下のようなプライベートレジストリのイメージのパスに置き換えてください:

your.private.registry.example.com/janedoe/jdoe-private:v1

プライベートレジストリからイメージを取得するために、Kubernetesは認証情報を必要とします。 設定ファイル内のimagePullSecretsフィールドは、Kubernetesがregcredという名前のSecretから認証情報を取得することを指定します。

以下のようにして作成したSecretを使用するPodを作成し、Podが実行されていることを確認します:

kubectl apply -f my-private-reg-pod.yaml
kubectl get pod private-reg

また、PodのステータスがImagePullBackOffになり起動に失敗した場合は、Podのイベントを確認してください:

kubectl describe pod private-reg

もしFailedToRetrieveImagePullSecretという理由を持つイベントが表示された場合は、Kubernetesが指定された名前のSecret(この例ではregcred)を見つけることができないことを示します。

指定したSecretが存在し、その名前が正しく記載されていることを確認してください。

Events:
  ...  Reason                           ...  Message
       ------                                -------
  ...  FailedToRetrieveImagePullSecret  ...  Unable to retrieve some image pull secrets (<regcred>); attempting to pull the image may not succeed.

複数のレジストリ上のイメージを利用する

1つのPodは複数のコンテナを持つことができ、各コンテナのイメージは異なるレジストリから取得できます。 1つのPodで複数のimagePullSecretsを使用でき、それぞれに複数の認証情報を含めることができます。

レジストリに一致する各認証情報を使用してイメージの取得が試行されます。 レジストリに一致する認証情報がない場合、認証なしで、またはカスタムランタイム固有の設定を使用してイメージの取得が試行されます。

次の項目

このページの項目は、Kubernetesが必要とする機能を提供するサードパーティー製品またはプロジェクトです。Kubernetesプロジェクトの作者は、それらのサードパーティー製品またはプロジェクトに責任を負いません。詳しくは、CNCFウェブサイトのガイドラインをご覧ください。第三者のリンクを追加するような変更を提案する前に、コンテンツガイドを読むべきです。