自动将imagePullSecrets添加到ServiceAccount

时间:2018-09-13 18:51:13

标签: kubernetes

我们正在为RBAC使用ServiceAccounts,因此正在使用多个SA,以使我们能够通过RoleBindings适当地调整访问。

我们还使用了私有注册表,因此有imagePullSecrets可用于从私有注册表中提取图像。我正在尝试提出一种解决方案,默认情况下,在命名空间中创建的所有SA都会将应用到默认SA的imagePullSecrets列表添加到它们中,以便在我们使用服务部署Pod时(通常是正确的SA之后),已经将serviceAccount配置为使用imagePullSecrets来检索图像。

有没有人设计出一种优雅的方式来解决这个问题?我确实检查了Pod是否可以应用多个serviceAccount-N用于保存imageSecrets,1用于映射到RBAC。和/或,有人可以建议其他方法来解决问题吗?

[更新:澄清-挑战在于在多个服务帐户之间共享imagePullSecrets集,最好无需明确地将它们添加到每个ServiceAccount定义中。应将私有注册表视为类似于dockerhub:访问注册表的用户通常旨在进行拉取,然后使用用户信息来跟踪谁在拉取图像,并偶尔阻止用户拉起不应访问的图像因为“这东西不适合更广泛的消费”。]

5 个答案:

答案 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)

我回答in another thread

  

要轻松将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进行修补,以包括已定义的私有注册表秘密(如果需要,<-是多个)。