0

我在 OpenShift 中配置 CI/CD:Dev > Stage > Prod,我在 Stage 中遇到了一些问题,以达到 Dev ImageStream。整个设置如下所示:

Dev - 运行 Tekton 管道并在最后一个任务上触发 BuildConfig > Build 将新图像输出到 ImageStream > ImageStream 新标签触发 DeploymentConfig > 部署发生

Stage - 我想在 Dev 的 ImageStream 中找到标签,这样我就可以在 Stage 中构建和部署应用程序。

我正在使用 OpenShift 内部注册表image-registry.openshift-image-registry.svc:port

在 Stage 中,我所做的是在 Pipeline 中执行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 中有一个 serviceAccount,它只有 github-secret。

根据OpenShift 文档 Cluster-role bindings等一些示例:

$ 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 ?还是集群角色?或者是其他方式来实现这一目标?

任何帮助表示赞赏

4

1 回答 1

0

您需要一个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 的服务帐户在本地拉取 (hense 本地镜像镜像流,让您的生活更轻松)
于 2021-06-24T10:48:37.097 回答