Kubernetesに別のプロジェクトのGoogleContainerRegistryから画像をダウンロードさせようとしています。 docs によると、次を使用してイメージプルシークレットを作成する必要があります。
$ kubectl create secret docker-registry myregistrykey --docker-server=DOCKER_REGISTRY_SERVER --docker-username=DOCKER_USER --docker-password=DOCKER_PASSWORD --docker-email=DOCKER_EMAIL
しかし、私は何がDOCKER_USER
およびDOCKER_PASSWORD
Google Container Registryでの認証に使用する必要がありますか? GCR docs を見ると、パスワードは次のコマンドを実行して取得できるアクセストークンであることがわかります。
$ gcloud auth print-access-token
これは実際に機能します...しばらくの間。問題は、このアクセストークンが(私が信じている)1時間後に期限切れになることのようです。イメージプルシークレットを作成するときに有効期限が切れないパスワード(または何か)が必要です。そうしないと、Kubernetesクラスターは1時間ほど後に新しいイメージをダウンロードできません。これを行う正しい方法は何ですか?
これは本当にトリッキーですが、多くのトレイルとエラーの後、私はそれが機能していると思います。
~/secret.json
_の下に保存されていると想定します)コマンドラインからDockerを使用してGCRにログインします。
$ docker login -e [email protected] -u _json_key -p "$(cat ~/secret.json)" https://eu.gcr.io
これにより、_~/.docker/config.json
_ファイルに " https://eu.gcr.io "のエントリが生成されます。
「 https://eu.gcr.io 」の下のJSON構造を「〜/ docker-config.json」という名前の新しいファイルにコピーし、改行を削除します。例えば:
_{"https://eu.gcr.io": { "auth": "<key>","email": "[email protected]"}}
_
Base64はこのファイルをエンコードします:
_$ cat ~/docker-config.json | base64
_
これにより、base64でエンコードされた長い文字列が出力され、この文字列がコピーされて、イメージプルシークレット定義(_~/pullsecret.yaml
_と呼ばれる)に貼り付けられます。
_apiVersion: v1 kind: Secret metadata: name: mykey data: .dockercfg: <paste base64 encoded string here> type: kubernetes.io/dockercfg
_
次に、秘密を作成します。
_$ kubectl create -f ~/pullsecret.yaml
_
_apiVersion: v1 kind: Pod metadata: name: foo namespace: awesomeapps spec: containers: - image: "janedoe/awesomeapp:v1" name: foo imagePullSecrets: - name: mykey
_
または、 サービスアカウント に追加します。
Kubectlを使用するとはるかに簡単です
kubectl create secret docker-registry mydockercfg \
--docker-server "https://eu.gcr.io" \
--docker-username _json_key \
--docker-email [email protected] \
--docker-password=$(cat your_service_account.json)
Googleからyour_service_account.jsonをダウンロードした後の重要な詳細の1つは、jsonのすべての行を1つの行に結合することです。 Forこれは、cat
をpaste
に置き換えることができます。
--docker-password=$(paste -s your_service_account.json)
クラスタが実行するサービスアカウントに、GCSバケットへのアクセスを許可することもできます。
eu.artifacts.{project-id}.appspot.com
This 回答には、それを実現するためのgsutil
コマンドがいくつかあります。
この回答により、Kubernetesシークレットに含まれるDocker資格情報のセットが1つだけになり、改行のトリミングが処理されます。
ヨハンの素晴らしい答えから同じ最初の3つのステップに従ってください:
Google DeveloperConsole>「ApiManager」>「認証情報」に移動し、「認証情報の作成」をクリックして「サービスアカウントキー」を作成します
[サービスアカウント]で[新規]を選択し、新しいキーに「gcr」という名前を付けます(キータイプをjsonにします)
キーを作成し、ファイルをディスクに保存します(これ以降、ファイルは~/secret.json
の下に保存されていると想定します)
次に、次のコマンドを実行して、必要なDocker資格情報を生成し、クラスターに挿入します。
export GCR_KEY_JSON=$(cat ~/secret.json | tr -d '\n')
mv ~/.docker/config.json ~/.docker/config-orig.json
cat >~/.docker/config.json <<EOL
{
"auths": {
"gcr.io": {}
}
}
EOL
docker login --username _json_key --password "$GCR_KEY_JSON" https://gcr.io
export DOCKER_CONFIG_JSON_NO_NEWLINES=$(cat ~/.docker/config.json | tr -d '\n')
mv ~/.docker/config-orig.json ~/.docker/config.json
cat >secrets.yaml <<EOL
apiVersion: v1
kind: Secret
metadata:
name: gcr-key
data:
.dockerconfigjson: $(echo -n ${DOCKER_CONFIG_JSON_NO_NEWLINES} | base64 | tr -d '\n')
type: kubernetes.io/dockerconfigjson
EOL
kubectl create -f secrets.yaml
GCRから画像をプルするポッドを指定する場合は、spec
セクションにgcr-key
シークレット名を含めます。
spec:
imagePullSecrets:
- name: gcr-key
containers:
- image: ...
イメージプルシークレットは必要ありません。IAM構成で実行できます
他の答えを試しましたが、Image PullSecretアプローチを機能させることができません。
ただし、これは、KubernetesクラスターがあるプロジェクトのCompute Engineのデフォルトサービスアカウントへのアクセスを許可することで実行できることがわかりました。このサービスアカウントは、GCPによって自動的に作成されました。
ここで説明されているように: https://cloud.google.com/container-registry/docs/access-control#granting_users_and_other_projects_access_to_a_registry
コンテナレジストリにサービスを提供するCloudStorageバケットへのアクセスを許可するには、次のコマンドを実行する必要があります
gsutil iam ch serviceAccount:[EMAIL-ADDRESS]:objectViewer gs://[BUCKET_NAME]
BUCKET_NAME:
artifacts.[PROJECT-ID].appspot.com for images pushed to gcr.io/[PROJECT-ID], or
[REGION].artifacts.[PROJECT-ID].appspot.com, where [REGION] is:
us for registry us.gcr.io
eu for registry eu.gcr.io
asia for registry asia.gcr.io
メールアドレス:
The email address of the service account called: **Compute Engine default service account** in the GCP project where the Kubernetes cluster run
公式の方法 から、次のことができます。
_$ docker login -e [email protected] -u _json_key -p "$JSON_KEY" https://gcr.io
_
注:電子メールは使用されないため、好きなものを入れることができます。
_gcr.io
_を Google Container Registry に表示されているドメインに変更します(例:_eu.gcr.io
_)。
それを取得するには_$JSON_KEY
_:
Docker Registry (read-only)
など、必要なものkeyfile.json
_としてダウンロードJSON_KEY=$(cat keyfile.json | tr '\n' ' ')
ログインすると、_docker pull
_を実行できます。更新された_~/.dockercfg
_をコピーして、設定を保持することもできます。