4. 环境搭建:Minikube/Kind 集群部署、Knative Serving 与 Eventing 安装、Ingress 配置

本章是《Knative 触发器在控制面架构中的工程案例》课程的实操起点。我们将搭建一套完整的本地开发环境,包含 Kubernetes 集群(Minikube 或 Kind)、Knative Serving 与 Eventing 组件,以及必要的 Ingress 控制器。这套环境将支撑后续所有触发器配置与调试实验。

4.1 环境选型对比:Minikube vs Kind

在本地运行 Knative 需要轻量级 Kubernetes 集群。Minikube 和 Kind 是两种主流选择,下表从关键维度进行对比:

维度 Minikube Kind (Kubernetes in Docker)
底层驱动 虚拟机(VirtualBox/HyperKit)或 Docker Docker 容器作为节点
启动速度 较慢(需创建 VM) 较快(秒级启动容器节点)
资源占用 较高(VM 开销) 较低(共享 Docker 守护进程)
LoadBalancer 支持 内置 minikube tunnel 需额外安装 MetalLB 或使用 port-forward
多节点集群 支持(需指定参数) 原生支持(配置文件声明)
适用场景 需要完整 VM 隔离、模拟真实节点 CI/CD 流水线、快速迭代开发
推荐选择:本课程后续实验均基于 Kind 集群,因其启动快、资源占用低,且与 Knative 的兼容性经过社区充分验证。若你使用 Minikube,请确保分配至少 4GB 内存和 2 个 CPU 核心。

4.2 集群部署步骤(Kind 为例)

以下步骤以 Kind v0.20+ 和 Docker 环境为基础。若使用 Minikube,可跳过本节直接参考 4.2.1 的 Minikube 补充说明。

  1. 创建 Kind 配置文件:kind-config.yaml,声明集群名称和节点数量。
  2. 启动集群:kind create cluster --config kind-config.yaml。
  3. 验证集群状态:kubectl cluster-info --context kind-knative-lab。
  4. 安装 Ingress 控制器:使用 ingress-nginx 作为 Knative 的网关入口。
# kind-config.yaml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
name: knative-lab
nodes:
  - role: control-plane
  - role: worker
  - role: worker
networking:
  apiServerAddress: "0.0.0.0"
  podSubnet: "10.244.0.0/16"
  serviceSubnet: "10.96.0.0/12"
# 创建集群
kind create cluster --config kind-config.yaml

# 切换上下文
kubectl config use-context kind-knative-lab

# 验证节点
kubectl get nodes

4.2.1 Minikube 补充说明

若你选择 Minikube,请执行以下命令启动集群并启用必要插件:

minikube start --cpus=4 --memory=4096 --kubernetes-version=v1.28.0
minikube addons enable ingress
minikube addons enable metrics-server
注意:Minikube 默认使用 minikube ip 作为 Ingress 地址,后续 Knative 配置中需将域名解析指向该 IP。Kind 则需通过 kubectl port-forward 或 MetalLB 暴露服务。

4.3 Knative Serving 安装

Knative Serving 负责管理 Serverless 工作负载的自动伸缩、流量路由和版本管理。安装分为两步:安装核心 CRD 和控制器,再安装网络层(这里使用 Kourier 作为默认网关)。

# 安装 Knative Serving 核心组件(v1.14.0)
kubectl apply -f https://github.com/knative/serving/releases/download/knative-v1.14.0/serving-crds.yaml
kubectl apply -f https://github.com/knative/serving/releases/download/knative-v1.14.0/serving-core.yaml

# 安装 Kourier 网络层
kubectl apply -f https://github.com/knative/net-kourier/releases/download/knative-v1.14.0/kourier.yaml

# 配置 Knative 使用 Kourier
kubectl patch configmap/config-network \
  --namespace knative-serving \
  --type merge \
  --patch '{"data":{"ingress-class":"kourier.ingress.networking.knative.dev"}}'
验证 Serving 安装:执行 kubectl get pods -n knative-serving,应看到 activator、autoscaler、controller、webhook 等 Pod 处于 Running 状态。

