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 для локального извлечения (используйте локальный поток зеркального изображения, чтобы облегчить вашу жизнь)
Другие вопросы по тегам