【问题标题】:Kubernetes read-only contextKubernetes 只读上下文
【发布时间】:2019-12-05 18:38:18
【问题描述】:

我拥有 GKE 集群的完全管理员权限,但我希望能够创建一个仅具有只读权限的 kubernetes 上下文。这样我可以防止自己不小心弄乱集群。但是,当我需要进行更改时,我仍然希望能够暂时切换到具有完全管理员访问权限的模式(我可能会使用 cloud shell 来完全区分两者)

我没有太多关于此的文档 - 似乎我可以根据我的电子邮件设置角色,但不能为一个用户设置两个角色。

有没有办法做到这一点?或者任何其他方法来防止胖手指删除产品?

【问题讨论】:

    标签: kubernetes google-kubernetes-engine kubectl


    【解决方案1】:

    使用 GKE 有几种方法可以做到这一点。 KUBECONFIG 中的 contextclusteruser 组成。由于您想指向同一个cluster,因此需要更改的是user。可以通过多种方式控制users 可以对各种资源执行的操作的权限,即通过Cloud IAM policies 或通过Kubernetes RBAC。前者适用于项目范围,因此除非您要创建对项目中的所有集群具有只读访问权限的主题,而不是特定集群,否则最好使用范围更窄的主题Kubernetes RBAC。

    以下类型的主体可以通过 GKE 集群进行身份验证并应用 Kubernetes RBAC 策略(请参阅here):

    1. 注册的(人类)GCP 用户
    2. 一个 Kubernetes ServiceAccount
    3. GCloud IAM 服务帐号
    4. G Suite Google 群组的成员

    由于您不打算注册另一个人来完成这种只读访问模式,而且 G Suite Google 群组可能有点矫枉过正,因此您可以选择 Kubernetes ServiceAccount 或 GCloud IAM 服务帐户。对于这个答案,我们会选择后者。

    步骤如下:

    1. 在与您的 Kubernetes 集群相同的项目中创建 GCloud IAM 服务帐号。
    2. 创建一个本地gcloud 配置以避免混乱您的默认配置。就像您想创建一个新的 KUBECONFIG context 而不是修改当前 contextuser 一样,这与 gcloud 本身的作用相同,而不是 kubectl。运行命令gcloud config configurations create <configuration-name>
    3. 将此配置与您的 GCloud IAM 服务帐户相关联:gcloud auth activate-service-account <service_account_email> --key-file=</path/to/service/key.json>
    4. contextuser 添加到您的KUBECONFIG 文件中,以便您可以通过以下方式对您的GKE 集群进行身份验证作为此GCloud IAM 服务帐户:

      contexts:
      - ...
      - ...
      - name: <cluster-name>-read-only
        context:
          cluster: <cluster-name>
          user: <service-account-name>
      users:
      - ...
      - ...
      - name: <service-account-name>
        user:
          auth-provider:
            name: gcp
            config:
              cmd-args: config config-helper --format=json --configuration=<configuration-name>
              cmd-path: </path/to/gcloud/cli>
              expiry-key: '{.credential.token_expiry}'
              token-key: '{.credential.access_token}'
      
    5. 添加ClusterRoleBinding,使该主题对集群具有只读访问权限:

      $ cat <<EOF | kubectl apply -f -
      kind: ClusterRoleBinding
      apiVersion: rbac.authorization.k8s.io/v1
      metadata:
        name: <any-name>
      subjects:
      - kind: User
        name: <service-account-email>
      roleRef:
        kind: ClusterRole
        name: view
        apiGroup: rbac.authorization.k8s.io
      EOF
      

    试试看:

    $ kubectl use-context <cluster-name>-read-only
    $ kubectl get all --all-namespaces
    # see all the pods and stuff
    $ kubectl create namespace foo
    Error from server (Forbidden): namespaces is forbidden: User "<service-account-email>" cannot create resource "namespaces" in API group "" at the cluster scope: Required "container.namespaces.create" permission.
    
    $ kubectl use-context <original-namespace>
    $ kubectl get all --all-namespaces
    # see all the pods and stuff
    $ kubectl create namespace foo
    namespace/foo created
    

    【讨论】:

      猜你喜欢
      • 2013-01-12
      • 1970-01-01
      • 2019-12-22
      • 2019-08-17
      • 2018-09-11
      • 2021-12-14
      • 1970-01-01
      • 2019-01-16
      • 2019-05-29
      相关资源
      最近更新 更多