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 补充说明。
- 创建 Kind 配置文件:
kind-config.yaml,声明集群名称和节点数量。 - 启动集群:
kind create cluster --config kind-config.yaml。 - 验证集群状态:
kubectl cluster-info --context kind-knative-lab。 - 安装 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 环境架构总览
下图展示了本章搭建的完整环境组件及其交互关系:
4.8 常见问题与排查
- Pod 启动失败:检查集群资源是否充足,尤其是内存和 CPU。Kind 默认节点资源有限,可通过
kind get nodes查看节点状态。 - 域名解析失败:确认
/etc/hosts配置正确,或使用curl -H "Host: ..."方式访问。 - Kourier 网关未就绪:执行
kubectl get pods -n kourier-system,确保3scale-kourier-gatewayPod 处于 Running 状态。 - Eventing 组件 CrashLoopBackOff:检查
kubectl logs -n knative-eventing <pod-name>,常见原因为 Webhook 证书未就绪,等待 1-2 分钟自动恢复。
环境就绪检查清单:
kubectl get nodes— 所有节点 Readykubectl get pods -n knative-serving— 所有 Pod Runningkubectl get pods -n knative-eventing— 所有 Pod Runningkubectl get pods -n kourier-system— 网关 Pod Runningcurl -H "Host: hello-world.default.knative.localhost" http://localhost:8080— 返回 Hello Knative!