Создание секретности изображения для реестра контейнера 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
-
Теперь создайте секрет:
$ 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
или добавьте его в учетную запись службы.
Ответ 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