2. 环境准备:Kubernetes集群搭建、Kyverno安装与配置、镜像仓库(Harbor/ECR)对接

本章聚焦于搭建课程所需的完整实验环境。我们将依次完成 Kubernetes 集群的快速部署、Kyverno 策略引擎的安装与基础配置,以及私有镜像仓库(Harbor / ECR)的对接。所有操作均面向生产级水位门禁场景,确保后续章节的变更门禁与回滚判断能够顺利落地。

2.1 Kubernetes 集群搭建

推荐使用 kubeadm 或 Kind 搭建集群。本课程采用 Kind(Kubernetes in Docker) 作为本地实验环境,因其启动快、资源占用低,且支持多节点模拟。生产环境可替换为 kubeadm 或托管集群(EKS / AKS / GKE)。

2.1.1 使用 Kind 创建集群

确保已安装 Docker 和 Kind CLI。以下配置定义了一个包含 1 个控制平面节点和 2 个工作节点的集群:

# kind-config.yaml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
  - role: control-plane
  - role: worker
  - role: worker
# 创建集群
kind create cluster --name kyverno-lab --config kind-config.yaml

# 验证节点状态
kubectl get nodes
提示: 若使用 kubeadm,请确保 kubelet、kubeadm、kubectl 版本一致(推荐 v1.28+),并提前配置容器运行时(containerd / CRI-O)。

2.1.2 集群版本与资源要求

组件 版本 / 规格 说明
Kubernetes v1.28+ 支持 Kyverno 1.12+ 及 ValidatingAdmissionPolicy
控制平面节点 2 vCPU / 4 GB RAM 至少 1 个节点
工作节点 2 vCPU / 4 GB RAM 至少 2 个节点(模拟调度与回滚)
容器运行时 containerd 1.6+ 支持镜像签名验证

2.2 Kyverno 安装与配置

Kyverno 作为 Kubernetes 原生策略引擎,通过 Admission Webhook 拦截资源变更请求。我们将使用 Helm 进行安装,并配置高可用模式与策略缓存。

2.2.1 使用 Helm 安装 Kyverno

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

# 安装 Kyverno(命名空间:kyverno)
helm install kyverno kyverno/kyverno \
  --namespace kyverno --create-namespace \
  --set admissionController.replicas=2 \
  --set backgroundController.replicas=1 \
  --set cleanupController.replicas=1 \
  --set reportsController.replicas=1

# 验证 Pod 状态
kubectl get pods -n kyverno

2.2.2 验证 Webhook 与策略引擎

安装完成后,Kyverno 会自动注册 ValidatingWebhookConfiguration 和 MutatingWebhookConfiguration。通过以下命令确认 Webhook 处于健康状态:

# 查看 Webhook 配置
kubectl get validatingwebhookconfigurations -l webhook.kyverno.io/managed-by=kyverno

# 部署一个测试策略,验证引擎是否正常工作
cat <<EOF | kubectl apply -f -
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: require-label-env
spec:
  validationFailureAction: Enforce
  rules:
  - name: check-env-label
    match:
      any:
      - resources:
          kinds:
          - Pod
    validate:
      message: "Pod 必须包含标签 'env'"
      pattern:
        metadata:
          labels:
            env: "?*"
EOF

# 尝试创建一个不带 env 标签的 Pod,应被拒绝
kubectl run test-pod --image=nginx
# 预期输出:Error from server: admission webhook "validate.kyverno.svc" denied the request
注意: 生产环境中建议为 Kyverno 配置资源限制(CPU: 500m / Memory: 512Mi)和 PodDisruptionBudget,避免 Webhook 在高负载下超时。

2.2.3 策略引擎核心组件架构

下图展示了 Kyverno 策略引擎的核心组件及其交互关系:

Kyverno 策略引擎核心组件架构 Kubernetes API Server ValidatingWebhook MutatingWebhook ImageVerifyWebhook Kyverno Admission Controller ClusterPolicy / Policy Webhook 拦截 → 策略评估 → 准入决策

