微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何防止用户创建具有特定标签的 pod?

如何解决如何防止用户创建具有特定标签的 pod?

我知道如何使用带有 X.509 证书的 RBAC 来识别 kubectl用户并限制他们(使用 RoleRoleBinding)在命名空间中创建任何类型的 Pod .但是,我不知道如何阻止他们在他们尝试创建的 pod(或任何资源)上放置特定标签

我想做的是:

  1. 创建一个 NetworkPolicy,仅允许其他命名空间中带有 group: cross-ns 标签的资源访问 special-namespace 中的资源
  2. 一个用户无法创建带有 group: cross-ns 标签的 Pod 或其他资源
  3. 让另一个用户可以创建带有 group: cross-ns
  4. 标签的资源

这可能吗?

解决方法

您可以使用名为 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。

假设我有两个用户(johndave),但只有 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 举报,一经查实,本站将立刻删除。