如何在 Kubernetes 中执行清单策略?
Posted
技术标签:
【中文标题】如何在 Kubernetes 中执行清单策略?【英文标题】:How to enforce policies for manifests in Kubernetes? 【发布时间】:2020-03-07 12:40:20 【问题描述】:我已经建立了一个基于 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”【问题讨论】:
【参考方案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 的工作原理。
【讨论】:
以上是关于如何在 Kubernetes 中执行清单策略?的主要内容,如果未能解决你的问题,请参考以下文章
Kubernetes 学习总结(30)—— Kubernetes YAML 最佳实践和策略
Kubernetes 学习总结(30)—— Kubernetes YAML 最佳实践和策略
Docker&Kubernetes ❀ Kubernetes集群资源Pod资源配置清单
Docker&Kubernetes ❀ Kubernetes集群资源Pod资源配置清单