k8s生成一个用户集群配置文件并限制用户的行为(让linux用户只能对某一个namespace特定的资源操作并且只具有查看权限,在实际工作中可以限定不同用户具有k8s不同的操作行为)

操作前提是已经有namespace,本文的namespace是fronted

一. 新建用户

1. 创建用户证书key

umask 077; openssl genrsa -out fronted.key 2048

2 .创建用户证书请求,-subj指定组和用户,其中O是组名,CN是用户名

openssl req -new -key fronted.key -out fronted.csr -subj "/O=fronted/CN=fronted" 

3. 使用k8s的ca签发用户证书

openssl x509 -req -in fronted.csr -CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -out fronted.crt -days 3650

二. 生成kubeconfig授权文件

1. 设置集群配置

kubectl config set-cluster fronted@kubernetes --certificate-authority=/etc/kubernetes/pki/ca.crt --embed-certs=true --server=https://master.k8s.io:16443 --kubeconfig=fronted.kubeconfig

2. 设置context

kubectl config set-context fronted@kubernetes --cluster=kubernetes --user=fronted --kubeconfig=fronted.kubeconfig

3. 设置客户端认证配置

kubectl config set-credentials fronted --client-certificate=fronted.crt --client-key=fronted.key --embed-certs=true --kubeconfig=fronted.kubeconfig

4. 设置当前用户配置

kubectl config use-context fronted@kubernetes --kubeconfig=fronted.kubeconfig

三. 创建RBAC授权

1. 创建Role(只允许用户对namespace=fronted的pod进行查看操作包括日志查看) fronted-role.yaml

kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  namespace: fronted
  name: pod-reader
rules:
- apiGroups: [""]
  resources: ["pods","pods/log"]
  verbs: ["get", "watch", "list"]

2. 创建RoleBinding(将用户fronted和Role进行绑定) fronted-rolebinding.yaml

kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: read-pods
  namespace: fronted
subjects:
- kind: User
  name: fronted 
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: pod-reader
  apiGroup: rbac.authorization.k8s.io

3. 应用RBAC

kubectl apply -f fronted-role.yaml
kubectl apply -f fronted-rolebinding.yaml

四. 将k8s权限应用于linux普通用户

useradd fronted
mkdir -p /home/fronted/.kube
cp fronted.kubeconfig /home/fronted/.kube/
chown fronted.fronted /home/fronted/ -R

五. 验证用户权限

用户只具有查看pod的权限,实际工作中也可以考虑用RoleCluster来进行RBAC

[root@k8s-master-02 fronted]# su fronted
[fronted@k8s-master-02 ~]$ kubectl get pods -A
Error from server (Forbidden): pods is forbidden: User "fronted" cannot list resource "pods" in API group "" at the cluster scope
[fronted@k8s-master-02 ~]$ kubectl get pods -n fronted
NAME                       READY   STATUS    RESTARTS   AGE
h5sdk-5dd65b78b6-68t8z     1/1     Running   0          5d2h
h5sdk-5dd65b78b6-76mg2     1/1     Running   0          5d2h
h5sdk-5dd65b78b6-p2n2k     1/1     Running   0          5d2h
klbb-798555f54c-2p4zx      1/1     Running   0          3d1h
klbb-798555f54c-f4kn5      1/1     Running   0          3d1h
klbb-798555f54c-n7qdp      1/1     Running   0          3d1h
popadmin-fff99fbc7-klg5c   1/1     Running   1          6d20h
popadmin-fff99fbc7-kn566   1/1     Running   1          6d20h
popadmin-fff99fbc7-tmbms   1/1     Running   1          6d20h
[fronted@k8s-master-02 ~]$ kubectl get svc -n fronted
Error from server (Forbidden): services is forbidden: User "fronted" cannot list resource "services" in API group "" in the namespace "fronted"
[fronted@k8s-master-02 ~]$