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)
💡 提示: 如果使用 macOS 或 Linux,推荐通过 Homebrew 安装: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
📌 关键点: 每个集群使用不同的 hostPort(8080/8443、8081/8444、8082/8445),避免本地端口冲突。生产环境建议使用负载均衡器或云原生 LB,但本地测试中端口映射是最直接的方式。

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 的端口映射关系:

三集群 kind 部署架构与 Ingress 端口映射 三集群 kind 部署架构与 Ingress 端口映射 宿主机 (localhost) dev 集群 控制平面 (control-plane) Ingress NGINX 应用 Pod 80 → 8080 443 → 8443 staging 集群 控制平面 (control-plane) Ingress NGINX 应用 Pod 80 → 8081 443 → 8444 prod 集群 控制平面 (control-plane) Ingress NGINX 应用 Pod 80 → 8082 443 → 8445 说明: 每个 kind 集群运行在独立的 Docker 容器中,通过 hostPort 映射将集群内 Ingress 的 80/443 端口暴露到宿主机不同端口。

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
⚠️ 注意: 由于 kind 集群的节点容器内部端口映射已配置 80/443 → hostPort,这里 Ingress Controller 的 Service 使用 NodePort 类型并指定 30080-30082 等端口,避免与集群内其他服务冲突。生产环境通常使用 LoadBalancer 类型。

步骤 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 容器和相关的网络资源会被自动清理,不会留下残留。