3. 环境准备:Kubernetes集群搭建(Minikube/Kind)与Kyverno Helm安装
本章是课程的基础环境搭建环节。你将完成两件事:在本地快速拉起一个Kubernetes集群(提供Minikube与Kind两种方案),并通过Helm Chart安装Kyverno策略引擎。环境准备的质量直接影响后续规则编写与流水线集成的调试效率,请按步骤逐一验证。
推荐选择: 若你使用Linux/macOS且内存≥8GB,优先选择Kind(轻量、启动快);若你使用Windows或需要完整Kubernetes Dashboard体验,选择Minikube。两种方案在本课程中功能等价。
3.1 集群搭建方案对比
| 特性 | Minikube | Kind (Kubernetes in Docker) |
|---|---|---|
| 底层技术 | 虚拟机(HyperKit/Hyper-V/VirtualBox) | Docker容器 |
| 启动速度 | 中等(约2-3分钟) | 快(约30-60秒) |
| 资源占用 | 较高(默认2GB内存) | 较低(默认1GB内存) |
| 多节点支持 | 支持(需指定驱动) | 原生支持(通过配置文件) |
| 持久化存储 | 内置HostPath Provisioner | 需额外安装CSI驱动 |
| 适用场景 | 本地开发、学习、测试 | CI/CD流水线、快速验证 |
3.2 方案一:使用Minikube搭建集群
3.2.1 安装Minikube与kubectl
# 下载Minikube(Linux/macOS)
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
# 安装kubectl
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
sudo install kubectl /usr/local/bin/kubectl
# 验证安装
minikube version
kubectl version --client
3.2.2 启动集群
# 启动单节点集群(指定驱动为docker)
minikube start --driver=docker --cpus=2 --memory=2048
# 验证集群状态
kubectl cluster-info
kubectl get nodes
验证输出示例: 执行
kubectl get nodes 应看到 minikube 节点状态为 Ready,版本为 v1.28+。
3.3 方案二:使用Kind搭建集群
3.3.1 安装Kind与kubectl
# 安装Kind(Linux/macOS)
curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.20.0/kind-linux-amd64
chmod +x ./kind
sudo mv ./kind /usr/local/bin/kind
# 安装kubectl(同上)
# 验证安装
kind version
kubectl version --client
3.3.2 创建多节点集群(推荐)
# 创建集群配置文件 kind-config.yaml
cat <<EOF > kind-config.yaml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: worker
- role: worker
EOF
# 启动集群
kind create cluster --config kind-config.yaml --name kyverno-demo
# 验证集群
kubectl cluster-info --context kind-kyverno-demo
kubectl get nodes
注意: Kind集群默认使用
kind-{cluster-name} 作为kubeconfig上下文名称。后续所有kubectl命令需指定 --context kind-kyverno-demo,或通过 kubectl config use-context kind-kyverno-demo 切换默认上下文。
3.4 集群环境验证
无论选择哪种方案,请执行以下验证清单,确保集群就绪:
- 节点状态:
kubectl get nodes所有节点均为Ready - 系统Pod:
kubectl get pods -n kube-system核心组件(coredns、kube-proxy等)均为Running - 存储类:
kubectl get storageclass存在默认存储类(Minikube自动创建,Kind需手动安装) - 网络连通:
kubectl run test-pod --image=busybox --rm -it --restart=Never -- wget -O- http://kubernetes.default.svc应返回HTTP响应
3.5 安装Kyverno Helm Chart
3.5.1 添加Helm仓库
# 添加Kyverno官方Helm仓库
helm repo add kyverno https://kyverno.github.io/kyverno/
helm repo update
3.5.2 安装Kyverno
# 创建命名空间
kubectl create namespace kyverno
# 使用Helm安装Kyverno(推荐生产级配置)
helm install kyverno kyverno/kyverno \
--namespace kyverno \
--version v3.0.0 \
--set replicaCount=1 \
--set webhookCleanup.enabled=true \
--set global.image.registry=docker.io
# 等待Pod就绪
kubectl wait --for=condition=Ready pods --all -n kyverno --timeout=120s
参数说明:
replicaCount=1 适用于本地开发环境,减少资源占用;webhookCleanup.enabled=true 确保卸载时自动清理MutatingWebhookConfiguration与ValidatingWebhookConfiguration。
3.5.3 验证Kyverno安装
# 检查Pod状态
kubectl get pods -n kyverno
# 检查Webhook配置
kubectl get mutatingwebhookconfigurations
kubectl get validatingwebhookconfigurations
# 检查Kyverno Service
kubectl get svc -n kyverno
预期输出应包含 kyverno-admission-controller 和 kyverno-background-controller 两个Pod处于 Running 状态,以及对应的Webhook配置。
3.6 环境架构总览
下图展示了本章搭建的完整环境组件及其关系:
3.7 快速验证:部署测试策略
安装完成后,部署一条简单的Kyverno策略验证环境是否正常工作:
# 创建测试策略:禁止latest镜像标签
cat <<EOF | kubectl apply -f -
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: disallow-latest-tag
spec:
validationFailureAction: Audit
rules:
- name: require-image-tag
match:
any:
- resources:
kinds:
- Pod
validate:
message: "Using 'latest' tag for image is not allowed."
pattern:
spec:
containers:
- image: "!*:latest"
EOF
# 验证策略状态
kubectl get clusterpolicy disallow-latest-tag -o wide
# 测试:创建使用latest标签的Pod(应被审计标记)
kubectl run test-latest --image=nginx:latest --dry-run=server -o yaml | grep -A5 "policy"
预期结果:
ClusterPolicy 状态显示 Ready: true;dry-run 输出中应包含 policy: disallow-latest-tag 的审计警告信息,表明Kyverno Webhook已成功拦截并评估请求。
3.8 环境清理与重置
若需重新搭建环境,请按以下顺序清理:
# 卸载Kyverno
helm uninstall kyverno -n kyverno
kubectl delete namespace kyverno
# 删除集群(根据你的方案选择)
minikube delete # Minikube
kind delete cluster --name kyverno-demo # Kind