2. 环境准备:Kubernetes集群搭建、Cilium安装与配置、服务目录平台部署

本章是后续所有故障排查场景的基础。我们将搭建一个最小化但功能完整的实验环境,包含Kubernetes集群、Cilium CNI与网络策略引擎,以及服务目录平台(Kiali/Backstage)。环境采用kubeadm引导、Cilium Helm Chart部署、服务目录以Kiali作为可视化前端。

2.1 环境拓扑与组件关系

下图展示了实验环境的整体架构,包括控制面、工作节点、Cilium Agent与Service Mesh组件的交互关系。

实验环境组件关系图 实验环境组件关系图 Kubernetes 控制面 kube-apiserver kube-controller-manager 工作节点 1 Cilium Agent kube-proxy (可选) 工作节点 2 Cilium Agent kube-proxy (可选) Cilium Operator CRD 控制器 Kiali / Backstage 服务目录可视化 Hubble Relay 网络流日志聚合 说明: Cilium Agent 运行在每个工作节点上,通过 eBPF 实现网络策略与负载均衡。Hubble Relay 聚合流日志供 Kiali 展示服务拓扑。

2.2 Kubernetes集群搭建

使用kubeadm v1.28搭建一个1控制面+2工作节点的集群。操作系统为Ubuntu 22.04 LTS,容器运行时使用containerd。

2.2.1 节点规格与网络要求

角色主机名IP地址CPU/内存磁盘
控制面cp-1192.168.1.104C / 8G50G SSD
工作节点1node-1192.168.1.114C / 8G50G SSD
工作节点2node-2192.168.1.124C / 8G50G 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.modeIP地址管理方式,使用Kubernetes原生PodCIDRkubernetes

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 nodes3个节点均为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-relay1个Running Pod
Pod间网络连通创建测试Pod并ping跨节点Pod互通
Kiali UI可访问端口转发后浏览器访问显示服务拓扑图
Cilium网络策略生效应用Deny-All策略后测试未匹配规则的流量被阻断
环境验证流程 环境验证流程 节点状态检查 Cilium Pod 检查 网络连通性测试 Kiali 验证 网络策略生效验证 所有验证项通过后,环境准备完成。后续章节将基于此环境进行Cilium网络策略的故障排查实战。

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。