前言

为Kubernetes集群自定义超级管理员的方法至少有两种方法:一是将用户归入system:masters用户组,二是通过ClusterRoleBinding将用户绑定至内置集群角色 cluster-admin上,本文介绍采用第二种,手工创建一个qinzc用户,并授权该用户具备特定的权限。

1、生成证书

#生成目标(客户端)账号,生成qinzc.key
(umask 077;openssl genrsa -out qinzc.key 2048)

#创建证书签署请求,CN是用户名,O是用户组,第一种方法请把用户组改为system:masters (如:openssl  req -new -key qinzc.key -out qinzc.csr -subj "/CN=qinzc/O=system:masters"),
#生成 qinzc.csr
openssl  req -new -key qinzc.key -out qinzc.csr -subj "/CN=qinzc/O=kubernetes"

#签署证书,生成 qinzc.crt(ca.crt\ca.key 为K8S 根ca证书 )
openssl x509 -req -days 9999 -CA /etc/kubernetes/pki/ca.crt  -CAkey /etc/kubernetes/pki/ca.key  -CAcreateserial -in ./qinzc.csr -out qinzc.crt

#检查
openssl x509 -in qinzc.crt -text -noout

2、设置集群参数

kubectl config set-cluster kubernetes --embed-certs=true \
--certificate-authority=/etc/kubernetes/pki/ca.crt \
--server="https://k8s.qinzc.me:6443" \
--kubeconfig=./config

3、设置客户端认证参数

kubectl config set-credentials qinzc \
--embed-certs=true \
--client-certificate=./qinzc.crt \
--client-key=qinzc.key \
--kubeconfig=./config

4、设置客户端上下文参数

kubectl config set-context qinzc@kubernetes \
--cluster=kubernetes \
--user=qinzc \
--kubeconfig=./config

5、切换默认上下文

kubectl config use-context qinzc@kubernetes --kubeconfig=./config

6、 授权自定义权限方法

#给dev 名称空间 创建角色(命令)也可以通过yaml文件方式,
kubectl create role admin -n dev --resource="*.*" --verb="get,list,watch,create,delete,deletecollection,patch,update"

#yaml文件

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

#集群角色授权
kubectl create clusterrole pv-admin --verb="*" --resource="persistentvolumeclaims,persistentvolumes"

#给qinzc用户绑定一个权限
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: qinzc-admin
  namespace: dev
subjects:
- kind: User
  name: qinzc
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: admin
  apiGroup: rbac.authorization.k8s.io

授权所有权限

kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: my-admin
subjects:
- kind: User
  name: qinzc
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: ClusterRole
  name: cluster-admin    #集群内置管理员权限,该角色默认已经分配给了system:masters 用户组
  apiGroup: rbac.authorization.k8s.io

笔记:(生成集群管理员证书)

#1、 system:masters 为k8s默认已经创建集群管理员组:
openssl genrsa -out admin.key 2048
openssl req -new -key admin.key -out admin.csr -subj "/CN=admin/O=system:masters/OU=System"
openssl x509 -req -in admin.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out admin.pem -days 3650

#2、设置集群参数
kubectl config set-cluster kubernetes --embed-certs=true \
--certificate-authority=./ssl/ca.pem \
--server="https://192.168.4.215:6443" \
--kubeconfig=./config

#3、设置客户端认证参数,指定用户名,用户证书
kubectl config set-credentials kubernetes \
--embed-certs=true \
--client-certificate=./admin.pem \
--client-key=admin.key \
--kubeconfig=./config

#4、设置客户端上下文参数
kubectl config set-context kubernetes \
--cluster=kubernetes \
--user=admin \
--kubeconfig=./config

#5、设置当前上下文
kubectl config use-context kubernetes --kubeconfig=./config

#6、复制文件到.kube
mkdir ~/.kube
cp ./config  ~/.kube/config

#7、(如报权限错误请输入此条进行授权) 授权 kubernetes 证书访问 kubelet api 权限
kubectl create clusterrolebinding kube-apiserver:kubelet-apis --clusterrole=system:kubelet-api-admin --user kubernetes

说明:

访问api集群会需要认证用户名、以及用户组;那么所谓的用户名和用户组从哪里来定义呢?
我们来看看上面openssl创建证书的语句:
openssl req -new -key admin.key -out admin.csr -subj "/CN=admin/O=system:masters/OU=System"
其中这里的/CN=admin/O=system:masters/OU=System就是在CN定义用户为admin,O定义用户组为system:masters,OU 指定该证书的 Group 为 system:masters为k8s默认已经创建好了的集群管理员组

那么定义好之后,在kubernetes中是怎么使用的呢?
kube-apiserver 预定义了一些 RBAC 使用的 RoleBindings(角色),如 cluster-admin (角色)将 Group(组) system:masters与 Role(角色) cluster-admin 绑定,该 Role 授予了调用kube-apiserver 的所有 API的权限;
那么当然的,我们创建admin的证书的时候,就要按照该上面的说明定义好证书的组、用户。

另外当kubelet使用该证书访问kube-apiserver是什么样的过程呢?
在证书的签名中,OU 指定该证书的 Group 为 system:masters,kubelet 使用该证书访问 kube-apiserver 时 ,由于证书被 CA 签名,所以认证通过,同时由于证书用户组为经过预授权的 system:masters,所以被授予访问所有 API 的权限;
同理,如果你是使用CFSSL来签名证书也需要这样去配置好用户和用户组。在这里就不单独写CFSSL签kubernetes的相关证书了。
重要的是要好好理解证书签名与kubernetes的RBAC角色绑定的关系