我们正在为RBAC使用ServiceAccounts,因此正在使用多个SA,以使我们能够通过RoleBindings适当地调整访问。
我们还使用了私有注册表,因此有imagePullSecrets可用于从私有注册表中提取图像。我正在尝试提出一种解决方案,默认情况下,在命名空间中创建的所有SA都会将应用到默认SA的imagePullSecrets列表添加到它们中,以便在我们使用服务部署Pod时(通常是正确的SA之后),已经将serviceAccount配置为使用imagePullSecrets来检索图像。
有没有人设计出一种优雅的方式来解决这个问题?我确实检查了Pod是否可以应用多个serviceAccount-N用于保存imageSecrets,1用于映射到RBAC。和/或,有人可以建议其他方法来解决问题吗?
[更新:澄清-挑战在于在多个服务帐户之间共享imagePullSecrets集,最好无需明确地将它们添加到每个ServiceAccount定义中。应将私有注册表视为类似于dockerhub:访问注册表的用户通常旨在进行拉取,然后使用用户信息来跟踪谁在拉取图像,并偶尔阻止用户拉起不应访问的图像因为“这东西不适合更广泛的消费”。]
答案 0 :(得分:1)
您可以通过三个步骤进行操作:
创建秘密
kubectl create secret docker-registry myregistrykey --docker-server=DOCKER_REGISTRY_SERVER --docker-username=DOCKER_USER --docker-password=DOCKER_PASSWORD --docker-email=DOCKER_EMAIL
创建服务帐户(在此处绑定机密)
apiVersion: v1
kind: ServiceAccount
metadata:
name: chicken
imagePullSecrets:
- name: myregistrykey
创建绑定(在此处绑定serviceAccount和Role)
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: example-rolebinding
namespace: mynamespace
subjects:
- kind: ServiceAccount
name: chicken
namespace: mynamespace
roleRef:
kind: Role
name: example-role
apiGroup: rbac.authorization.k8s.io
答案 1 :(得分:1)
记录似乎对我们有用的分辨率:
将imagePullSecrets列表的文本存储在变量中,然后在我们的ServiceAccounts模板中使用该变量。如果没有私有注册表,则该变量为空字符串。如果有私人注册表,则该变量包含
imagePullSecrets:
- name: secret1
- name: secret2
(等) 我们正在Ansible环境中工作,因此能够利用Jinja模板,但是我认为该方法通常适用。
答案 2 :(得分:0)
AFAIK。您唯一可以做的就是将不同的ImagePullSecret
与不同的名称空间相关联,然后将用户的访问权限限制为仅该名称空间。这样,这些用户就可以使用这些机密来创建Deployments / DaemonSets / StateFulSets / Pods。
但是然后您可能会遇到名称空间过多的问题。
答案 3 :(得分:0)
要轻松将imagePullSecrets添加到serviceAccount,您可以使用 补丁命令:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class ColorChange : MonoBehaviour { public Color[]colors; // allows input of material colors in a set sized array public SpriteRenderer rend; // what are we rendering? the hex private int index = 1; //initialize at 1, otherwise you have to press the ball twice to change color // Use this for initialization void Start () { rend = GetComponent<SpriteRenderer> (); // gives functionality for the renderer } // Update is called once per frame void onMouseDown () { // if there are no colors present nothing happens if (colors.Length == 0){ return; } if (Input.GetMouseButtonDown(0)){ index += 1; // when mouse is pressed down we increment up to the next index location // when it reaches the end of the colors it stars over if (index == colors.Length +1){ index = 1; } print (index); // used for debugging rend.color = colors [index - 1]; // this sets the material color values inside the index } } //onMouseDown }
答案 4 :(得分:0)
以前已经说过,没有标准的kubernetes方法可以在集群级别全局定义私有注册表秘密。 上面提到的解决方案非常好。其他建议(例如here),我也感到不满意。
需要的是一次定义一个私有注册表机密并将其用作每个ServiceAccount的imagePullSecrets
的可能性。
Titansoft's magepullsecret-patcher可以做到。它会填充所有命名空间中提供的图像提取密钥,并修补所有ServiceAccounts以将密钥用作其imagePullSecret
。但是,Titansoft's magepullsecret-patcher仅适用于一个私有注册表机密。
在我的用例中,我想在其所有群集名称空间中访问多个私有容器注册表。
因此,我使用neutryno's imagepullsecret-serviceaccount-patcher方法。它利用mittwald's kubernetes-replicator在所有命名空间之间复制私有注册表秘密。最重要的是,neutryno's imagepullsecret-serviceaccount-patcher对所有服务帐户的imagePullSecrets
进行修补,以包括已定义的私有注册表秘密(如果需要,<-是多个)。