3. 环境准备:Kubernetes集群搭建、Knative Serving与Eventing安装、istio/contour网络层配置
本章是整门课程的基石。在开始容量回退演练之前,必须搭建一套完整、可复现的 Serverless 基础设施。我们将依次完成:Kubernetes 集群的快速部署、Knative Serving 与 Eventing 组件的安装,以及 Istio / Contour 两种网络层的配置。本章所有操作均基于 Kubernetes v1.28+ 与 Knative v1.14+ 版本。
环境建议:推荐使用 3 台 4C8G 的 Linux 节点(Ubuntu 22.04 / CentOS 7.9+),每节点预留 20GB 磁盘空间用于镜像与日志。演练环境无需生产级高可用,但需保证节点间网络互通。
3.1 Kubernetes 集群搭建(kubeadm 方式)
我们采用 kubeadm 工具进行标准化集群初始化。以下为关键步骤与参数配置。
3.1.1 节点初始化与容器运行时安装
# 所有节点执行:关闭 swap、配置内核参数
sudo swapoff -a
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter
# 设置 sysctl 参数
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
sudo sysctl --system
# 安装 containerd(推荐版本 1.7+)
sudo apt-get update
sudo apt-get install -y containerd
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
# 修改 config.toml: SystemdCgroup = true
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
sudo systemctl restart containerd
3.1.2 集群初始化与节点加入
# 仅在控制平面节点执行
sudo kubeadm init \
--pod-network-cidr=10.244.0.0/16 \
--service-cidr=10.96.0.0/12 \
--kubernetes-version=v1.28.0
# 配置 kubectl
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 安装 Flannel CNI(确保 Pod 网络互通)
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
# 工作节点加入(在控制平面获取 )
kubeadm create --print-join-command
# 在工作节点执行输出的 join 命令
验证集群状态:执行
kubectl get nodes 应看到所有节点状态为 Ready;执行 kubectl get pods -n kube-flannel 确认 Flannel Pod 全部运行。
3.2 Knative Serving 安装与配置
Knative Serving 负责 Serverless 工作负载的自动扩缩容与流量管理。安装前需确认集群已安装 MutatingAdmissionWebhook 与 ValidatingAdmissionWebhook 准入控制器。
3.2.1 安装 Knative Serving 核心组件
# 安装 Knative Serving CRDs 与核心控制器
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
# 验证安装
kubectl get pods -n knative-serving
# 预期输出:activator, autoscaler, controller, webhook, domain-mapping 等 Pod 均为 Running 状态
3.2.2 配置 DNS(使用 sslip.io 通配域名)
# 配置 Knative Serving 使用 sslip.io 作为默认域名
kubectl patch configmap/config-domain -n knative-serving --type merge -p '{"data":{"sslip.io":""}}'
# 验证:创建测试 Service 后,应能通过 <service-name>.<namespace>.<cluster-ip>.sslip.io 访问
注意:如果使用自建 DNS 或云厂商 DNS,请替换 sslip.io 为实际域名。演练环境中 sslip.io 足够满足内部访问需求。
3.3 Knative Eventing 安装
Eventing 提供事件驱动能力,是容量回退演练中触发自动扩缩容的关键组件。我们安装标准版 Eventing 并配置默认 Broker 层。
# 安装 Knative Eventing CRDs 与核心组件
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
# 安装默认 Broker 层(基于 InMemoryChannel)
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
# 验证安装
kubectl get pods -n knative-eventing
# 预期输出:eventing-controller, eventing-webhook, imc-controller, imc-dispatcher, mt-broker-controller 等 Pod 均为 Running
3.4 网络层配置:Istio 与 Contour
Knative 需要网络层处理南北向流量(Ingress)与东西向流量(Cluster-local Service)。我们提供两种主流方案:Istio(功能全面,适合生产)与 Contour(轻量,适合边缘/小规模)。
| 特性 | Istio | Contour |
|---|---|---|
| 安装复杂度 | 较高(需安装 istiod + 注入 sidecar) | 较低(仅部署 Envoy 控制面) |
| 资源占用 | 较高(每个 Pod 带 sidecar) | 较低(无 sidecar,共享 Envoy) |
| 流量管理能力 | 丰富(灰度、熔断、重试、mTLS) | 基础(仅支持 HTTP/HTTPS 路由) |
| Knative 集成成熟度 | 官方首选,功能最全 | 官方支持,适合轻量场景 |
| 推荐场景 | 生产环境、多集群、安全要求高 | 开发测试、边缘集群、资源受限 |
3.4.1 安装 Istio 并配置 Knative 集成
# 下载并安装 Istio(版本 1.21+)
curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.21.0 sh -
cd istio-1.21.0
export PATH=$PWD/bin:$PATH
# 安装 Istio 控制面(使用 demo 配置,演练环境够用)
istioctl install --set profile=demo -y
# 启用 Istio 注入(为 knative-serving 命名空间打标签)
kubectl label namespace knative-serving istio-injection=enabled
# 安装 Knative Istio 网络层
kubectl apply -f https://github.com/knative/net-istio/releases/download/knative-v1.14.0/net-istio.yaml
# 验证:检查 knative-serving 命名空间下的 istio 相关 Pod
kubectl get pods -n knative-serving -l app=net-istio-controller
kubectl get pods -n istio-system
3.4.2 安装 Contour 并配置 Knative 集成
# 安装 Contour(版本 1.28+)
kubectl apply -f https://projectcontour.io/quickstart/contour.yaml
# 安装 Knative Contour 网络层
kubectl apply -f https://github.com/knative/net-contour/releases/download/knative-v1.14.0/net-contour.yaml
# 配置 Knative 使用 Contour 作为默认 Ingress 类
kubectl patch configmap/config-network -n knative-serving --type merge -p '{"data":{"ingress-class":"contour.ingress.networking.knative.dev"}}'
# 验证:检查 Contour 组件
kubectl get pods -n projectcontour
kubectl get pods -n knative-serving -l app=net-contour-controller
选择建议:本课程后续演练默认使用 Istio 网络层,因为其流量管理能力更贴合容量回退场景中的灰度发布与流量拆分。如果你希望体验轻量方案,可替换为 Contour,核心演练逻辑不变。
3.5 环境验证清单
完成上述安装后,请按以下清单逐项验证,确保环境就绪。
- 集群节点状态:
kubectl get nodes全部 Ready。 - 核心组件 Pod:
kubectl get pods -A | grep -E 'knative-serving|knative-eventing|istio-system|projectcontour'无 CrashLoopBackOff。 - Knative Service 创建测试:部署一个 hello-world 服务,确认可通过域名访问。
- Eventing Broker 测试:创建 Trigger 与 Sink,确认事件可正常投递。
- 网络层 Ingress 可达:通过 Istio Ingress Gateway 或 Contour Envoy 的 IP 访问 Knative Service。
快速验证命令:
预期返回 HTTP 200 与响应体。
kubectl run -it --rm test --image=curlimages/curl -- sh -c 'curl -s http://hello.default.<cluster-ip>.sslip.io'预期返回 HTTP 200 与响应体。
3.6 常见问题与排错
| 问题现象 | 可能原因 | 解决措施 |
|---|---|---|
Knative Service 一直处于 Unknown 状态 |
网络层未正确配置 Ingress 类 | 检查 config-network ConfigMap 中的 ingress-class 字段 |
| Eventing Trigger 无法匹配事件 | Broker 未就绪或 Channel 配置错误 | kubectl get broker -A 确认 Broker Ready;检查 Trigger 的 spec.broker 引用 |
| Istio sidecar 注入失败 | 命名空间缺少 istio-injection=enabled 标签 |
kubectl label namespace <ns> istio-injection=enabled --overwrite |
| Contour Envoy 无法启动 | 端口冲突或资源不足 | 检查 kubectl describe pods -n projectcontour 查看事件;调整节点资源 |
重要:如果使用 Contour 网络层,请确保集群中未安装其他 Ingress Controller(如 Nginx Ingress),避免端口冲突(80/443)。建议在独立命名空间中部署 Contour。