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
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
2.2.3 策略引擎核心组件架构
下图展示了 Kyverno 策略引擎的核心组件及其交互关系:
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"}]}'
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 能正常启动。