Kyverno(希腊语为“治理”)是专为 Kubernetes 设计的策略引擎。它的许多功能中的一些包括:
策略作为 Kubernetes 资源(无需学习新语言!)
验证、变更或生成任何资源
验证软件供应链安全的容器镜像
巡检镜像元数据
使用标签选择器和通配符匹配资源
使用叠加层进行验证和变更(比如 Kustomize!)
跨命名空间同步配置
使用准入控制阻止不符合要求的资源,或报告违反策略的情况
在应用到集群之前,在 CI/CD 管道中使用 Kyverno CLI 测试策略并验证资源
使用 git 和 kustomize 等熟悉的工具像管理代码一样管理策略
Kyverno 允许集群管理员独立于工作负载配置来管理特定于环境的配置,并为其集群实施配置最佳实践。 Kyverno 可用于扫描现有工作负载以使其符合最佳实践,也可用于通过阻止或更改 API 请求来强制执行最佳实践。
Kyverno 如何工作?
Kyverno 在 Kubernetes 集群中作为动态准入控制器运行。 Kyverno 从 kube-apiserver 接收验证和修改准入 webhook HTTP 回调,并应用匹配策略返回执行准入策略或拒绝请求的结果。
Kyverno 策略可以使用资源种类、名称和标签选择器匹配资源。 名称中支持通配符。
变更策略可以编写为overlay(类似于 Kustomize)或 RFC 6902 JSON 补丁。 验证策略还使用 overlay 样式语法,支持模式匹配和条件(if-then-else)处理。
使用 Kubernetes 事件捕获策略执行结果。 Kyverno 还报告现有资源的政策违规行为。
下图显示了 Kyverno 的高级架构:
Kyverno 的高可用性安装可以运行多个副本, Kyverno 的每个副本将具有多个执行不同功能的控制器。Webhook 处理来自 Kubernetes API Server 的 AdmissionReview 请求,其 Monitor 组件生成和管理所需的配置。PolicyController 监视策略资源并根据配置的扫描间隔启动后台扫描。GenerateController 管理生成的资源的生命周期。
快速开始
本小节将帮助您安装 Kyverno 并创建您的第一个策略。
注意
您的 Kubernetes 集群版本必须高于 v1.14,否则会增加 webhook 超时。 检查兼容性矩阵以确保您的 Kubernetes 版本受支持。 要检查版本,请输入 kubectl version。
您可以选择直接从最新版本清单安装 Kyverno 或使用 Helm。
要使用最新版本清单(可能是预发行版)安装 Kyverno:
kubectl create -f https://raw.githubusercontent.com/kyverno/kyverno/main/config/install.yaml
也可以使用 Helm chart 安装 Kyverno:
# 添加 Helm 仓库
helm repo add kyverno https://kyverno.github.io/kyverno/
# 扫描你的 Helm 仓库,以获取最新可用的 chart
helm repo update
# 将 Kyverno Helm char 安装到一个新的叫作 "kyverno" 的命名空间中
helm install kyverno kyverno/kyverno -n kyverno --create-namespace
将以下策略添加到您的集群。 它包含一个验证规则,要求所有 Pod 都有一个 app.kubernetes.io/name 标签。 Kyverno 支持不同的规则类型来验证、变更、生成和验证镜像配置。策略属性 validationFailureAction 设置为强制阻止不合规的 API 请求(使用默认值 audit 将报告违规但不阻止请求。)
kubectl create -f- << EOF
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: require-labels
spec:
validationFailureAction: enforce
rules:
- name: check-for-labels
match:
any:
- resources:
kinds:
- Pod
validate:
message: "label 'app.kubernetes.io/name' is required"
pattern:
metadata:
labels:
app.kubernetes.io/name: "?*"
EOF
尝试创建一个没有所需标签的 Deployment:
kubectl create deployment nginx --image=nginx
你会看到如下报错信息:
error: failed to create deployment: admission webhook "validate.kyverno.svc-fail" denied the request:
resource Deployment/default/nginx was blocked due to the following policies
require-labels:
autogen-check-for-labels: 'validation error: label ''app.kubernetes.io/name'' is
required. Rule autogen-check-for-labels failed at path /spec/template/metadata/labels/app.kubernetes.io/name/'
注意
Kyverno 可以配置为排除系统命名空间,如 kube-system 和 kyverno。 确保在用户定义的命名空间或默认命名空间中创建 Deployment。
尽管 ClusterPolicy 在 Pod 上匹配,但 Kyverno 智能地将其应用于所有能够默认生成 Pod 的源,包括上面的 Deployment。
创建一个带有所需标签的 Pod。 例如,使用此命令:
kubectl run nginx --image nginx --labels app.kubernetes.io/name=nginx
此 Pod 配置符合策略,未被阻止。
恭喜,您刚刚在 Kubernetes 集群中实施了一项策略!
通过删除所有集群策略进行清理:
kubectl delete cpol --all