2. 环境准备:Kubernetes集群搭建与Kyverno安装

本章是实战调试的基础。你将依次完成:本地Kubernetes集群的搭建、使用Helm Chart安装Kyverno、以及验证所有组件运行正常。一个干净、可复现的环境是后续策略调试与流水线集成的保障。

2.1 本地Kubernetes集群搭建(Minikube vs K3s)

对于本地开发和调试,推荐使用轻量级Kubernetes发行版。下表对比了两种主流方案,帮助你根据资源情况做出选择。

特性 Minikube K3s
架构 单节点/多节点(需驱动) 单节点(Server+Agent合一)
资源占用 中等(~2GB RAM) 低(~512MB RAM)
启动速度 较慢(需下载ISO) 极快(原生二进制)
CNI默认 Calico / Flannel Flannel(内置)
适用场景 完整K8s API兼容性测试 边缘/CI环境/资源受限
推荐选择:本课程后续调试操作均基于K3s。如果你使用Minikube,请确保分配至少2核CPU和4GB内存,并启用Ingress插件。

2.1.1 使用K3s快速搭建集群

执行以下命令,即可在本地启动一个单节点K3s集群:

# 安装K3s(默认使用containerd)
curl -sfL https://get.k3s.io | sh -

# 检查节点状态
sudo k3s kubectl get node

# 导出kubeconfig(后续Kyverno和流水线工具需要)
mkdir -p ~/.kube
sudo cp /etc/rancher/k3s/k3s.yaml ~/.kube/config
sudo chown $(id -u):$(id -g) ~/.kube/config
export KUBECONFIG=~/.kube/config

验证集群就绪:

kubectl cluster-info
kubectl get pods -A

预期输出中,coredns、local-path-provisioner、metrics-server 等核心组件应处于 Running 状态。

2.2 安装Kyverno Helm Chart

Kyverno官方推荐使用Helm进行部署,便于版本管理和参数定制。本课程使用Kyverno v1.12+。

2.2.1 添加Helm仓库并安装

# 添加Kyverno Helm仓库
helm repo add kyverno https://kyverno.github.io/kyverno/
helm repo update

# 创建命名空间
kubectl create namespace kyverno

# 安装Kyverno(包含Admission Controller、Cleanup Controller、Reports Controller)
helm install kyverno kyverno/kyverno \
  --namespace kyverno \
  --create-namespace \
  --set admissionController.replicas=1 \
  --set backgroundController.replicas=1 \
  --set cleanupController.replicas=1 \
  --set reportsController.replicas=1
关键参数说明:
  • admissionController.replicas=1:生产环境建议至少2副本,本地调试1副本即可。
  • backgroundController:负责后台扫描(如检查已有资源是否违反策略)。
  • cleanupController:负责清理过期资源(如TTL策略)。
  • reportsController:负责生成策略报告(PolicyReport)。

2.2.2 验证Helm安装状态

# 查看Helm Release状态
helm list -n kyverno

# 查看Pod是否全部Running
kubectl get pods -n kyverno -o wide

预期输出应包含以下Pod:

Pod名称前缀 组件 状态
kyverno-admission-controller-* 准入控制器 Running
kyverno-background-controller-* 后台扫描控制器 Running
kyverno-cleanup-controller-* 清理控制器 Running
kyverno-reports-controller-* 报告控制器 Running

2.3 验证Kyverno安装状态

安装完成后,需要通过多种方式确认Kyverno正常工作,包括API可用性、Webhook注册、以及策略执行能力。

2.3.1 检查Webhook配置

Kyverno通过MutatingWebhookConfiguration和ValidatingWebhookConfiguration拦截资源请求。检查它们是否已注册:

kubectl get mutatingwebhookconfigurations -l app.kubernetes.io/instance=kyverno
kubectl get validatingwebhookconfigurations -l app.kubernetes.io/instance=kyverno

预期应看到类似 kyverno-resource-mutating-webhook-cfg 和 kyverno-resource-validating-webhook-cfg 的条目。

2.3.2 测试策略执行

部署一个简单的“禁止latest镜像标签”策略,验证Kyverno能否正确拦截:

cat <

尝试创建一个使用 latest 标签的Pod,应被拒绝:

kubectl run nginx-latest --image=nginx:latest
# 预期输出:Error from server: admission webhook "validate.kyverno.svc" denied the request: ...
常见问题:如果Webhook拒绝请求但策略未生效,请检查 kyverno-admission-controller 的日志:kubectl logs -n kyverno -l app.kubernetes.io/name=kyverno。常见原因包括证书未就绪或Webhook配置未正确更新。

2.4 环境架构总览

下图展示了本章搭建的完整环境组件及其关系:

Kyverno本地调试环境架构图 Kyverno本地调试环境架构 K3s / Minikube 集群 kube-apiserver 集群入口 Kyverno 控制平面 Admission Controller Background Controller Cleanup Controller Reports Controller ClusterPolicy CRD 存储 kubectl / CI 资源请求 Webhook 拦截 策略即代码

2.5 环境就绪检查清单

完成上述步骤后,使用以下清单逐项确认环境可用:

检查项 验证命令 预期结果
集群节点就绪 kubectl get node 节点状态为 Ready
Kyverno Pod运行 kubectl get pods -n kyverno 4个Controller均为 Running
Webhook注册 kubectl get mutatingwebhookconfigurations 至少1条Kyverno相关条目
策略CRD可用 kubectl get crd | grep kyverno 显示 clusterpolicies.kyverno.io 等
策略执行测试 部署 disallow-latest-tag 并测试 使用 latest 标签的Pod被拒绝
调试提示:如果Webhook未生效,检查 kyverno-admission-controller 日志中的证书错误。常见原因是Helm安装时 --set admissionController.replicas=0 导致Webhook配置未创建。重新运行Helm upgrade并设置副本数为1即可修复。