2. 环境准备:Kubernetes集群搭建、Kyverno安装与配置、kubectl与helm工具准备

本章将搭建完整的实验环境,包括Kubernetes集群、Kyverno策略引擎以及命令行工具链。环境是后续所有巡检策略开发与测试的基础,请按步骤逐一完成。

2.1 环境概览与组件清单

本课程使用轻量级Kubernetes发行版 K3s 作为集群运行时,配合Helm部署Kyverno。所有操作均在单节点上完成,适合本地实验与策略开发。

组件 版本 用途
K3s v1.28.x 轻量级Kubernetes集群
Kyverno v1.12.x Kubernetes原生策略引擎
kubectl v1.28.x Kubernetes命令行工具
Helm v3.14.x Kubernetes包管理器
版本兼容性提示: Kyverno 1.12.x 支持 Kubernetes 1.25–1.29。本课程选用 K3s v1.28 可确保完全兼容。若使用其他K8s发行版,请核对API版本一致性。
环境组件架构关系 环境组件架构关系 物理/虚拟机(Ubuntu 22.04 / macOS / Windows WSL2) K3s 集群(单节点) Kubernetes v1.28 etcd / containerd / CoreDNS kyverno 命名空间 Kyverno Pod / Service / CRDs 命令行工具链 kubectl Helm kyverno CLI(可选) 所有组件运行在同一节点,kubectl 和 Helm 通过 K3s 的 kubeconfig 与集群通信

2.2 安装K3s集群

K3s 是经过CNCF认证的轻量级Kubernetes发行版,安装包仅约60MB,非常适合本地实验环境。以下步骤在Linux(Ubuntu 22.04)上执行,macOS用户可使用 multipass 或 lima 启动虚拟机后操作。

2.2.1 一键安装K3s

# 使用官方安装脚本,默认安装最新稳定版
curl -sfL https://get.k3s.io | sh -

# 等待约30秒,检查节点状态
sudo k3s kubectl get node

# 输出示例:
# NAME     STATUS   ROLES                  AGE   VERSION
# ubuntu   Ready    control-plane,master   30s   v1.28.7+k3s1

2.2.2 配置kubeconfig

K3s 安装后自动生成 /etc/rancher/k3s/k3s.yaml。将 kubeconfig 复制到用户目录并设置环境变量:

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
# 输出示例:
# Kubernetes control plane is running at https://127.0.0.1:6443
# CoreDNS is running at https://127.0.0.1:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
权限注意: K3s 默认使用 k3s 用户运行服务。如果遇到权限拒绝错误,请检查 ~/.kube/config 文件权限是否为 600,并确认当前用户属于 sudo 组。

2.3 安装kubectl与Helm

K3s 自带 kubectl 二进制(路径 /usr/local/bin/kubectl),但建议安装独立版本以便升级。Helm 是部署 Kyverno 的核心工具。

2.3.1 安装独立kubectl

# 下载 kubectl v1.28.7(与集群版本匹配)
curl -LO "https://dl.k8s.io/release/v1.28.7/bin/linux/amd64/kubectl"
chmod +x kubectl
sudo mv kubectl /usr/local/bin/

# 验证版本
kubectl version --client --short
# 输出:Client Version: v1.28.7

2.3.2 安装Helm

# 使用官方安装脚本
curl -fsSL https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash

# 验证版本
helm version --short
# 输出:v3.14.3+g6e7b5e1

2.4 使用Helm安装Kyverno

Kyverno 官方推荐使用 Helm Chart 部署,支持自定义配置和版本管理。本课程使用 Kyverno v1.12.x 稳定版。

2.4.1 添加Helm仓库并安装

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

# 创建命名空间并安装 Kyverno
kubectl create namespace kyverno
helm install kyverno kyverno/kyverno \
  --namespace kyverno \
  --version v3.1.5 \
  --set features.policyExceptions.enabled=true \
  --set replicaCount=1

# 等待 Pod 就绪
kubectl -n kyverno wait --for=condition=Ready pod -l app.kubernetes.io/name=kyverno --timeout=120s

2.4.2 验证安装

# 查看 Kyverno Pod 状态
kubectl -n kyverno get pod
# 输出示例:
# NAME                       READY   STATUS    RESTARTS   AGE
# kyverno-6b8c9f7d4f-abc12   1/1     Running   0          2m

# 查看 CRD 是否注册
kubectl get crd | grep kyverno
# 输出应包含:clusterpolicies.kyverno.io / policies.kyverno.io / clusterpolicyreports.wgpolicyk8s.io 等
关键配置说明: features.policyExceptions.enabled=true 启用策略异常功能,后续巡检策略模板中会用到。单节点环境设置 replicaCount=1 节省资源。
Kyverno Helm 安装流程 Kyverno Helm 安装流程 步骤1 添加 Helm 仓库 步骤2 创建命名空间 步骤3 helm install 步骤4 验证就绪 安装验证清单 ✓ Pod 状态为 Running,READY 列为 1/1 ✓ CRD 已注册:clusterpolicies.kyverno.io / policies.kyverno.io ✓ Kyverno Webhook 已注入(kubectl get validatingwebhookconfigurations)

2.5 验证Kyverno策略引擎运行

安装完成后,通过部署一个简单的测试策略来确认 Kyverno 能够正常拦截和生成策略报告。

# 创建一个测试命名空间
kubectl create namespace test-policy

# 应用一个简单的禁止特权容器的策略
cat <<EOF | kubectl apply -f -
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: disallow-privileged-containers
spec:
  validationFailureAction: Audit
  rules:
  - name: check-privileged
    match:
      any:
      - resources:
          kinds:
          - Pod
    validate:
      message: "Privileged containers are not allowed."
      pattern:
        spec:
          containers:
          - securityContext:
              privileged: "false"
EOF

# 创建一个特权容器测试 Pod
kubectl run test-privileged --image=nginx --privileged -n test-policy

# 查看策略报告
kubectl get policyreport -n test-policy
# 输出应显示一条失败记录,说明策略引擎正常工作
快速诊断: 如果策略报告未生成,请检查 Kyverno Pod 日志:kubectl -n kyverno logs -l app.kubernetes.io/name=kyverno --tail=50。常见问题包括 Webhook 配置未就绪或 API 版本不匹配。

2.6 环境检查清单

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

检查项 验证命令 预期结果
集群节点就绪 kubectl get node 节点状态为 Ready
kubectl 版本匹配 kubectl version --client --short Client Version 与集群版本相差 ≤ 1 个次要版本
Helm 可用 helm version --short 输出 v3.x.x
Kyverno Pod 运行 kubectl -n kyverno get pod Pod 状态为 Running,READY 1/1
CRD 已注册 kubectl get crd | grep kyverno 至少包含 clusterpolicies.kyverno.io
策略引擎响应 kubectl get policyreport -A 至少存在一个 policyreport 资源