3. 集群初始化:使用 kind 创建 3 个 Kubernetes 集群(dev、staging、prod),配置 Ingress Controller
在版本漂移校准项目中,我们需要三个独立的 Kubernetes 集群来模拟不同环境(开发、预发布、生产)下的部署与流量管理。本章将使用 kind(Kubernetes in Docker)在本地快速创建这三个集群,并为每个集群安装 Ingress NGINX Controller,为后续的多集群流量调度与版本漂移检测奠定基础。
3.1 环境准备与工具安装
在开始之前,请确保本地已安装以下工具:
| 工具 | 最低版本 | 用途 |
|---|---|---|
| Docker | 20.10+ | 提供容器运行时,kind 依赖 Docker 运行节点 |
| kind | v0.20+ | 在 Docker 容器中创建 Kubernetes 集群 |
| kubectl | v1.28+ | 与 Kubernetes 集群交互 |
| Helm | v3.12+ | 安装 Ingress Controller(可选,也可用 kubectl apply) |
brew install kind kubectl helm。Windows 用户可使用 Chocolatey 或直接下载二进制文件。
3.2 创建三个集群的配置文件
kind 支持通过 YAML 配置文件定义集群的节点数量、端口映射、版本等参数。为了模拟真实环境,我们为每个集群创建独立的配置文件,并暴露 Ingress 所需的 80/443 端口。
dev-cluster-config.yaml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
name: dev
nodes:
- role: control-plane
extraPortMappings:
- containerPort: 80
hostPort: 8080
protocol: TCP
- containerPort: 443
hostPort: 8443
protocol: TCP
staging-cluster-config.yaml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
name: staging
nodes:
- role: control-plane
extraPortMappings:
- containerPort: 80
hostPort: 8081
protocol: TCP
- containerPort: 443
hostPort: 8444
protocol: TCP
prod-cluster-config.yaml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
name: prod
nodes:
- role: control-plane
extraPortMappings:
- containerPort: 80
hostPort: 8082
protocol: TCP
- containerPort: 443
hostPort: 8445
protocol: TCP
3.3 初始化集群
使用 kind 的 create cluster 命令,分别加载上述配置文件:
# 创建 dev 集群
kind create cluster --config dev-cluster-config.yaml
# 创建 staging 集群
kind create cluster --config staging-cluster-config.yaml
# 创建 prod 集群
kind create cluster --config prod-cluster-config.yaml
每个集群创建过程约 2-3 分钟,kind 会自动拉取节点镜像、启动控制平面组件。创建完成后,使用 kind get clusters 验证:
kind get clusters
# 输出示例:
# dev
# staging
# prod
切换上下文到不同集群:
kubectl cluster-info --context kind-dev
kubectl cluster-info --context kind-staging
kubectl cluster-info --context kind-prod
3.4 集群架构概览
下图展示了三个 kind 集群在本地 Docker 环境中的部署架构,以及 Ingress Controller 的端口映射关系:
3.5 安装 Ingress Controller
每个集群都需要安装 Ingress Controller 才能处理外部流量。我们使用 Ingress NGINX 官方 Helm Chart 进行安装,确保版本一致。
步骤 1:添加 Helm 仓库
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
步骤 2:为每个集群安装 Ingress Controller
切换上下文后分别执行:
# 安装到 dev 集群
kubectl config use-context kind-dev
helm install ingress-nginx ingress-nginx/ingress-nginx \
--namespace ingress-nginx --create-namespace \
--set controller.service.type=NodePort \
--set controller.service.nodePorts.http=30080 \
--set controller.service.nodePorts.https=30443
# 安装到 staging 集群
kubectl config use-context kind-staging
helm install ingress-nginx ingress-nginx/ingress-nginx \
--namespace ingress-nginx --create-namespace \
--set controller.service.type=NodePort \
--set controller.service.nodePorts.http=30081 \
--set controller.service.nodePorts.https=30444
# 安装到 prod 集群
kubectl config use-context kind-prod
helm install ingress-nginx ingress-nginx/ingress-nginx \
--namespace ingress-nginx --create-namespace \
--set controller.service.type=NodePort \
--set controller.service.nodePorts.http=30082 \
--set controller.service.nodePorts.https=30445
步骤 3:验证安装
检查每个集群的 Ingress Controller Pod 是否正常运行:
kubectl get pods -n ingress-nginx --context kind-dev
kubectl get pods -n ingress-nginx --context kind-staging
kubectl get pods -n ingress-nginx --context kind-prod
预期输出类似:
NAME READY STATUS RESTARTS AGE
ingress-nginx-controller-7c8b7c5b9d-abc12 1/1 Running 0 2m
3.6 集群与 Ingress 配置清单
下表汇总了三个集群的关键配置参数,方便后续操作时快速查阅:
| 集群名称 | kind 上下文 | API Server 端口 | Ingress HTTP 端口 (host) | Ingress HTTPS 端口 (host) | NodePort HTTP | NodePort HTTPS |
|---|---|---|---|---|---|---|
| dev | kind-dev | 6443 (默认) | 8080 | 8443 | 30080 | 30443 |
| staging | kind-staging | 6443 (默认) | 8081 | 8444 | 30081 | 30444 |
| prod | kind-prod | 6443 (默认) | 8082 | 8445 | 30082 | 30445 |
3.7 快速验证 Ingress 是否正常工作
创建一个简单的测试 Deployment 和 Ingress 资源,验证流量能否到达集群内部:
kubectl config use-context kind-dev
# 创建测试应用
kubectl create deployment test-app --image=nginx:alpine
kubectl expose deployment test-app --port=80
# 创建 Ingress 规则
kubectl apply -f - <<EOF
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: test-ingress
spec:
ingressClassName: nginx
rules:
- host: dev.local
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: test-app
port:
number: 80
EOF
# 测试访问(需要配置 hosts 或使用 curl --resolve)
curl -H "Host: dev.local" http://localhost:8080
如果返回 nginx 默认页面,说明 Ingress Controller 配置成功,流量已正确路由到集群内的 Pod。
- 三个集群均已创建且 kubectl 上下文可切换
- 每个集群的 Ingress Controller Pod 处于 Running 状态
- 通过 hostPort 映射的端口可访问集群内服务
- Ingress 规则生效,能够按 Host 头路由流量
3.8 清理与重置(可选)
如果后续需要重新初始化,可使用以下命令删除集群:
kind delete cluster --name dev
kind delete cluster --name staging
kind delete cluster --name prod
删除后,Docker 容器和相关的网络资源会被自动清理,不会留下残留。