【k8s】serviceAccount、role、RoleBinding入门示例
RBAC(基于角色的访问控制,Role-Based Access Control)是Kubernetes中用于管理权限的机制。如果设置正确,这个命令会返回命名空间中的Pod列表。你会看到一个错误,表明没有删除Pod的权限。
·
文章目录
RBAC(基于角色的访问控制,Role-Based Access Control)是Kubernetes中用于管理权限的机制。要在Kubernetes环境中创建并演示一个RBAC权限设置的例子,你可以按照以下步骤操作:
- 创建一个命名空间
首先,创建一个新的命名空间,以便在其中演示RBAC的配置。
kubectl create namespace demo-rbac
- 创建一个ServiceAccount
接下来,在这个命名空间中创建一个ServiceAccount。这个ServiceAccount会与RBAC绑定,从而获得特定权限。
kubectl create serviceaccount demo-user -n demo-rbac
- 创建一个Role
创建一个Role,并定义该角色在特定命名空间中的权限。例如,以下Role允许demo-user在demo-rbac命名空间中查看和列出Pods。
# role.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: demo-rbac
name: pod-reader
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list"]
应用这个Role:
kubectl apply -f role.yaml
注意:Role是区分命名空间的,因此,在查询的时候,也需要指定 -n 参数
- 创建一个RoleBinding
将这个Role绑定到刚才创建的ServiceAccount上,使得该ServiceAccount可以使用指定的权限。
# rolebinding.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: read-pods
namespace: demo-rbac
subjects:
- kind: ServiceAccount
name: demo-user
namespace: demo-rbac
roleRef:
kind: Role
name: pod-reader
apiGroup: rbac.authorization.k8s.io
应用这个RoleBinding:
kubectl apply -f rolebinding.yaml
注意:rolebinding是区分命名空间的,因此,在查询的时候,也需要指定 -n 参数
- 创建一个pod
apiVersion: v1
kind: Pod
metadata:
name: kubia-manual-v2-demo-rbac
namespace: demo-rbac
labels:
creation_method: manual
env: prod
spec:
#指定sa
serviceAccountName: demo-user
# activeDeadlineSeconds: 300 为了模块可以修改的字段
containers:
- image: kubia
imagePullPolicy: IfNotPresent
name: kubia
ports:
- containerPort: 8080
protocol: TCP
serviceAccountName
: demo-user
- 使用kubectl命令行验证权限
验证这个ServiceAccount是否拥有正确的权限。为了模拟用户使用这个ServiceAccount进行操作,可以通过kubectl命令使用--as
标志来执行操作。【k8s】–as=system:serviceaccount:demo-rbac:demo-user模拟某组件的某sa
例如,尝试在demo-rbac命名空间中列出Pods:
kubectl get pods -n demo-rbac --as=system:serviceaccount:demo-rbac:demo-user
如果设置正确,这个命令会返回命名空间中的Pod列表。
或者进入pod,直接查询:
curl -k -H "Authorization: Bearer $(cat /var/run/secrets/kubernetes.io/serviceaccount/token)" https://kubernetes.default.svc/api/v1/namespaces/demo-rbac/pods
{
"kind": "PodList",
"apiVersion": "v1",
"metadata": {
"resourceVersion": "60875210"
},
"items": [
{
"metadata": {
"name": "kubia-manual-v2-demo-rbac",
"namespace": "demo-rbac",
...................
上述curl命令,api server地址可以替换为
curl -k -H “Authorization: Bearer $(cat /var/run/secrets/kubernetes.io/serviceaccount/token)” https://123.123.0.1:443/api/v1/namespaces/demo-rbac/pods
对应在pod内执行查询 :
# env|grep -i kube
KUBERNETES_SERVICE_PORT=443
KUBERNETES_SERVICE_HOST=123.123.0.1
- 验证无权限操作
尝试执行未授予权限的操作,例如删除一个Pod:
kubectl delete pod <pod-name> -n demo-rbac --as=system:serviceaccount:demo-rbac:demo-user
你会看到一个错误,表明没有删除Pod的权限。
或者 查看 role的操作,也会没权限:
kubectl get role -n demo-rbac --as=system:serviceaccount:demo-rbac:demo-user
更多推荐
已为社区贡献31条内容
所有评论(0)