能否通过Kubernetes RBAC规则禁止创建LoadBalancer类型的Service?
原生RBAC无法实现按Service的type字段做细粒度权限控制,因为RBAC的权限规则仅支持对资源类型、操作动词、API组、资源名称做过滤,不支持校验资源的spec字段内容,你当前的RBAC配置禁用了所有Service的写权限,显然不符合只限制LoadBalancer类型的需求。
你可以通过以下两种常用方案实现需求:
方案1:使用ResourceQuota限制(无需额外组件,最简单)
直接在对应命名空间下创建资源配额,将LoadBalancer类型Service的上限设为0即可,完全不影响其他类型Service的创建:
apiVersion: v1 kind: ResourceQuota metadata: name: disable-loadbalancer-service namespace: default # 替换为你要限制的命名空间 spec: hard: services.loadbalancers: "0"
配置生效后,所有尝试创建LoadBalancer类型Service的请求都会被配额校验直接拦截,其他NodePort、ClusterIP类型的Service可以正常创建。
方案2:使用准入控制器实现更灵活的管控
如果需要跨命名空间统一管控、或者只限制特定用户/角色的创建行为,可以使用准入控制器实现,常用的实现有两种:
2.1 内置ValidatingAdmissionPolicy(K8s 1.26及以上版本支持,无需第三方组件)
先定义校验策略:
apiVersion: admissionregistration.k8s.io/v1 kind: ValidatingAdmissionPolicy metadata: name: deny-loadbalancer-service spec: failurePolicy: Fail matchConstraints: resourceRules: - apiGroups: [""] apiVersions: ["v1"] operations: ["CREATE", "UPDATE"] resources: ["services"] validations: - expression: "object.spec.type != 'LoadBalancer'" message: "禁止创建LoadBalancer类型的Service"
再创建策略绑定,将规则应用到对应的命名空间或者用户主体即可。
2.2 第三方准入控制器(Kyverno/OPA Gatekeeper)
如果集群已经部署了Kyverno,直接应用如下集群策略即可全局禁止LoadBalancer类型Service的创建:
apiVersion: kyverno.io/v1 kind: ClusterPolicy metadata: name: deny-loadbalancer-services spec: validationFailureAction: enforce rules: - name: check-service-type match: any: - resources: kinds: - Service validate: message: "LoadBalancer类型Service被禁止创建" pattern: spec: type: "!LoadBalancer"
内容的提问来源于stack exchange,提问作者user3407789
相关产品推荐
相关产品推荐

