介绍 RBAC 授权插件
REST 客户端发送 GET、 POST、 PUT、 DELETE 和其他类型的 HTTP 请求到特定的 URL 路径上,这些路径表示特定的 REST 资源。在 Kubernetes 中,这些资源是 Pod、 Service、 Secret,等等。 以下是 Kubernetes 请求动作的一些例子
- 获取 pod
- 创建服务
- 更新密钥
这些动词(get、 create、 update)映射到客户端请求的 HTTP 方法(GET、 POST、 PUT)上
Kubernetes有一个很基本的特性就是它的所有资源对象都是模型化的 API 对象,允许执行 CRUD(Create、Read、Update、Delete)操作(也就是我们常说的增、删、改、查操作),比如下面的这下资源:
- Pods
- ConfigMaps
- Deployments
- Nodes
- Secrets
- Namespaces
上面这些资源对象的可能存在的操作有:
- create
- get
- delete
- list
- update
- edit
- watch
- exec
RBAC 授权规则是通过四种资源来进行配置的,它们可以分为两个组:
- Role(角色)和 ClusterRole ( 集群角色),它们指定了在资源上可以执行哪些 动词。
- RoleBinding (角色绑定)和 ClusterRoleBinding (集群角色绑定),它们将上 述角色绑定到特定的用户、组或 ServiceAccounts 上。
角色定义了可以做什么操作,而绑定定义了谁可以做这些操作

使用RBAC
创建ns和pod
创建命名空间和运行 pod 创建一个在命名空间 foo 中的 pod 和另一个在命名空间 bar 中的 pod
kubectl create ns fookubectl run --generator=run-pod/v1 test-foo --image=luksa/kubectl-proxy -n fookubectl create ns barkubectl run --generator=run-pod/v1 test-bar --image=luksa/kubectl-proxy -n bar

查看权限
为了验证 RBAC 是否己经开启并且阻止 pod 读取集群状态,可以使用 curl 命令来列 出 foo 命名空间中的服务
由于没对foo中的serviceaccount设置权限,所以看不到资源
kubectl exec -it -n foo test-foo-5c6b49464c-wd685 curl localhost:8001/api/v1/namespaces/foo/services

使用 Role 和 RoleBinding


cat > foo-reader-role.yaml << EOF
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: foo-reader
namespace: foo
rules:
- apiGroups: ["", "extensions", "apps"]
resources: ["services"]
verbs: ["get", "list"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: foo-reader-rolebinding
namespace: foo
subjects:
- kind: ServiceAccount
name: default
namespace: foo
roleRef:
kind: Role
name: foo-reader
apiGroup: rbac.authorization.k8s.io
EOF

现在有权访问了,但是资源为空
在角色绑定中使用其他命名空间的 ServiceAccount
bar中的pod直接访问foo中的service
kubectl exec -it -n bar test-bar-bcdd89499-87d2n curl localhost:8001/api/v1/namespaces/foo/services

在rolebinding中添加bar的serveraccount
kubectl edit -n foo rolebinding foo-reader-rolebinding

在 foo 命名空间中有一个 RoleBinding,它引用foo中的role角色,并且绑定 foo 和 bar 命名空间中的default ServiceAccount

使用 ClusterRole 和 ClusterRoleBinding
ClusterRole 允许集群级别的资源访问
没有权限前
kubectl exec -it -n bar test-bar-bcdd89499-87d2n curl localhost:8001/api/v1/persistentvolumes

cat > pv-reader.yaml << EOF
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: pv-reader
rules:
- apiGroups: ["", "extensions", "apps"]
resources: ["persistentvolumes"]
verbs: ["get", "list"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: pv-reader
subjects:
- kind: ServiceAccount
name: default
namespace: bar
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: pv-reader
EOF

授权后就能访问了

RBAC web工具
部署permission-manager
官网链接:https://github.com/sighupio/permission-manager
unzip permission-manager-master.zip
部署依赖
kubectl apply -f permission-manager-master/k8s/k8s-seeds/namespace.yml
kubectl apply -f permission-manager-master/k8s/k8s-seeds/

- 修改
Deploy必填Env参数 | Env 名称 | 描述 | | —- | —- | | PORT | 服务器暴露的端口 | | CLUSTER_NAME | 在生成kubeconfig文件中使用的集群名称 | | CONTROL_PLANE_ADDRESS | 在生成kubeconfig文件中的k8s api 地址 | | BASIC_AUTH_PASSWORD | WEB UI 登陆密码(默认用户名为 admin) |
kubectl config show

vim permission-manager-master/k8s/deploy.yaml

kubectl apply -f permission-manager-master/k8s/deploy.yaml


访问web,nortport为32260
账号admin 密码1v2d1e2e67dS
新建一个用户,只能访问bar的namespace下内容


编辑配置文件

切换context
kubectl config get-contexts

kubectl config use-context kubernetes
只能访问bar的namespace下内容
