kubernetes 新增单namespace权限的用户,拥有独立的 kubeconfig文件

k8s 分多个 namespace,每个 ns 使用一个用户,这个用户 只能操作 这个 ns 内的所有资源,其他ns 没有权限

如 新建一个 permission 名字的 ns ,那么 新建个用户 permission ,使 permission 用户 只有 permission 名字的namespace 权限

创建 permission 名字的 namespace

kubectl create ns permission

1. 到 k8s master 的秘钥目录下,基于 k8s 的ca.crt 来生成用户

cd /etc/kubernetes/pki/

2. 创建秘钥

直接执行下面,带括号
(umask 077; openssl genrsa -out permission.key 2048)
ll permission.key

3. 然后基于tracy.key私钥来生成证书使用kubernetes集群的ca.crt来签署

生成证书签署请求
openssl req -new -key permission.key -out permission.csr -subj "/CN=permission"
# 注意,最后的 "/CN=tracy" 中的tracy,就是用户名

4. 用 k8s 的 ca.crt 来签署

openssl x509 -req -in permission.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out permission.csr -days 36500
ll permission.*

验证查看生成的证书
openssl x509 -in permission.csr -text -noout

        Issuer: CN=kubernetes           				# 这里可以看到是kubernetes自己的ca.crt证书签署的
        Validity
            Not Before: Aug 19 08:14:53 2019 GMT        # 证书有效期限起始
            Not After : Aug 18 08:14:53 2020 GMT        # 证书有效期限结束
        Subject: CN=permission       					# 作为用户账号连入kubernetes用户

5. 设定用户

kubectl config set-credentials permission --client-certificate=permission.csr --client-key=permission.key --embed-certs=true

# 查看刚刚设定的用户
kubectl config view

6. 加入上下文

kubectl config set-context permission@kubernetes --cluster=kubernetes --user=permission

切换 上下文 测试
kubectl config use-context permission@kubernetes
kubectl config view
# 这一步可以看到 current-context: permission@kubernetes

此时 kubectl get pods 发现没有权限
Error from server (Forbidden): pods is forbidden: User "permission" cannot list resource "pods" in API group "" in the namespace "default"

7. 绑定权限

注: 因为 需要设定的权限是 对应ns 下所有权限,可以直接使用 默认的 admin 的 clusterrole,这个 集群的role 有所有权限,
那么 直接使用 rolebinding 来把 clusterrole 绑定到对应用户下,那么这个用户 就有了 该namespace 下所有权限,并且其他namespace 则没有任何权限
这里的权限 边界 被 rolebinding 限制了,如有不解,看查看前面的文章 https://www.cnblogs.com/winstom/p/11378567.html

kubectl config use-context kubernetes-admin@kubernetes
kubectl -n permission create rolebinding permission --clusterrole=admin --user=permission

此时再次测试
kubectl config use-context permission@kubernetes
kubectl -n permission get pods
此时就不会报错 权限问题

8. 生成 config 文件

下面给出的是案例

apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: (cat /etc/kubernetes/pki/ca.crt | base64 -w 0)
    server: https://10.249.96.165:6443
  name: kubernetes
contexts:
- context:
    cluster: kubernetes
    user: permission
	namespace: permission			# 这里写入后,kubectl 可以不加 -n 来指定 namespace
  name: permission@kubernetes
current-context: permission@kubernetes
kind: Config
preferences: {}
users:
- name: permission
  user:
    client-certificate-data: (cat /etc/kubernetes/pki/permission.csr | base64 -w 0)
    client-key-data: (cat /etc/kubernetes/pki/permission.key | base64 -w 0)
技术男一枚,喜欢做技术分享,把学习的过程,以及遇到问题的解决过程都愿意分享给大家,博客中如有不足,请留言或者联系博主,感谢。 邮箱: sijiayong000@163.com Q Q: 601566386
原文地址:https://www.cnblogs.com/winstom/p/15159343.html