【问题标题】:How to enforce policies for manifests in Kubernetes?如何在 Kubernetes 中执行清单策略?
【发布时间】:2023-03-25 02:40:02
【问题描述】:

我已经建立了一个基于 Kubernetes 的自助服务平台,我们为每个团队创建命名空间并允许他们“在命名空间内做任何他们想做的事情”(我们设置了资源限制,因此没有人可以杀死整个集群)。

但是,现在我想在整个组织中实施某种标准。例如,我希望每个 PodSpec 定义自己的资源限制,并且我希望每个资源都有一个标签来指定它属于哪个应用程序。

是否有一种机制允许 API 服务器根据一组规则检查正在应用的清单,如果检查失败,则清单被拒绝。

例如,以下清单将被拒绝,因为它既没有标签也没有设置资源限制。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 2
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80

但以下清单会成功,因为它满足所有规则:

api版本:apps/v1 种类:部署 元数据: 名称:nginx-部署 标签: 应用程序:foobar 规格: 选择器: 匹配标签: 应用程序:nginx 复制品:2 模板: 元数据: 标签: 应用程序:nginx 规格: 容器: - 名称:nginx 图片:nginx:1.7.9 端口: - 容器端口:80 资源: 限制: CPU:“1” 请求: cpu:“0.5”

【问题讨论】:

    标签: kubernetes kubernetes-apiserver kube-apiserver


    【解决方案1】:

    是否有一种机制允许 API 服务器根据一组规则检查正在应用的清单,如果检查失败,则清单被拒绝。

    一般来说,这可以通过custom admission controller 或自定义代理来解决。这取决于您的需求,可能并不那么容易。

    命名空间的资源限制

    我们为每个团队创建命名空间,并允许他们“在命名空间内为所欲为”(我们设置了资源限制,因此没有人可以杀死整个集群)。

    我希望每个 PodSpec 定义自己的资源限制

    您在这里寻找的可能是每个命名空间的 Limit Ranges,可能还有默认值。

    使用资源配额,集群管理员可以在命名空间的基础上限制资源消耗和创建。在命名空间中,Pod 或容器可以消耗命名空间资源配额所定义的 CPU 和内存。人们担心一个 Pod 或 Container 可能会垄断所有资源。 Limit Range 是一种通过命名空间中的 Pod 或 Container 来限制资源的策略。

    强制标签据我所知这不可能,yet

    【讨论】:

      【解决方案2】:

      您可以使用 Open Policy Agent (OPA)Gatekeeper 对资源清单强制执行自定义策略。

      OPA 是一个通用策略引擎,Gatekeeper 提供 CRD 和验证准入控制 webhook 以在 Kubernetes 中定义和执行 OPA 策略。

      您可以从字面上描述资源清单的各个方面的政策,Gatekeeper 会拒绝任何违反政策的资源。

      这是一个demo,它展示了 Gatekeeper 的工作原理。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-28
        • 2021-10-20
        • 1970-01-01
        • 2019-11-26
        相关资源
        最近更新 更多