使用Webhook为Kubernetes达成基于标签的权限控制
发布时间:2021-06-05 21:18:57 所属栏目:云计算 来源:互联网
导读:Kubernetes支持名称空间级别的权限控制。但是,有时这不能满足我们的要求。例如,在Akraino ICN项目中,我们有一些高级权限要求:多个用户可以在同一名称空间中创建,更新或删除一种资源,但不能更新或删除其他人创建的对象。 为了满足这一要求,我们使用Web
|
Kubernetes支持名称空间级别的权限控制。但是,有时这不能满足我们的要求。例如,在Akraino ICN项目中,我们有一些高级权限要求:多个用户可以在同一名称空间中创建,更新或删除一种资源,但不能更新或删除其他人创建的对象。
为了满足这一要求,我们使用Webhook在Kubernetes中设计并实现了基于标签的权限控制机制。通常,webhooks用于验证资源或设置资源的默认值。在本文中,我们使用webhook来控制权限。
许可系统的设计
在Kubernetes中,用户或服务帐户可以绑定到一个或多个角色。每个角色定义其权限规则。例如,以下定义要求sdewan-test角色可以在默认名称空间中创建或更新类型为Mwan3Rule的自定义资源实例(CR),并且可以获取Mwan3Policy CR。
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
Annotations:
name: sdewan-test
namespace: default
rules:
- apiGroups:
- ""
resources:
- mwan3rules
verbs:
- create
- update
- apiGroups:
- ""
resources:
- mwan3policies
verbs:
- get
我们使用json格式的注释sdewan-bucket-type-permission扩展了角色。
在注释中,我们可以定义基于标签的权限。例如,下面显示的角色扩展了sdewan-test角色权限:sdewan-test只能创建/更新带有标签sdewan-bucket-type=app-intent或sdewan-bucket-type=k8s-service的Mwan3Rule(json键指定自定义资源类型)CR。而且它只能获得带有标签sdewan-bucket-type=app-intent的Mwan3Policy CR。
实际上,我们也支持通配符匹配。例如,我们可以使用mwan3*来同时匹配mwan3policies和mwan3rules。
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
annotations:
sdewan-bucket-type-permission: |-
{ "mwan3rules": ["app-intent", "k8s-service"],
"mwan3policies": ["app-intent"] }
name: sdewan-test
namespace: default
rules:
- apiGroups:
- ""
resources:
- mwan3rules
verbs:
- create
- update
- apiGroups:
- ""
resources:
- mwan3policies
verbs:
- get
Kubernetes Webhook负责解析角色注释。让我用简单的词来描述什么是准入webhook。我们可以将webhook视为Web服务,通常它在Kubernetes集群中作为pod运行。
当Kubernetes api收到请求时,kube-api可以在将对象保存到etcd中之前调用webhook API。如果webhook返回allowed=true,则kube-api继续将对象持久保存到etcd中。否则,kube-api拒绝该请求。
Webhook请求主体具有一个名为userInfo的字段,该字段指示谁在发出Kubernetes api请求。从用户信息中,webhook可以获取角色信息,然后获取角色注释。通过将注释中描述的标签级别权限与CR标签进行比较,webhook可以决定是否允许该请求。
实施权限控制系统
我们已经通过Akraino ICN项目中的kubebuilder框架实现了基于标签的权限系统。这里的假设是已经实现了一些自定义资源定义(CRD)(例如Mwan3Policy和Mwan3Rule)和相应的控制器。
Kubebuilder可以生成基本的CRD,控制器代码和Webhook代码。要创建一个新的webhook,我们运行以下kubebuilder命令:
kubebuilder create webhook --group batch --version v1 --kind CronJob --programmatic-validation
此命令利用controller-runtime builder来创建验证Webhook。该命令还会创建webhook server,该server接受来自kube-api服务器的https请求。它甚至生成解析http请求正文并将其转换为CRD结构实例的代码。
开发人员只需要编写代码来验证CRD实例内容。这对于大多数Webhook情况都是有用的。但这不能满足我们的要求,因为我们需要位于https请求正文中的UserInfo而不是CRD实例
![]() (编辑:怀化站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