2.3 镜像仓库对接(Harbor / ECR)

镜像安全水位门禁依赖仓库侧的签名、扫描与访问控制。本课程支持两种主流私有仓库:Harbor(自建)和 Amazon ECR(托管)。

2.3.1 Harbor 部署与配置

Harbor 提供镜像签名(Cosign / Notation)、漏洞扫描(Trivy / Clair)和机器人账户。以下为快速部署步骤:

# 使用 Helm 安装 Harbor
helm repo add harbor https://helm.goharbor.io
helm install harbor harbor/harbor \
  --namespace harbor --create-namespace \
  --set expose.type=nodePort \
  --set expose.tls.enabled=false \
  --set harborAdminPassword=Harbor12345

# 获取 Harbor 访问地址
kubectl get svc -n harbor harbor-portal -o jsonpath='{.spec.ports[0].nodePort}'
# 浏览器访问:http://<NodeIP>:<NodePort>  默认管理员:admin / Harbor12345

2.3.2 ECR 对接配置

若使用 Amazon ECR,需提前创建私有仓库并配置 IAM 权限。Kubernetes 节点通过 imagePullSecrets 或 IRSA(IAM Roles for Service Accounts)进行身份认证。

# 创建 ECR 仓库(AWS CLI)
aws ecr create-repository --repository-name kyverno-demo --region us-east-1

# 获取登录密码并创建 Docker Secret
aws ecr get-login-password --region us-east-1 | \
  kubectl create secret docker-registry ecr-secret \
    --docker-server=<ACCOUNT_ID>.dkr.ecr.us-east-1.amazonaws.com \
    --docker-username=AWS \
    --docker-password-stdin \
    --namespace default

# 在 Pod 中引用该 Secret
# spec:
#   imagePullSecrets:
#   - name: ecr-secret

2.3.3 镜像仓库对接对比

特性 Harbor Amazon ECR
部署方式 自建(Helm / Docker Compose) AWS 托管服务
镜像签名 Cosign / Notation 原生集成 需配合 AWS Signer 或 Cosign
漏洞扫描 Trivy / Clair(内置) Amazon Inspector(需额外配置)
访问控制 机器人账户 + RBAC IAM Policy + IRSA
Kubernetes 集成 imagePullSecrets / OIDC imagePullSecrets / IRSA

2.3.4 镜像拉取凭证配置

无论使用 Harbor 还是 ECR,Kubernetes 节点都需要配置拉取凭证。以下为通用步骤:

# 创建 Docker 凭证 Secret(以 Harbor 为例)
kubectl create secret docker-registry harbor-secret \
  --docker-server=harbor.kyverno-lab.local \
  --docker-username=robot$kyverno-demo \
  --docker-password=<ROBOT_> \
  --namespace default

# 将 Secret 关联到默认 ServiceAccount
kubectl patch serviceaccount default -p '{"imagePullSecrets": [{"name": "harbor-secret"}]}'
水位门禁前置条件: 确保仓库已启用镜像签名验证(Cosign / Notation)和漏洞扫描。后续章节将基于这些元数据编写 Kyverno 策略,实现“未签名镜像禁止部署”和“高危漏洞触发回滚”的自动化门禁。

2.4 环境验证清单

完成上述步骤后,请逐项确认以下环境状态:

  • Kubernetes 集群:kubectl get nodes 返回 Ready 状态,节点数 ≥ 3。
  • Kyverno 运行:kubectl get pods -n kyverno 所有 Pod 处于 Running 状态。
  • Webhook 注册:kubectl get validatingwebhookconfigurations 包含 kyverno 相关条目。
  • 镜像仓库可达:在集群内执行 crictl pull <仓库地址>/library/nginx:latest 成功。
  • 拉取凭证有效:创建测试 Pod 并指定私有镜像,Pod 能正常启动。