Kubernetes 只读上下文

Kubernetes read-only context

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

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

有什么办法吗?或者任何其他方法来防止胖手指删除产品?

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

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

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

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

步骤如下:

  1. 在与您的 Kubernetes 集群相同的项目中创建一个 GCloud IAM 服务帐户。
  2. 创建本地 gcloud 配置以避免使默认配置混乱。正如您想创建一个新的 KUBECONFIG context 而不是修改当前 contextuser 一样,这会做同样的事情,但 gcloud 本身而不是 [=24] =]. 运行 命令 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 文件中,以便您可以作为此 GCloud IAM 服务帐户向您的 GKE 集群进行身份验证,如下所示:

    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