如何解决如何防止用户创建具有特定标签的 pod?
我知道如何使用带有 X.509 证书的 RBAC 来识别 kubectl
的用户并限制他们(使用 Role
和 RoleBinding
)在命名空间中创建任何类型的 Pod .但是,我不知道如何阻止他们在他们尝试创建的 pod(或任何资源)上放置特定标签。
我想做的是:
- 创建一个
NetworkPolicy
,仅允许其他命名空间中带有group: cross-ns
标签的资源访问special-namespace
中的资源 - 有一个用户无法创建带有
group: cross-ns
标签的 Pod 或其他资源 - 让另一个用户可以创建带有
group: cross-ns
标签的资源
这可能吗?
解决方法
您可以使用名为 Kyverno 的 Kubernetes 原生策略引擎:
Kyverno 在 Kubernetes 集群中作为动态准入控制器运行。 Kyverno 从 kube-apiserver 接收验证和变异准入 Webhook HTTP 回调,并应用匹配策略来返回执行准入策略或拒绝请求的结果。
Kyverno 策略是可应用于整个集群 (ClusterPolicy
) 或特定命名空间 (Policy
) 的规则集合。
我将创建一个示例来说明它是如何工作的。
首先我们需要安装 Kyverno,您可以选择直接从最新的发布清单安装 Kyverno,或者使用 Helm(参见:Quick Start guide):
$ kubectl create -f https://raw.githubusercontent.com/kyverno/kyverno/main/definitions/release/install.yaml
安装成功后,让我们创建一个简单的ClusterPolicy
:
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: labeling-policy
spec:
validationFailureAction: enforce
background: false
rules:
- name: deny-rule
match:
resources:
kinds:
- Pod
exclude:
clusterRoles:
- cluster-admin
preconditions:
- key: "{{request.object.metadata.labels.purpose}}"
operator: Equals
value: "*"
validate:
message: "Using purpose label is not allowed for you"
deny: {}
在上面的示例中,仅使用 cluster-admin
ClusterRole
您可以修改带有标签 purpose
的 Pod。
假设我有两个用户(john
和 dave
),但只有 john
通过 cluster-admin
链接到 ClusterRole
ClusterRoleBinding
:
$ kubectl describe clusterrolebinding john-binding
Name: john-binding
Labels: <none>
Annotations: <none>
Role:
Kind: ClusterRole
Name: cluster-admin
Subjects:
Kind Name Namespace
---- ---- ---------
User john
最后,我们可以测试它是否按预期工作:
$ kubectl run test-john --image=nginx --labels purpose=test --as john
pod/test-john created
$ kubectl run test-dave --image=nginx --labels purpose=test --as dave
Error from server: admission webhook "validate.kyverno.svc" denied the request:
resource Pod/default/test-dave was blocked due to the following policies
labeling-policy:
deny-rule: Using purpose label is not allowed for you
$ kubectl get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
test-john 1/1 Running 0 32s purpose=test
可以在 Kyverno Writing Policies documentation 中找到更多带有详细说明的示例。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。