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 环境架构总览

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

Kyverno实验环境架构图 Kyverno实验环境架构 Kubernetes 集群(Minikube / Kind) 控制平面 kube-apiserver etcd / scheduler 工作节点 1 kubelet / kube-proxy 容器运行时 工作节点 2 kubelet / kube-proxy 容器运行时 kyverno 命名空间 Admission Controller Webhook处理 Background Controller 后台扫描 Kyverno CLI 策略测试 说明:Kyverno通过Admission Webhook拦截资源创建/更新请求,Background Controller负责周期性扫描现有资源

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