为普通用户授权访问k8s资源(tls,rbac)

需求

为指定用户授权访问不同命名空间权限,例如:给新入职的员工zhangsan,添加权限,先给小的查询权限(default空间的pod读取权限),熟悉后,再给大的权限(所有的空间的pod的读写权限)

实施步骤:

  1. 为用户签发证书
  2. 生成kubeconfig文件
  3. RBAC授权
  4. 测试

实操步骤(带命令)

为用户签发证书

为了让普通用户能够通过认证并调用 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

注意

  1. 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文件有多种方式,优先级从高到底:

  1. 命令通过--kubeconfig选项指定
  2. 设置KUBECONFIG环境变量
  3. 将文件重命名放到kubectl的默认路径下:~/.kube/config

附录

为用户签发证书

你可能感兴趣的:(K8S,kubernetes,容器,云原生)