CKA [Security] – ClusterRoleBinding实践教程
其实和RoleBinding的结构一样如下面的公式。ClusterRoleBinding只能绑定ClusterRole不能绑定Role。
ClusterRoleBinding = Subject + ClusterRole
ClusterRole是不被namespace所约束的,所以是能够跨namespace的。ClusterRole更多的是控制K8s集群的component,比如node,storageClass, CRD等等。
ClusterRoleBinding的实际操作
# 创建Service Account和token
1. 创建Service Account , 默认没有指定namespace的话,那么就是使用default namespace
kubectl create sa test-sa
2. 为Service Account 创建Token , 默认没有加上duration的话,那么有效期限就是1个小时而已
kubectl create token test-sa --duration=10h
# 创建ClusterRole和绑定
1. 创建ClusterRole
【使用命令行创建ClusterRole】
kubectl create clusterrole pod-reader --verb=get --verb=list --verb=watch --resource=pods
【dry run ClusterRole 并且输出yaml】
kubectl create clusterrole pod-reader --verb=get --verb=list --verb=watch --resource=pods --dry-run=client -o yaml

ClusterRole是不受namespace约束的,所以当你创建好了之后就会参杂在很多的ClusterRole当中

2. 使用ClusterRoleBinding把刚创建好的ClusterRole和ServiceAccount做绑定
根据这个命令行,绑定的ServiceAccount是default的test-sa
【使用命令行进行ClusterRoleBinding绑定】
kubectl create clusterrolebinding test-bind \
--clusterrole=pod-reader \
--serviceaccount=default:test-sa
【dry run ClusterRoleBinding 并且输出yaml】
kubectl create clusterrolebinding test-bind \
--clusterrole=pod-reader \
--serviceaccount=default:test-sa \
--dry-run=client -o yaml
# 进行测试
1. 使用命令行先测试看看test-sa ServiceAccount是否有权限读取pod, 看到yes的话就是有权限
kubectl auth can-i list pods --as=system:serviceaccount:default:test-sa

2. 查看control panel url
kubectl cluster-info

3. 把test-sa token给注入environment variable在terminal当中 (macos)
【注入variable】
TOKEN=XXXXXXXXX
【输出并且检查variable】
echo $TOKEN
4. 把https://K8S-DETAILS-HERE 改成你的control plane url
curl -k https://K8S-DETAILS-HERE/api/v1/namespaces/default/pods --header "Authorization: Bearer $TOKEN"
看到一下的result就是测试成功了。
