需求
为指定用户授权访问不同命名空间权限,例如:给新入职的员工zhangsan,添加权限,先给小的查询权限(default空间的pod读取权限),熟悉后,再给大的权限(所有的空间的pod的读写权限)
实施步骤:
- 为用户签发证书
- 生成kubeconfig文件
- RBAC授权
- 测试
实操步骤(带命令)
为用户签发证书
为了让普通用户能够通过认证并调用 API,需要执行几个步骤。 首先,该用户必须拥有 Kubernetes 集群签发的证书, 然后将该证书提供给 Kubernetes API。
创建私钥
[root@k8s-master access]# openssl genrsa -out zhangsan.key 2048
Generating RSA private key, 2048 bit long modulus
...........+++
.............................................................+++
e is 65537 (0x10001)
# CN 是用户名,O 是该用户归属的组,很关键
[root@k8s-master access]# openssl req -new -key zhangsan.key -out zhangsan.csr -subj "/CN=zhangsan/O=OPPO_CKA"
使用k8s集群的ca签发证书
[root@k8s-master access]# openssl x509 -req -in zhangsan.csr -CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -days 3650 -CAcreateserial -out zhangsan.crt
Signature ok
subject=/CN=zhangsan/O=OPPO_CKA
Getting CA Private Key
注意:
- CA是apiserver中的
--client-ca-file
的配置值
验证证书是否有效:
[root@k8s-master access]# openssl verify -CAfile /etc/kubernetes/pki/ca.crt zhangsan.crt
zhangsan.crt: OK
生成kubeconfig文件
kubeconfig 文件包含以下三部分:
- clusters:name、ca、server
- users:name、证书、私钥
- contexts:name、cluster、user
# 生成cluster的信息(ca、server)
kubectl config --kubeconfig=zhangsan_kcf set-cluster cluster1 --server=https://10.90.118.39:6443 --certificate-authority=/etc/kubernetes/pki/ca.crt --embed-certs=true# 生成user的信息(用户名、证书、私钥)
kubectl config --kubeconfig=zhangsan_kcf set-credentials zhangsan --client-key=zhangsan.key --client-certificate=zhangsan.crt --embed-certs=true# 生成context信息(即将集群与用户“关联”起来)
kubectl config --kubeconfig=zhangsan_kcf set-context zhangsan@cluster1 --cluster=cluster1 --user=zhangsan# 指定要使用的context
kubectl config --kubeconfig=zhangsan_kcf use-context zhangsan@cluster1
测试
将zhangsan_kcf这个kubeconfig文件下发给张三,张三拿到该文件后即可测试
# 提示资源访问没权限,说明认证已经通过了
[root@k8s-slave1 tmp]# k get po --kubeconfig=zhangsan_kcf
Error from server (Forbidden): pods is forbidden: User "zhangsan" cannot list resource "pods" in API group "" in the namespace "default"
RBAC授权
创建了证书之后,为了让这个zhangsan这个用户能访问 Kubernetes 集群资源,现在就要创建 Role 和 RoleBinding 了。
kubectl create role default_read --verb=get,list --resource=pods -n default
# 将role绑定到--user上
kubectl create rolebinding zhangsan-default_read --role=default_read --user=zhangsan -n default
# 或者 将role绑定到--group上
kubectl create rolebinding g-OPPO_CKA-default_read --role=default_read --group=OPPO_CKA -n default
再次测试
[root@k8s-slave1 tmp]# kubectl get po --kubeconfig zhangsan_kcf
NAME READY STATUS RESTARTS AGE
busybox01 1/1 Running 1 (9h ago) 21h
busybox02 1/1 Running 1 (9h ago) 21h
如上测试通过。
指定kubeconfig文件有多种方式,优先级从高到底:
- 命令通过
--kubeconfig
选项指定 - 设置
KUBECONFIG
环境变量 - 将文件重命名放到kubectl的默认路径下:
~/.kube/config