2. 环境准备:Kubernetes集群搭建、Cilium与Hubble安装、Hubble CLI与UI部署

本章是课程的基础环境搭建环节。一个可运行的Kubernetes集群、正确安装的Cilium CNI插件以及完整的Hubble观测栈,是后续进行流量可视化与准入策略评审的前提。本节将按照生产级标准,逐步完成从集群初始化到Hubble UI访问的全流程部署。

2.1 环境概览与版本依赖

在开始部署前,需确认各组件的版本兼容性。下表列出了本次课程使用的核心软件及其推荐版本,避免因版本不匹配导致功能异常。

组件 推荐版本 说明
Kubernetes v1.28+ 支持Cilium原生路由与eBPF功能
Cilium v1.15+ 内置Hubble Server,支持L7策略
Helm v3.12+ 用于Cilium与Hubble的Chart部署
Hubble CLI v0.13+ 命令行流量观测工具
Hubble UI v0.13+ 基于Cilium Hubble的图形化界面
操作系统内核 5.10+ 确保eBPF特性完整可用
内核检查提示: 执行 uname -r 确认内核版本。若低于5.10,建议升级内核或使用Ubuntu 22.04+ / CentOS 8+ 等发行版。

2.2 Kubernetes集群搭建(快速部署)

为聚焦Cilium与Hubble的学习,此处使用 kubeadm 搭建一个单控制平面+单工作节点的最小集群。生产环境请根据规模调整节点数量。

2.2.1 节点初始化

在所有节点上执行以下基础配置:

# 关闭交换分区
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

2.2.2 安装容器运行时与kubeadm

使用 containerd 作为容器运行时,并安装kubeadm、kubelet、kubectl:

# 安装containerd(以Ubuntu为例)
sudo apt-get update
sudo apt-get install -y containerd

# 配置containerd使用systemd cgroup驱动
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
sudo systemctl restart containerd

# 安装kubeadm、kubelet、kubectl
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl

2.2.3 初始化控制平面

在控制平面节点执行初始化,并跳过默认的CNI安装(后续由Cilium接管):

sudo kubeadm init --pod-network-cidr=10.244.0.0/16 --skip-phases=addon/kube-proxy

# 配置kubectl
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

# 查看节点状态(此时节点为NotReady,等待CNI)
kubectl get nodes
注意: 此处使用 --skip-phases=addon/kube-proxy 跳过kube-proxy安装,因为Cilium将完全替代kube-proxy的功能(kube-proxy replacement模式)。

2.3 Cilium与Hubble安装

Cilium是本次课程的核心网络组件,它内置了Hubble Server用于流量观测。我们使用Helm进行一键安装,并同时启用Hubble相关组件。

2.3.1 添加Helm仓库并准备配置

helm repo add cilium https://helm.cilium.io/
helm repo update

创建自定义values文件 cilium-values.yaml,关键配置如下:

# cilium-values.yaml
kubeProxyReplacement: true
k8sServiceHost: <控制平面IP>
k8sServicePort: 6443

hubble:
  enabled: true
  relay:
    enabled: true
  ui:
    enabled: false  # UI后续单独部署

ipam:
  mode: kubernetes

2.3.2 执行Helm安装

helm install cilium cilium/cilium \
  --namespace kube-system \
  --values cilium-values.yaml

# 验证Cilium Pod状态
kubectl -n kube-system get pods -l k8s-app=cilium

安装完成后,Cilium会自动配置网络,节点状态应变为 Ready。

2.3.3 验证Cilium与Hubble功能

使用Cilium CLI检查集群连接状态与Hubble健康度:

# 安装Cilium CLI
curl -L --remote-name-all https://github.com/cilium/cilium-cli/releases/latest/download/cilium-linux-amd64.tar.gz
sudo tar xzvfC cilium-linux-amd64.tar.gz /usr/local/bin
rm cilium-linux-amd64.tar.gz

# 检查集群状态
cilium status

# 检查Hubble状态
cilium hubble status
预期输出示例:
/ Health: OK
/ Hubble: OK
/ Relay: OK

2.4 Hubble CLI与UI部署

Hubble CLI提供命令行级别的流量实时观察能力,而Hubble UI则提供图形化的服务拓扑与流量可视化界面。两者配合使用,可覆盖从快速排障到策略评审的全场景需求。

2.4.1 部署Hubble Relay与UI

Hubble Relay作为Hubble Server与Hubble UI/CLI之间的代理,必须先行部署。我们通过Helm升级Cilium来启用Relay,并单独部署UI:

# 升级Cilium以启用Hubble Relay(如果之前未启用)
helm upgrade cilium cilium/cilium \
  --namespace kube-system \
  --reuse-values \
  --set hubble.relay.enabled=true

# 部署Hubble UI
helm install hubble-ui cilium/hubble-ui \
  --namespace kube-system \
  --set backends.server=http://hubble-relay:80

2.4.2 安装Hubble CLI

Hubble CLI需要安装在本地管理机上,用于远程连接Hubble Relay:

# 下载Hubble CLI
curl -L --remote-name-all https://github.com/cilium/hubble/releases/latest/download/hubble-linux-amd64.tar.gz
sudo tar xzvfC hubble-linux-amd64.tar.gz /usr/local/bin
rm hubble-linux-amd64.tar.gz

# 配置端口转发(使本地CLI可访问集群内Relay)
kubectl port-forward -n kube-system svc/hubble-relay 4245:80 &

# 测试连接
hubble status

2.4.3 访问Hubble UI

通过端口转发将Hubble UI暴露到本地浏览器:

kubectl port-forward -n kube-system svc/hubble-ui 12000:80 &

# 浏览器访问:http://localhost:12000

UI界面将展示集群内所有命名空间的服务拓扑图,并支持按标签、IP、协议过滤流量。

2.5 整体架构与数据流

下图展示了Cilium与Hubble各组件的部署位置及数据采集、转发路径,帮助理解各模块的协作关系。

Cilium与Hubble组件架构图 Cilium + Hubble 组件架构与数据流 Kubernetes 集群 控制平面节点 Cilium Agent Hubble Server kube-apiserver etcd 工作节点 Cilium Agent Hubble Server Pod A (app) Pod B (db) Hubble Relay 聚合集群内所有Hubble Server数据 Hubble UI 图形化拓扑与流量 Hubble CLI 命令行流量观察 数据流说明: 1. 每个节点上的Hubble Server采集eBPF事件 → 2. Hubble Relay聚合全集群数据 → 3. Hubble UI/CLI从Relay拉取数据

2.6 环境验证清单

完成上述步骤后,建议执行以下验证清单,确保环境就绪:

  • 集群节点状态: kubectl get nodes 输出均为 Ready。
  • Cilium Pod运行: kubectl -n kube-system get pods -l k8s-app=cilium 所有Pod为 Running。
  • Hubble Relay运行: kubectl -n kube-system get pods -l k8s-app=hubble-relay 状态正常。
  • Hubble UI访问: 浏览器打开 http://localhost:12000 可看到服务拓扑图。
  • CLI连接测试: hubble status 返回 Health: OK。
  • 网络连通性: 部署一个测试Pod,kubectl run test --image=busybox -- sleep 3600,进入Pod后能ping通其他Pod IP。
排障参考: 若Hubble UI无法显示拓扑,检查 hubble-relay 日志:kubectl logs -n kube-system -l k8s-app=hubble-relay。常见原因为Cilium未正确启用Hubble或Relay端口转发未配置。