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)