Cilium 企业网络隔离与可观测性
验证:未记录
- 适用版本
- 未记录
- 验证范围
- 尚未登记验证记录。
本文缩写(英文全称与中文含义)
| 缩写 | 英文全称/名称 | 中文含义 |
|---|---|---|
| API | Application Programming Interface | 应用程序编程接口 |
| AZ | Availability Zone | 可用区 |
| BPF | Berkeley Packet Filter | 伯克利包过滤器技术 |
| CIDR | Classless Inter-Domain Routing | 无类别域间路由,用于表示网段 |
| CNI | Container Network Interface | 容器网络接口 |
| DNS | Domain Name System | 域名系统 |
| eBPF | extended Berkeley Packet Filter | 扩展 BPF,用于内核可编程观测等场景 |
| EKS | Elastic Kubernetes Service | AWS 托管 Kubernetes 服务 |
| ENI | Elastic Network Interface | AWS 弹性网络接口 |
| GKE | Google Kubernetes Engine | Google 托管 Kubernetes 服务 |
| IP | Internet Protocol | 网际协议;IP 地址是网络寻址标识 |
| K8s | Kubernetes | 容器编排平台;8 表示 K 与 s 之间的八个字母 |
| MTU | Maximum Transmission Unit | 最大传输单元 |
| PDB | Pod Disruption Budget | Pod 中断预算,约束自愿驱逐 |
| STS | Security Token Service | 安全令牌服务,用于签发或交换短期凭据 |
| TCP | Transmission Control Protocol | 传输控制协议 |
| TLS | Transport Layer Security | 传输层安全协议 |
| UDP | User Datagram Protocol | 用户数据报协议 |
| VPC | Virtual Private Cloud | 虚拟私有云网络 |
场景:订单命名空间默认隔离,只允许入口、DNS、数据库与指定监控流量,并用 Hubble 定位拒绝。前置:基线。CNI 是集群基础设施;本安装仅用于新建、尚未安装 CNI 的 kubeadm 集群,保留 kube-proxy。已有 Calico/EKS VPC CNI/GKE Dataplane V2 不可直接覆盖安装。
安装前的设计#
确定 Pod/Service/主机 CIDR 不重叠、MTU、隧道端口、防火墙、内核/eBPF 支持和各节点 IP。生产替换 CNI 采用独立新集群迁移,或供应商明确支持的迁移流程;helm rollback 不能恢复已经改变的网络状态。
EKS 的 ENI/native/chaining 与自建 overlay 是不同方案,GKE Dataplane V2 已由平台管理。选择依据:Cilium 安装。
helm repo add cilium https://helm.cilium.io/
helm repo update
helm search repo cilium/cilium --versions
export CILIUM_VERSION='1.18.6' # 本文渲染基线;先核对集群兼容矩阵
helm show values cilium/cilium --version "$CILIUM_VERSION" > cilium-defaults.yaml保存 cilium-values.yaml;示例复用 kubeadm 分配的 Node PodCIDR,因此须先确认 Node 的 .spec.podCIDr 非空:
下载完整 cilium-values.yaml;替换 REPLACE_ 环境输入后保存到当前目录。配置包含资源预算、双副本、单节点故障分散和中断预算。资源是压测起点,不能替代容量测试。
kubectl get nodes -o custom-columns=NAME:.metadata.name,PODCIDR:.spec.podCIDr
helm upgrade --install cilium cilium/cilium -n kube-system --version "$CILIUM_VERSION" -f cilium-values.yaml --wait --timeout 15m
cilium status --wait
cilium connectivity test连接测试会创建探测资源,只证明基础网络;后续必须验证真实业务。配套 values 已包含 agent/Envoy/operator/relay 资源与控制器 PDB;operator 和 relay 跨节点,跨 AZ 故障仍需至少两区有可调度容量。
Hands-on:只放行订单 API 的必要路径#
先按真实流量建立允许矩阵。保存 orders-cilium.yaml;将 10.40.8.0/24 改成专用数据库子网。Gateway 篇默认 Envoy 数据面位于 envoy-gateway-system,不是 Gateway 对象所在的 edge;按实际 Pod namespace 核对来源。Prometheus 位于 monitoring。数据库必须 TLS 和独立账号;CIDR 允许并不等于数据库授权。
apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata: {name: orders-api, namespace: orders}
spec:
endpointSelector:
matchLabels: {app.kubernetes.io/name: orders-api}
ingress:
- fromEndpoints:
- matchLabels: {k8s:io.kubernetes.pod.namespace: envoy-gateway-system}
toPorts:
- ports: [{port: "8080", protocol: TCP}]
- fromEndpoints:
- matchLabels: {k8s:io.kubernetes.pod.namespace: monitoring}
toPorts:
- ports: [{port: "8080", protocol: TCP}]
egress:
- toEndpoints:
- matchLabels:
k8s:io.kubernetes.pod.namespace: kube-system
k8s:k8s-app: kube-dns
toPorts:
- ports: [{port: "53", protocol: UDP}, {port: "53", protocol: TCP}]
- toCIDR: [10.40.8.0/24]
toPorts:
- ports: [{port: "5432", protocol: TCP}]这会把选中的 API Pod 转为默认拒绝;如果 API 还调用 STS、队列、外部服务,先补允许规则再发布。NodeLocal DNS 使用本地 IP,不能直接套用上面的 DNS selector;以实际 DNS 路径调整。策略语义
kubectl apply --dry-run=server -f orders-cilium.yaml
kubectl apply -f orders-cilium.yaml
cilium hubble port-forward
# 另一终端,已安装兼容 hubble CLI:
hubble observe --namespace orders --verdict DROPPED --follow验收:合法入口完成订单读写;其他团队 Pod 连接 API/数据库被拒绝;TCP/UDP DNS 都成功;跨节点/AZ 与最大业务报文正常;业务压测无 MTU/重传异常。记录 flow verdict,不记录敏感请求体。
故障与恢复#
先只在预生产目标工作负载加策略,误封时恢复 Git 中的上一策略并观察连接恢复;不要删除全局策略或重装 CNI。演练节点 drain 后跨节点通信,检查 agent 状态、BPF map 压力、丢包和 DNS 延迟。升级需逐 minor 核对 Cilium/K8s/内核兼容与回退限制,保持控制器/agent 版本受控。
配置复核#
安装前按 配置验收 渲染并检查;节点资源不足导致反亲和性 Pending 时先扩容,不删除保护条件。