KubernetesAPI服务器安全:使用角色和绑定进行访问控制
立即解锁
发布时间: 2025-08-21 00:51:34 阅读量: 2 订阅数: 11 


Kubernetes实战:从入门到精通
### Kubernetes API服务器安全:角色与绑定的使用
在Kubernetes集群中,确保API服务器的安全性至关重要。角色(Role)和角色绑定(RoleBinding)以及集群角色(ClusterRole)和集群角色绑定(ClusterRoleBinding)是实现基于角色的访问控制(RBAC)的关键组件。下面将详细介绍它们的使用方法和应用场景。
#### 1. 使用角色(Role)和角色绑定(RoleBinding)
角色资源定义了可以对哪些资源执行哪些操作。以下是一个定义角色的示例,该角色允许用户在`foo`命名空间中获取和列出服务(Services):
```yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: foo
name: service-reader
rules:
- apiGroups: [""]
verbs: ["get", "list"]
resources: ["services"]
```
**注意**:指定资源时必须使用复数形式。
创建这个角色可以使用以下命令:
```bash
$ kubectl create -f service-reader.yaml -n foo
role "service-reader" created
```
如果使用GKE,上述命令可能会失败,因为你可能没有集群管理员权限。可以使用以下命令授予权限:
```bash
$ kubectl create clusterrolebinding cluster-admin-binding --clusterrole=cluster-admin [email protected]
```
也可以使用`kubectl create role`命令在`bar`命名空间创建相同的角色:
```bash
$ kubectl create role service-reader --verb=get --verb=list --resource=services -n bar
role "service-reader" created
```
创建角色后,还需要将角色绑定到服务账户(ServiceAccount)。角色只定义了可以执行的操作,但没有指定谁可以执行这些操作。通过创建角色绑定资源可以将角色绑定到主体,主体可以是用户、服务账户或用户组。
将角色绑定到默认服务账户的命令如下:
```bash
$ kubectl create rolebinding test --role=service-reader --serviceaccount=foo:default -n foo
rolebinding "test" created
```
查看角色绑定的YAML文件:
```bash
$ kubectl get rolebinding test -n foo -o yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: test
namespace: foo
...
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: service-reader
subjects:
- kind: ServiceAccount
name: default
namespace: foo
```
现在可以从`foo`命名空间的Pod中列出服务:
```bash
/ # curl localhost:8001/api/v1/namespaces/foo/services
{
"kind": "ServiceList",
"apiVersion": "v1",
"metadata": {
"selfLink": "/api/v1/namespaces/foo/services",
"resourceVersion": "24906"
},
"items": []
}
```
还可以在角色绑定中包含其他命名空间的服务账户。例如,编辑`foo`命名空间的角色绑定,添加`bar`命名空间的默认服务账户:
```bash
$ kubectl edit rolebinding test -n foo
```
在`subjects`列表中添加以下内容:
```yaml
subjects:
- kind: ServiceAccount
name: default
namespace: bar
```
现在可以从`bar`命名空间的Pod中列出`foo`命名空间的服务。
#### 2. 使用集群角色(ClusterRole)和集群角色绑定(ClusterRoleBinding)
角色和角色绑定是命名空间资源,而集群角色和集群角色绑定是集群级别的资源,它们不局限于特定的命名空间。
##### 2.1 允许访问集群级资源
集群角色可以用于允许访问集群级资源,如持久卷(PersistentVolumes)。创建一个名为`pv-reader`的集群角色:
```bash
$ kubectl create clusterrole pv-reader --verb=get,list --resource=persistentvolumes
clusterrole "pv-reader" created
```
查看集群角色的YAML文件:
```bash
$ kubectl get clusterrole pv-reader -o yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: pv-reader
resourceVersion: "39932"
selfLink: ...
uid: e9ac1099-30e2-11e7-955c-080027e6b159
rules:
- apiGroups:
- ""
resources:
- persistentvolumes
verbs:
- get
- list
```
在绑定集群角色之前,验证Pod是否可以列出持久卷:
```bash
/ # curl localhost:8001/api/v1/persistentvolumes
User "system:serviceaccount:foo:default" canno
```
0
0
复制全文