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版本一致性。
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 节省资源。
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 资源 |