Openshift:来自不同集群的 CI/CD 访问镜像流

时间:2021-03-03 13:28:25

标签: kubernetes openshift tekton openshift-pipelines

我正在 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

在阶段我所做的是流水线中的一个任务来执行 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"

我在 Dev 和 Stage 中有一个 serviceAccount sa,它只有 github-secret。

根据一些例子,如 OpenShift documentation 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 previous post

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 个答案:

答案 0 :(得分:0)

您需要一个在您拥有图像流的命名空间中具有 system:image-puller 角色的服务帐户,然后从该服务帐户获取令牌并将此令牌用作来自其他集群的 pull secret

我建议在你的拉取集群中创建一个镜像 ImageStream 来管理链接。

schema

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}"

Checkout the pull secrets here 对于 Tekton,我不确定,但基本上你需要:

  • 从外部存储库中提取秘密
  • 使用 image-puller 进行本地拉取的服务帐户(生成本地镜像图像流,让您的生活更轻松)