给普通用户自定义创建 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/certs/ca.pem \\
-CAkey /etc/kubernetes/certs/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 行删除,并在 RoleRolebinding 的前面加上 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 时便会输出权限被拒绝。
开发者涨薪指南 48位大咖的思考法则、工作方式、逻辑体系

以上是关于给普通用户自定义创建 Kubernetes 权限的主要内容,如果未能解决你的问题,请参考以下文章

给普通用户自定义创建 Kubernetes 权限

kubernetes CRD 权限管理

Kubernetes 仪表板 - 内部错误 (500):没有足够的数据来创建身份验证信息结构

ubuntu12.10 中 如何给普通用户权限让其可以创建文件夹

自定义zabbix中的普通KEY及LLD KEY

RBAC普通用户显示本身拥有的权限