k8s基于clusterrole创建集群级别只读账户和config管理文件

有时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进行测试

微信截图_20231207144033.png

上述这种方式我们使用的是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即可。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://sulao.cn/post/939.html