【问题标题】:Kubernetes read-only contextKubernetes 只读上下文
【发布时间】:2019-12-05 18:38:18
【问题描述】:
我拥有 GKE 集群的完全管理员权限,但我希望能够创建一个仅具有只读权限的 kubernetes 上下文。这样我可以防止自己不小心弄乱集群。但是,当我需要进行更改时,我仍然希望能够暂时切换到具有完全管理员访问权限的模式(我可能会使用 cloud shell 来完全区分两者)
我没有太多关于此的文档 - 似乎我可以根据我的电子邮件设置角色,但不能为一个用户设置两个角色。
有没有办法做到这一点?或者任何其他方法来防止胖手指删除产品?
【问题讨论】:
标签:
kubernetes
google-kubernetes-engine
kubectl
【解决方案1】:
使用 GKE 有几种方法可以做到这一点。 KUBECONFIG 中的 context 由 cluster 和 user 组成。由于您想指向同一个cluster,因此需要更改的是user。可以通过多种方式控制users 可以对各种资源执行的操作的权限,即通过Cloud IAM policies 或通过Kubernetes RBAC。前者适用于项目范围,因此除非您要创建对项目中的所有集群具有只读访问权限的主题,而不是特定集群,否则最好使用范围更窄的主题Kubernetes RBAC。
以下类型的主体可以通过 GKE 集群进行身份验证并应用 Kubernetes RBAC 策略(请参阅here):
- 注册的(人类)GCP 用户
- 一个 Kubernetes ServiceAccount
- GCloud IAM 服务帐号
- G Suite Google 群组的成员
由于您不打算注册另一个人来完成这种只读访问模式,而且 G Suite Google 群组可能有点矫枉过正,因此您可以选择 Kubernetes ServiceAccount 或 GCloud IAM 服务帐户。对于这个答案,我们会选择后者。
步骤如下:
- 在与您的 Kubernetes 集群相同的项目中创建 GCloud IAM 服务帐号。
- 创建一个本地
gcloud 配置以避免混乱您的默认配置。就像您想创建一个新的 KUBECONFIG context 而不是修改当前 context 的 user 一样,这与 gcloud 本身的作用相同,而不是 kubectl。运行命令gcloud config configurations create <configuration-name>。
- 将此配置与您的 GCloud IAM 服务帐户相关联:
gcloud auth activate-service-account <service_account_email> --key-file=</path/to/service/key.json>。
-
将context 和user 添加到您的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}'
-
添加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