给普通用户自定义创建 Kubernetes 权限
Posted 愿许浪尽天涯
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了给普通用户自定义创建 Kubernetes 权限相关的知识,希望对你有一定的参考价值。
一、给普通用户自定义创建 Kubernetes 权限
需求: 由于开发同事需要在 K8s 集群内查看 Pod 的应用日志,为了防止开发同事在集群内误操作,我们这里通过配置 UserAccount 的方式将开发同事的账号权限降低;以此来提升集群的安全性。
1.创建用户凭证
1)创建用户
[root@k8s-master01 ~]# useradd zhangsan
2)创建用户的证书私钥
[root@k8s-master01 ~]# cd /home/zhangsan
[root@k8s-master01 zhangsan]# openssl genrsa -out zhangsan.key 2048
[root@k8s-master01 zhangsan]# openssl req -new -key zhangsan.key -out zhangsan.csr -subj "/CN=zhangsan/O=CSDN"
[root@k8s-master01 zhangsan]# openssl x509 -req -days 3650 \\
-CA /etc/kubernetes/cert/ca.pem \\
-CAkey /etc/kubernetes/cert/ca-key.pem \\
-CAcreateserial -in zhangsan.csr -out zhangsan.crt
openssl
常见选项:
days
:指定证书过期时间;-CA
:指定使用的 CA 证书;-CAkey
:指定使用 CA 证书的私钥;-CAcreateserial
:自动创建 CA 的序列号;-in
:待签文件;-out
:输出;
2.在 Kubernetes 上创建凭证和上下文
[root@k8s-master01 zhangsan]# export KUBE_APISERVER="https://192.168.1.1:6443"
--embed-certs=true
:表示将不在配置文件中显示证书信息。--kubeconfig=kubectl.kubeconfig
:表示将命令生成的信息写入kubectl.kubeconfig
文件中。
1)设置集群参数
[root@k8s-master01 zhangsan]# kubectl config set-cluster kubernetes \\
--certificate-authority=/etc/kubernetes/cert/ca.pem \\
--embed-certs=true \\
--server=$KUBE_APISERVER \\
--kubeconfig=kubectl.kubeconfig
2)设置客户端认证参数
[root@k8s-master01 zhangsan]# kubectl config set-credentials zhangsan \\
--client-certificate=/home/zhangsan/zhangsan.crt \\
--client-key=/home/zhangsan/zhangsan.key \\
--embed-certs=true \\
--kubeconfig=kubectl.kubeconfig
3)设置上下文参数
[root@k8s-master01 zhangsan]# kubectl config set-context zhangsan-context \\
--cluster=kubernetes \\
--namespace=default \\
--user=zhangsan \\
--kubeconfig=kubectl.kubeconfig
4)设置默认上下文
[root@k8s-master01 zhangsan]# kubectl config use-context zhangsan-context --kubeconfig=kubectl.kubeconfig
查看:
[root@k8s-master01 zhangsan]# kubectl config view --kubeconfig=kubectl.kubeconfig
apiVersion: v1
clusters: # 集群相关的信息
- cluster:
certificate-authority-data: DATA+OMITTED
server: https://192.168.1.1:6443
name: kubernetes # 集群名称
contexts: # 通过上下文将集群和用户名关联起来
- context:
cluster: kubernetes
namespace: default
user: zhangsan
name: zhangsan-context
current-context: zhangsan-context # 建立集群和用户
kind: Config
preferences:
users:
- name: zhangsan # 用户相关的信息
user:
client-certificate-data: REDACTED
client-key-data: REDACTED
[root@k8s-master01 zhangsan]# chown -R zhangsan:zhangsan kubectl.kubeconfig
3.给普通用户创建 RBAC 权限
我们下面创建的权限是针对的单个命名空间,当想要分配集群级别的权限时,可以将 namespace
行删除,并在 Role
和 Rolebinding
的前面加上 Cluster
即可。
[root@k8s-master01 zhangsan]# cat <<END > zhangsan-rbac.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: zhangsan
namespace: default
rules:
- apiGroups: [""]
resources: ["services","endpoints","pods","pods/log"]
verbs: ["get","list","watch"]
- apiGroups: [""]
resource: ["pods/exec"]
verbs: ["create"]
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: RoleBinding
metadata:
name: zhangsan
namespace: default
subjects:
- kind: User
name: zhangsan
apiGroup: ""
roleRef:
kind: Role
name: zhangsan
apiGroup: ""
END
[root@k8s-master01 zhangsan]# kubectl create -f zhangsan-rbac.yaml
4.验证
[root@k8s-master01 zhangsan]# cat <<END > test-rbac.yaml
apiVersion: v1
kind: Pod
metadata:
name: busybox
spec:
containers:
- name: busybox
image: busybox:1.28.4
imagePullPolicy: IfNotPresent
command: ['/bin/sh','-c','sleep 3600']
END
[root@k8s-master01 zhangsan]# kubectl create -f test-rbac.yaml
[root@k8s-master01 zhangsan]# su - zhangsan
[zhangsan@k8s-master01 ~]$ mkdir ~/.kube
[zhangsan@k8s-master01 ~]$ cp kubectl.kubeconfig ~/.kube/config
[zhangsan@k8s-master01 ~]$ kubectl get pod
- 因为我们上面的 RBAC 授权并没有配置对 Pod 的
delete
权限,所以当删除 Pod 时便会输出权限被拒绝。
以上是关于给普通用户自定义创建 Kubernetes 权限的主要内容,如果未能解决你的问题,请参考以下文章
Kubernetes 仪表板 - 内部错误 (500):没有足够的数据来创建身份验证信息结构