创建具有受限权限的 kubeconfig

Nin*_*a S 1 azure google-cloud-platform kubernetes

我需要创建一个具有受限访问权限的 kubeconfig,我希望能够提供在特定名称空间中更新 configmap 的权限,如何使用以下权限创建这样的 kubeconfig

  1. 对于特定命名空间 (myns)
  2. 仅更新配置映射 (mycm)

有没有简单的方法来创建它?

这里棘手的部分是我需要某个程序能够访问集群 X 并仅修改此 comfigMap,我如何从外部进程执行此操作而不提供完整的 kubeconfig 文件,这可能会因安全原因而出现问题

为了明确起见,我拥有集群,我只想授予某些程序受限权限

har*_*riK 6

这并不简单。但还是有可能的。

创建命名空间 myns(如果不存在)。

$ kubectl create ns myns
namespace/myns created
Run Code Online (Sandbox Code Playgroud)

在 myns 命名空间中创建服务帐户 cm-user。它还会创建一个秘密令牌。

$ kubectl create sa cm-user -n myns
serviceaccount/cm-user created

$  kubectl get sa cm-user -n myns
NAME      SECRETS   AGE
cm-user   1         18s

$ kubectl get secrets -n myns
NAME                  TYPE                                  DATA   AGE
cm-user-token-kv5j5   kubernetes.io/service-account-token   3      63s
default-token-m7j9v   kubernetes.io/service-account-token   3      96s
Run Code Online (Sandbox Code Playgroud)

从 Secret 中获取 token 和 ca.crt cm-user-token-kv5j5

$ kubectl get secrets cm-user-token-kv5j5 -n myns -oyaml
Run Code Online (Sandbox Code Playgroud)

Base64 解码来自 的令牌值cm-user-token-kv5j5

现在使用解码后的令牌创建一个用户。

$ kubectl config set-credentials cm-user --token=<decoded token value>
User "cm-user" set.
Run Code Online (Sandbox Code Playgroud)

现在生成一个 kubeconfig 文件 kubeconfig-cm。

apiVersion: v1
kind: Config
clusters:
- cluster:
    certificate-authority-data: <ca.crt value from cm-user-token-kv5j5 secret>
    server: <kubernetes server>
  name: <cluster>
contexts:
- context:
    cluster:<cluster>
    namespace: myns
    user: cm-user
  name: cm-user
current-context: cm-user 
users:
- name: cm-user
  user:
    token: <decoded token>
Run Code Online (Sandbox Code Playgroud)

现在为 sa cm-user 创建角色和角色绑定。

---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: myns
  name: cm-user-role
rules:
- apiGroups: [""]
  resources: ["configmaps"]
  verbs: ["update", "get", "list"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: cm-user-rb
  namespace: myns
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: cm-user-role
subjects:
- namespace: myns
  kind: ServiceAccount
  name: cm-user
Run Code Online (Sandbox Code Playgroud)

我们完了。现在使用此 kubeconfig 文件,您可以更新 mycm configmap。它没有任何其他特权。

$ kubectl get cm -n myns --kubeconfig kubeconfig-cm
NAME                 DATA   AGE
mycm                 0      8s

$ kubectl delete cm mycm -n myns --kubeconfig kubeconfig-cm
Error from server (Forbidden): configmaps "mycm" is forbidden: User "system:serviceaccount:myns:cm-user" cannot delete resource "configmaps" in API group "" in the namespace "myns"
Run Code Online (Sandbox Code Playgroud)