web-dev-qa-db-ja.com

有効期限が切れていないGoogleコンテナレジストリのイメージプルシークレットを作成していますか?

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時間ほど後に新しいイメージをダウンロードできません。これを行う正しい方法は何ですか?

16
Johan

これは本当にトリッキーですが、多くのトレイルとエラーの後、私はそれが機能していると思います。

  1. Google DeveloperConsole>「ApiManager」>「認証情報」に移動し、「認証情報の作成」をクリックして「サービスアカウントキー」を作成します
  2. [サービスアカウント]で[新規]を選択し、新しいキーに「gcr」という名前を付けます(キータイプをjsonにします)
  3. キーを作成し、ファイルをディスクに保存します(これ以降、ファイルは_~/secret.json_の下に保存されていると想定します)
  4. コマンドラインから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 "のエントリが生成されます。

  5. https://eu.gcr.io 」の下のJSON構造を「〜/ docker-config.json」という名前の新しいファイルにコピーし、改行を削除します。例えば:

    _{"https://eu.gcr.io": { "auth": "<key>","email": "[email protected]"}}_

  6. Base64はこのファイルをエンコードします:

    _$ cat ~/docker-config.json | base64_

  7. これにより、base64でエンコードされた長い文字列が出力され、この文字列がコピーされて、イメージプルシークレット定義(_~/pullsecret.yaml_と呼ばれる)に貼り付けられます。

_apiVersion: v1
  kind: Secret
  metadata:
    name: mykey
  data:
    .dockercfg: <paste base64 encoded string here>
  type: kubernetes.io/dockercfg
_
  1. 次に、秘密を作成します。

    _$ kubectl create -f ~/pullsecret.yaml_

  2. これで、ポッドからこのプルシークレットを使用できます。次に例を示します。
_apiVersion: v1
kind: Pod
metadata: 
  name: foo
  namespace: awesomeapps
spec: 
  containers: 
    - image: "janedoe/awesomeapp:v1"
      name: foo
  imagePullSecrets: 
    - name: mykey
_

または、 サービスアカウント に追加します。

16
Johan

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これは、catpasteに置き換えることができます。

  --docker-password=$(paste -s your_service_account.json)
9
Gramic

クラスタが実行するサービスアカウントに、GCSバケットへのアクセスを許可することもできます。

  eu.artifacts.{project-id}.appspot.com

This 回答には、それを実現するためのgsutilコマンドがいくつかあります。

2
mattmoor

この回答により、Kubernetesシークレットに含まれるDocker資格情報のセットが1つだけになり、改行のトリミングが処理されます。

ヨハンの素晴らしい答えから同じ最初の3つのステップに従ってください:

  1. Google DeveloperConsole>「ApiManager」>「認証情報」に移動し、「認証情報の作成」をクリックして「サービスアカウントキー」を作成します

  2. [サービスアカウント]で[新規]を選択し、新しいキーに「gcr」という名前を付けます(キータイプをjsonにします)

  3. キーを作成し、ファイルをディスクに保存します(これ以降、ファイルは~/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: ...
2
Rich Kuzsma

イメージプルシークレットは必要ありません。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
1
Pusker György

公式の方法 から、次のことができます。

_$ docker login -e [email protected] -u _json_key -p "$JSON_KEY" https://gcr.io
_

注:電子メールは使用されないため、好きなものを入れることができます。

_gcr.io_を Google Container Registry に表示されているドメインに変更します(例:_eu.gcr.io_)。

それを取得するには_$JSON_KEY_:

  1. APIマネージャー>資格情報 に移動します
  2. [認証情報の作成]をクリック>サービスアカウントキー
    • サービスアカウント:新しいサービスアカウント
      • 名前:Docker Registry (read-only)など、必要なもの
      • 役割:ストレージ(下にスクロール)>ストレージオブジェクトビューアー
    • キータイプ:[〜#〜] json [〜#〜]
  3. _keyfile.json_としてダウンロード
  4. JSON_KEY=$(cat keyfile.json | tr '\n' ' ')
  5. 今、あなたはそれを使うことができます。

ログインすると、_docker pull_を実行できます。更新された_~/.dockercfg_をコピーして、設定を保持することもできます。

1
Wernight