我正在 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.
这意味着在相同的集群边界。
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?还是集群角色?还是有其他方法可以实现这一目标?
感谢任何帮助
答案 0 :(得分: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}"
Checkout the pull secrets here 对于 Tekton,我不确定,但基本上你需要: