权限管理,为kubernetes集群创建只读账户,方便dev人员查看集群信息

shell脚本

在可以操作kubernetes集群管理员权限的机器执行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78

#!/bin/bash
# 判断是否安装base64
if command -v base64 &> /dev/null; then
echo "base64 is installed"
else
echo "base64 is not installed"
exit 1
fi


# 设置只读用户的命名空间
namespace="default"
# 设置只读用户的名称,与对应linux用户同名,也可以不同名
username="ro"

# 创建 ServiceAccount
kubectl create sa "${username}" --namespace="${namespace}"

# 高版本的kubernetes集群关闭了ServiceAccount创建时自动创建对应的 Secret
# 创建 Secret与 ServiceAccount进行关联绑定
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Secret
metadata:
name: ${username}-secret
namespace: ${namespace}
annotations:
kubernetes.io/service-account.name: "${username}"
type: kubernetes.io/service-account-token
EOF

# 新建的ServiceAccount与集群角色view(只读权限)进行绑定授权
cat <<EOF | kubectl apply -f -
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: ${username}-cluster-role-binding
subjects:
- kind: ServiceAccount
name: ${username}
namespace: ${namespace}
roleRef:
kind: ClusterRole
name: view
apiGroup: rbac.authorization.k8s.io
EOF


# 获取 secret 创建后自动生成的 token
TOKEN=$(kubectl get secret -n ${namespace} ${username}-secret -o jsonpath='{.data.token}' | base64 -d)

echo TOKEN:$TOKEN

# 获取集群的name
CLUSTER_NAME=$(kubectl config view -o jsonpath='{.clusters[0].name}')

# 获取 API Server 地址
API_SERVER=$(kubectl config view --minify -o jsonpath='{.clusters[0].cluster.server}')

# 将 kubeconfig 文件保存到对应linux用户同名的.kube目录
mkdir -p /home/${username}/.kube
#将集群ca.crt文件保存到linux用户同名的只读用户可以读取的地方
kubectl get secret -n ${namespace} ro-secret -o jsonpath="{.data['ca\.crt']}" | base64 -d > /home/${username}/.kube/kubernetes.ca.crt

KUBECONFIG_PATH=/home/${username}/.kube/config

# 清理旧的只读config
rm -rf ${KUBECONFIG_PATH}
kubectl config set-cluster ${CLUSTER_NAME} --server="${API_SERVER}" --certificate-authority=/home/${username}/.kube/kubernetes.ca.crt --kubeconfig="${KUBECONFIG_PATH}"
kubectl config set-credentials "${username}" --token="${TOKEN}" --kubeconfig="${KUBECONFIG_PATH}"
kubectl config set-context "${username}-context" --cluster=${CLUSTER_NAME} --user="${username}" --namespace="${namespace}" --kubeconfig="${KUBECONFIG_PATH}"
kubectl config use-context "${username}-context" --kubeconfig="${KUBECONFIG_PATH}"


# 修改文件所有权
sudo chown -R ${username}:${username} /home/${username}/.kube

这样,你就可以完成对kubernetes集群权限管理,对应linux用户只有只读集群的权限