4.4 Knative Eventing 安装

Eventing 提供事件驱动架构的核心原语,包括 Broker、Trigger、Source 等 CRD。安装过程与 Serving 类似:

# 安装 Knative Eventing 核心组件(v1.14.0)
kubectl apply -f https://github.com/knative/eventing/releases/download/knative-v1.14.0/eventing-crds.yaml
kubectl apply -f https://github.com/knative/eventing/releases/download/knative-v1.14.0/eventing-core.yaml

# 安装默认的 InMemoryChannel 和 MT-Channel-Broker
kubectl apply -f https://github.com/knative/eventing/releases/download/knative-v1.14.0/in-memory-channel.yaml
kubectl apply -f https://github.com/knative/eventing/releases/download/knative-v1.14.0/mt-channel-broker.yaml
# 验证 Eventing 安装
kubectl get pods -n knative-eventing
# 预期输出:eventing-controller、eventing-webhook、imc-controller、mt-broker-controller 等 Pod

4.5 Ingress 配置与域名解析

Knative 通过 Ingress 网关对外暴露服务。在 Kind 环境中,我们使用 Kourier 自带的 kourier-gateway 服务,并通过 kubectl port-forward 将其映射到本地端口。

# 将 Kourier 网关映射到本地 8080 端口
kubectl port-forward --namespace kourier-system service/kourier-gateway 8080:80 &

# 配置本地 DNS 解析(将 knative 域名指向 127.0.0.1)
# 编辑 /etc/hosts 添加:
# 127.0.0.1 knative.localhost
# 127.0.0.1 *.knative.localhost
生产建议:在真实集群中,应配置外部 DNS 记录指向 LoadBalancer 的 External IP。本地开发时,使用 sslip.io 或 nip.io 这类通配符 DNS 服务可简化域名配置。

4.6 环境验证:部署一个 Knative Service

完成上述步骤后,通过部署一个简单的 Knative Service 来验证整个链路是否正常:

# 创建 Service YAML
cat <<EOF | kubectl apply -f -
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: hello-world
  namespace: default
spec:
  template:
    spec:
      containers:
        - image: gcr.io/knative-samples/helloworld-go
          env:
            - name: TARGET
              value: "Knative"
EOF

# 获取 Service URL
kubectl get ksvc hello-world
# 输出示例:http://hello-world.default.knative.localhost

# 访问服务
curl -H "Host: hello-world.default.knative.localhost" http://localhost:8080
# 预期响应:Hello Knative!

4.7 环境架构总览

下图展示了本章搭建的完整环境组件及其交互关系:

Knative 本地开发环境架构 Kind / Minikube 集群 Knative Serving activator autoscaler controller webhook Knative Eventing eventing-controller mt-broker imc-controller webhook Kourier 网关 (Ingress 层) 端口映射 :8080 → 80 用户 / 客户端 curl / 浏览器 DNS 解析 *.knative.localhost → 127.0.0.1

4.8 常见问题与排查

  • Pod 启动失败:检查集群资源是否充足,尤其是内存和 CPU。Kind 默认节点资源有限,可通过 kind get nodes 查看节点状态。
  • 域名解析失败:确认 /etc/hosts 配置正确,或使用 curl -H "Host: ..." 方式访问。
  • Kourier 网关未就绪:执行 kubectl get pods -n kourier-system,确保 3scale-kourier-gateway Pod 处于 Running 状态。
  • Eventing 组件 CrashLoopBackOff:检查 kubectl logs -n knative-eventing <pod-name>,常见原因为 Webhook 证书未就绪,等待 1-2 分钟自动恢复。
环境就绪检查清单:
  1. kubectl get nodes — 所有节点 Ready
  2. kubectl get pods -n knative-serving — 所有 Pod Running
  3. kubectl get pods -n knative-eventing — 所有 Pod Running
  4. kubectl get pods -n kourier-system — 网关 Pod Running
  5. curl -H "Host: hello-world.default.knative.localhost" http://localhost:8080 — 返回 Hello Knative!