Openshift: CI/CD доступ к потоку изображений из разных кластеров
Я настраиваю CI / CD в OpenShift: Dev> Stage> Prod, и я столкнулся с некоторыми проблемами в Stage, чтобы добраться до Dev ImageStream. Вся установка выглядит так:
Dev - запускает конвейер Tekton и в последней задаче триггеры BuildConfig> Build выводит новое изображение в ImageStream> ImageStream новый тег запускает DeploymentConfig> Deployment.
Stage - я хотел бы получить доступ к тегу в ImageStream в Dev, чтобы я мог создавать и развертывать приложение в Stage.
Я использую внутренний реестр OpenShift
image-registry.openshift-image-registry.svc:port
На этапе, что я сделал, это одна задача в конвейере, которую нужно выполнить
image-pull
команда:
oc import-image image-registry.openshift-image-registry.svc:port/namespace/name:version --confirm
но я получаю следующую ошибку:
Error from server (Forbidden): imagestreams.image.openshift.io "name" is forbidden:
User "system:serviceaccount:namespace:sa" cannot get resource "imagestreams" in API group "image.openshift.io" in the namespace "namespace"
У меня есть сервисный счет
sa
в Dev и Stage то же самое, что только github-secret.
Согласно некоторым примерам, таким как документация OpenShift, привязки ролей кластера :
$ oc adm policy add-cluster-role-to-user <role> <username>
Binds a given role to specified users for all projects in the cluster.
Это означает в пределах одного кластера.
и предыдущая запись stackoverflow :
oc policy add-role-to-user \
system:image-puller system:serviceaccount:testing2:default \
--namespace=testing1
Your project testing2 will be able to access images from project testing1 in your openshift.
Это означает между проектами (хорошо), но в одном кластере (мне нужен другой кластер)
есть ли способ установить привязку ролей, чтобы иметь возможность обращаться к ImageStream из другого кластера ? Или роль кластера? Или это другой способ добиться этого?
Любая помощь приветствуется
1 ответ
Вам нужен сервисный аккаунт с
system:image-puller
роль в пространстве имен у вас есть поток изображений, затем получите токен из этой учетной записи службы и используйте этот токен в качестве
pull secret
из вашего другого кластера.
Я бы рекомендовал создать зеркало ImageStream в вашем тянущем кластере для управления ссылкой.
CLUSTER_TARGET=cluster-b
CLUSTER_PULLING=cluster-a
C_B_NAMESPACE=Y
C_B_SERVICEACCOUNT_FOR_PULL=${CLUSTER_PULLING}-sa
C_B_REGISTRY=image-registry.cluster-b.com:5000
IMAGE_ID=image:tag
# in oc command for Cluster B
oc create sa $C_B_SERVICEACCOUNT_FOR_PULL -n $C_B_NAMESPACE
oc policy add-role-to-user system:image-puller system:serviceaccount:$C_B_SERVICEACCOUNT_FOR_PULL -n $C_B_NAMESPACE
SA_TOKEN=$(oc sa get-token $C_B_SERVICEACCOUNT_FOR_PULL -n $C_B_NAMESPACE)
# in oc command for Cluster A
C_A_NAMESPACE=X
SECRET="{\"auths\":{\"$C_B_REGISTRY\":{\"auth\":\"$(base64 $SA_TOKEN)\",\"email\":\"you@example.com\"}}"
oc create secret generic ${CLUSTER_TARGET}-pullsecret \
--from-literal=.dockerconfigjson=$SECRET \
--type=kubernetes.io/dockerconfigjson -n $C_A_NAMESPACE
oc secrets link default ${CLUSTER_TARGET}-pullsecret --for=pull -n $C_A_NAMESPACE
oc tag $C_B_REGISTRY/${C_B_NAMESPACE}/${IMAGE_ID} ${C_A_NAMESPACE}/${IMAGE_ID} --scheduled -n $C_A_NAMESPACE
# now you have a scheduled pull between A and B to your local ImageStream.
#If you want to use from another namespace in Cluster A:
oc create namespace Z
oc policy add-role-to-user system:image-puller system:serviceaccount:Z:default -n $C_A_NAMESPACE
echo "now pods in Z can reference image-registry.openshift-image-registry.svc/${C_A_NAMESPACE}/${IMAGE_ID}"
Ознакомьтесь с секретами извлечения здесь. Для Tekton я не уверен, но в основном вам понадобятся:
- вытащить секрет, чтобы извлечь из внешнего репо
- сервисная учетная запись с Image-Puller для локального извлечения (используйте локальный поток зеркального изображения, чтобы облегчить вашу жизнь)