Создание секретности изображения для реестра контейнера google, который не истекает?

Я пытаюсь заставить Kubernetes загружать изображения из реестра Google Container из другого проекта. В соответствии с 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, он говорит, что пароль - это токен доступа, который вы можете получить, выполнив:

$ gcloud auth print-access-token

Это действительно работает... на некоторое время. Кажется, проблема заключается в том, что этот токен доступа истекает после (как я полагаю) одного часа. Мне нужен пароль (или что-то еще), который не истекает при создании моего скрытия изображения. В противном случае кластер Kubernetes не может загружать новые изображения через час или около того. Каков правильный способ сделать это?

Ответ 1

Это действительно сложно, но после многих ошибок и ошибок я думаю, что у меня это работает.

  • Перейдите в консоль разработчика Google > Api Manager > Credentials и нажмите "Создать учетные данные" и создайте "ключ учетной записи службы"
  • В разделе "учетная запись службы" выберите новый и назовите новый ключ "gcr" (пусть тип ключа будет json)
  • Создайте ключ и сохраните файл на диске (здесь мы предполагаем, что он был сохранен в ~/secret.json)
  • Теперь войдите в GCR с помощью Docker из командной строки:

    $ docker login -e [email protected] -u _json_key -p "$(cat ~/secret.json)" https://eu.gcr.io

    Это приведет к созданию записи https://eu.gcr.io в файле ~/.docker/config.json.

  • Скопируйте структуру JSON под " https://eu.gcr.io" в новый файл с именем ~ ~/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
  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

или добавьте его в учетную запись службы.

Ответ 2

Это намного проще с 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)

Одна важная деталь после загрузки your_service_account.json из google - это объединение всех строк в json в один ряд. Для этого вы можете заменить cat paste:

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

Ответ 3

Вы также можете предоставить учетную запись службы, которую выполняет ваш кластер, в качестве доступа к ведро GCS:

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

Этот ответ содержит несколько команд gsutil, чтобы это произошло.

Ответ 4

Этот ответ гарантирует, что в ваш секрет Kubernetes будет включен только один набор учетных записей докеров, а также будет обрабатывать новые строки для вас.

Следуйте тем же первым трем шагам от Йохана:

  • Перейдите в Google Developer Console > Api Manager > Credentials и нажмите "Создать учетные данные" и создайте "ключ учетной записи службы"

  • В разделе "учетная запись службы" выберите новый и назовите новый ключ "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 -e [email protected] -u _json_key -p "$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

Когда вы указываете Pods, которые извлекают изображения из GCR, укажите секретное имя gcr-key в разделе spec:

spec:
  imagePullSecrets:
    - name: gcr-key
  containers:
  - image: ...

Ответ 5

Из официальных способов вы можете:

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

Примечание. Электронная почта не используется, поэтому вы можете поместить в нее все, что хотите.

Измените gcr.io на все, что указано в вашем домене Google Container Registry (например, eu.gcr.io).

Чтобы получить этот $JSON_KEY:

  • Перейдите в Менеджер API > Учетные данные
  • Нажмите "Создать учетные данные" > Ключ учетной записи службы:
    • Учетная запись службы: новая учетная запись службы
      • Название: Все, что вы хотите, например Docker Registry (read-only)
      • Роль: хранилище (прокрутка вниз) > Объект просмотра объектов хранения
    • Тип ключа: JSON
  • Загрузить как keyfile.json
  • JSON_KEY=$(cat keyfile.json | tr '\n' ' ')
  • Теперь вы можете использовать его.

После входа в систему вы можете просто запустить docker pull. Вы также можете скопировать обновленный ~/.dockercfg, чтобы сохранить настройки.

Ответ 6

Нет необходимости в скрытии изображения, это может быть сделано с помощью конфигурации IAM

Я попробовал другие ответы, но я не могу заставить работать подход Image Pull Secret.

Однако я обнаружил, что это можно сделать, предоставив доступ к учетной записи службы Compute Engine по умолчанию в проекте, где находится кластер Kubernetes. Эта учетная запись службы была создана автоматически с помощью GCP.

Как описано здесь: https://cloud.google.com/container-registry/docs/access-control#granting_users_and_other_projects_access_to_a_registry

Вам необходимо выполнить следующую команду, чтобы предоставить доступ к ведро Cloud Storage, обслуживающему реестр контейнеров

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

EMAIL-ADDRESS:

The email address of the service account called: **Compute Engine default service account** in the GCP project where the Kubernetes cluster run