kubernetes 如何防止用户创建带有特定标签的Pod?

m4pnthwp  于 11个月前  发布在  Kubernetes
关注(0)|答案(1)|浏览(125)

我知道如何使用X.509证书的RBAC来识别kubectl的用户,并限制他们(使用RoleRoleBinding)在命名空间中创建任何类型的pod。但是,我不知道如何阻止他们在他们试图创建的pod(或任何资源)上放置特定的标签。
我想做的是:
1.创建一个NetworkPolicy,只允许其他名称空间中带有标签group: cross-ns的资源访问special-namespace中的资源
1.有一个用户无法创建标签为group: cross-ns的pod或其他资源
1.让另一个用户可以创建标签为group: cross-ns的资源
这可能吗?

6tdlim6h

6tdlim6h1#

您可以使用Kubernetes原生策略引擎Kyverno
Kyverno在Kubernetes集群中作为动态准入控制器运行。Kyverno从kube-apiserver接收验证和变更准入webhook HTTP回调,并应用匹配策略返回执行准入策略或拒绝请求的结果。
Kyverno策略是可以应用于整个集群(ClusterPolicy)或特定命名空间(Policy)的规则集合。
我将创建一个示例来说明它是如何工作的。
首先,我们需要安装Kyverno,您可以选择直接从最新版本清单安装Kyverno,或者使用Helm(请参阅:快速入门指南):

$ 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-adminClusterRole才能修改标签为purpose的Pod。
假设我有两个用户(johndave),但只有john通过ClusterRoleBinding链接到cluster-adminClusterRole

$ 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中找到。

相关问题