2. 环境准备:Kubernetes集群搭建、Cilium安装与配置、服务目录平台部署
本章是后续所有故障排查场景的基础。我们将搭建一个最小化但功能完整的实验环境,包含Kubernetes集群、Cilium CNI与网络策略引擎,以及服务目录平台(Kiali/Backstage)。环境采用kubeadm引导、Cilium Helm Chart部署、服务目录以Kiali作为可视化前端。
2.1 环境拓扑与组件关系
下图展示了实验环境的整体架构,包括控制面、工作节点、Cilium Agent与Service Mesh组件的交互关系。
2.2 Kubernetes集群搭建
使用kubeadm v1.28搭建一个1控制面+2工作节点的集群。操作系统为Ubuntu 22.04 LTS,容器运行时使用containerd。
2.2.1 节点规格与网络要求
| 角色 | 主机名 | IP地址 | CPU/内存 | 磁盘 |
|---|---|---|---|---|
| 控制面 | cp-1 | 192.168.1.10 | 4C / 8G | 50G SSD |
| 工作节点1 | node-1 | 192.168.1.11 | 4C / 8G | 50G SSD |
| 工作节点2 | node-2 | 192.168.1.12 | 4C / 8G | 50G SSD |
所有节点需满足:
- 关闭swap:
sudo swapoff -a并注释/etc/fstab中的swap条目 - 加载内核模块:
overlay、br_netfilter - 设置sysctl参数:
net.bridge.bridge-nf-call-iptables=1、net.ipv4.ip_forward=1 - 安装containerd 1.7.x 并配置SystemdCgroup驱动
2.2.2 kubeadm初始化步骤
# 控制面节点执行
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 /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 工作节点加入
sudo kubeadm join 192.168.1.10:6443 -- <> --discovery--ca-cert-hash sha256:<hash>
提示: 记录kubeadm init输出的join命令和。有效期默认24小时,若过期可使用
kubeadm create --print-join-command 重新生成。
2.3 Cilium安装与配置
Cilium v1.15使用Helm Chart安装,替换kube-proxy并启用Hubble可观测性。
2.3.1 安装Helm与添加Cilium仓库
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
helm repo add cilium https://helm.cilium.io/
helm repo update
2.3.2 使用Helm安装Cilium
helm install cilium cilium/cilium \
--namespace kube-system \
--set kubeProxyReplacement=true \
--set hubble.relay.enabled=true \
--set hubble.ui.enabled=true \
--set hubble.metrics.enabled="{dns,drop,tcp,flow,icmp,http}" \
--set ipam.mode=kubernetes \
--set cluster.name=cilium-lab \
--set cluster.id=1
| 参数 | 说明 | 推荐值 |
|---|---|---|
kubeProxyReplacement | 完全替换kube-proxy,由Cilium eBPF实现Service负载均衡 | true |
hubble.relay.enabled | 启用Hubble Relay聚合流日志 | true |
hubble.ui.enabled | 启用Hubble UI(可选,Kiali可替代) | true |
ipam.mode | IP地址管理方式,使用Kubernetes原生PodCIDR | kubernetes |
2.3.3 验证Cilium安装状态
# 检查Pod状态
kubectl -n kube-system get pods -l k8s-app=cilium
# 验证Cilium Agent状态
cilium status --verbose
# 测试网络连通性
kubectl run test-pod --image=busybox -- sleep 3600
kubectl exec test-pod -- ping -c 3 10.244.1.2
注意: 如果集群之前安装过其他CNI(如Flannel、Calico),必须先清理干净。残留的CNI配置会导致Cilium无法接管网络。清理方法:删除所有现有CNI Pod、删除
/etc/cni/net.d/ 下的配置文件、重启kubelet。
2.4 服务目录平台部署(Kiali)
Kiali作为服务目录平台,展示服务拓扑、网络策略与流量指标。Kiali依赖Prometheus和Grafana,我们一并部署。
2.4.1 部署Prometheus与Grafana
# 使用kube-prometheus-stack Helm Chart
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
helm install prometheus prometheus-community/kube-prometheus-stack \
--namespace monitoring --create-namespace \
--set grafana.enabled=true \
--set prometheus.prometheusSpec.serviceMonitorSelectorNilUsesHelmValues=false
2.4.2 部署Kiali
helm repo add kiali https://kiali.org/helm-charts
helm repo update
helm install kiali kiali/kiali-operator \
--namespace kiali-operator --create-namespace
# 创建Kiali CR实例
cat <<EOF | kubectl apply -f -
apiVersion: kiali.io/v1alpha1
kind: Kiali
metadata:
name: kiali
namespace: kiali-operator
spec:
version: default
external_services:
prometheus:
url: "http://prometheus-kube-prometheus-prometheus.monitoring:9090"
grafana:
url: "http://prometheus-grafana.monitoring:80"
EOF
2.4.3 访问Kiali UI
# 端口转发
kubectl port-forward -n kiali-operator svc/kiali 20001:20001
# 浏览器访问 http://localhost:20001
提示: Kiali默认使用匿名登录。在生产环境中应配置OpenID Connect或认证。Kiali的“服务目录”视图会列出集群中所有Service,并显示它们之间的流量关系,这是后续排查网络策略的重要入口。
2.5 环境验证清单
完成上述部署后,执行以下验证步骤确保环境就绪:
| 验证项 | 命令/方法 | 预期结果 |
|---|---|---|
| 集群节点状态 | kubectl get nodes | 3个节点均为Ready状态 |
| Cilium Pod运行 | kubectl -n kube-system get pods -l k8s-app=cilium | 每个节点一个Running Pod |
| Hubble Relay运行 | kubectl -n kube-system get pods -l k8s-app=hubble-relay | 1个Running Pod |
| Pod间网络连通 | 创建测试Pod并ping | 跨节点Pod互通 |
| Kiali UI可访问 | 端口转发后浏览器访问 | 显示服务拓扑图 |
| Cilium网络策略生效 | 应用Deny-All策略后测试 | 未匹配规则的流量被阻断 |
2.6 常见问题与避坑
- kube-proxy残留: 如果Cilium启用kubeProxyReplacement=true,必须确保kube-proxy未运行。检查方式:
kubectl -n kube-system get pods -l k8s-app=kube-proxy,若存在则删除DaemonSet。 - 内核版本过低: Cilium eBPF功能要求Linux内核 >= 5.10。使用
uname -r检查,若版本不足需升级内核或使用Cilium的legacy模式。 - MTU不一致: 如果节点间网络设备MTU与Pod网络MTU不匹配,会导致分片或丢包。Cilium默认自动检测,但建议显式设置:
--set mtu=1500。 - Kiali无法获取指标: 检查Prometheus ServiceMonitor是否匹配Cilium的指标端点。Cilium默认暴露metrics在
:9962,需确保Prometheus配置了对应的scrape job。