有时k8s我们需要给一些人员进行查询使用,并不希望该账户又太多权限,这个时候我们需要创建一个只读权限的CLusterRole,并重新生一个对应权限的config文件,然后将这个config文件分发下,这样就能让其它用户可以查看k8s集群,但是只有只读权限。
在创建账户之前,我们现了解下config文件构成
kubectl config view apiVersion: v1 clusters: - cluster: certificate-authority-data: DATA+OMITTED server: https://192.168.1.72:6443 name: kubernetes contexts: - context: cluster: kubernetes user: kubernetes-admin name: kubernetes-admin@kubernetes current-context: kubernetes-admin@kubernetes kind: Config preferences: {} users: - name: kubernetes-admin user: client-certificate-data: REDACTED client-key-data: REDACTED
文件分为clusters、contexts、users三大部分
clusters: 定义集群信息,包括 api-server 地址、certificate-authority-data: 用于服务端证书认证的自签名 CA 根证书(master 节点 /etc/kubernetes/pki/ca.crt 文件内容 ) contexts: 集群信息和用户的绑定,kubectl 通过上下文提供的信息连接集群 users: 多种用户类型,默认是客户端证书(x.509 标准的证书)和证书私钥,也可以是ServiceAccount Token client-certificate-data: base64 加密后的客户端证书 client-key-data: base64 加密后的证书私钥
了解了结构以后我们配置只读用户,首先我们生成客户端TLS证书
openssl genrsa -out readonly.key 2048 openssl req -new -key readonly.key -out readonly.csr -subj "/CN=readonly"
k8s 集群(API Server)的 CA 根证书文件,一般会在 master 节点的 /etc/kubernetes/pki/ 路径下,会有两个文件,一个是 CA 根证书(ca.crt),一个是 CA 私钥(ca.key)
通过集群的CA根证书和第2步创建的csr文件,来为用户颁发证书
openssl x509 -req -in readonly.csr -CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -out readonly.crt -days 365
这样客户端证书文件就办法完毕,接着我们要给予RBAC授予只读权限账户readonly
kubectl create clusterrolebinding viewer --clusterrole=view --user=readonly
接着我们要给予创建的账户生成新的config文件,直接修改原来的,内容替换成创建账户的信息即可
contexts中的user改为创建的readonly
contexts中的name改为readonly@kubernetes
current-context中的kubernetes-admin@kubernetes改为readonly@kubernetes
users中的name改为readonly
users中的client-certificate-data字段改为readonly.crt base64加密后的内容
users中的client-key-data 改为readonly.key base64 加密后的内容
cat readonly.crt | base64 --wrap=0 cat readonly.key | base64 --wrap=0
然后将改好的config下发给申请人员,放置在~/.kube/目录下即可使用kubectl命令来查看集群,我们可以尝试删除一个POD进行测试
上述这种方式我们使用的是clusterrole中的已有view,如果控制粒度还需要进行细化,可以复制这个clusterrole,然后修改允许权限,然后创建一个新的clusterrole,然后在创建clusterrolebinding时绑定自己创建的这个clusterrole即可。
一键创建用户脚本如下:
#!/bin/bash USER="suyang" CLUSTER_IP="192.168.1.72" CLUSTER_PORT="6443" CA_PATH="/etc/kubernetes/pki" if ! command -v "openssl" >/dev/null 2>&1; then echo "未安装openssl命令工具!" exit 1 fi echo "开始生成TLS证书..." openssl genrsa -out ${USER}.key 2048 openssl req -new -key ${USER}.key -out ${USER}.csr -subj "/CN=${USER}" echo "创建CSR证书文件" openssl x509 -req -in ${USER}.csr -CA ${CA_PATH}/ca.crt -CAkey ${CA_PATH}/ca.key -CAcreateserial -out ${USER}.crt -days 365 echo "开始创建clusterrolebinding" if ! command -v "kubectl" >/dev/null 2>&1; then echo "kubectl命令未找到!" exit 1 fi kubectl create clusterrolebinding ${USER} --clusterrole=view --user=${USER} CLUSTER_NAME=`kubectl config view | grep "cluster:" | tail -1 | awk -F ': ' '{print $2}'` echo "获取证书base64..." CER_DATA=`cat ${USER}.crt | base64 --wrap=0` KEY_DATA=`cat ${USER}.key | base64 --wrap=0` CA_DATA=`cat ${CA_PATH}/ca.crt | base64 --wrap=0` echo "开始生成config管理配置文件..." cat > ./${USER}_config <<EOF apiVersion: v1 clusters: - cluster: certificate-authority-data: ${CA_DATA} server: https://${CLUSTER_IP}:${CLUSTER_PORT} name: ${CLUSTER_NAME} contexts: - context: cluster: ${CLUSTER_NAME} user: ${USER} name: ${USER}@${CLUSTER_NAME} current-context: ${USER}@${CLUSTER_NAME} kind: Config preferences: {} users: - name: ${USER} user: client-certificate-data: ${CER_DATA} client-key-data: ${KEY_DATA} EOF
目录下会生成${USER}_config文件,复制到.kube目录下改名为config即可。