Cilium透明加密是基于eBPF在内核层对Pod间东西向流量自动加解密的机制,不修改应用、不依赖TLS协议;而TLS工作在应用/传输层,主要用于南北向通信,需应用主动配置和证书管理。

什么是Cilium透明加密,和TLS有什么区别
Cilium的透明加密不是替代TLS,而是工作在Linux内核eBPF层,对Pod间东西向流量(同一集群内服务通信)自动加解密,不改应用代码、不碰HTTP层。TLS是应用层/传输层协议,管南北向(进出集群),而Cilium加密只管集群内部网络平面——比如Service A调用Service B的gRPC请求,在IP层就被加密,抓包看到的是密文,连kube-proxy或iptables都看不到明文。
启用Cilium加密必须满足三个硬性条件
缺一不可,否则cilium status会显示Encryption: Disabled:
- 集群节点内核版本 ≥ 4.19(推荐5.4+),且启用
CONFIG_CRYPTO_USER和CONFIG_CRYPTO_AES编译选项 - Cilium安装时显式开启加密:
cilium install --encryption enabled --encryption-node-exchange true - 所有参与加密的节点必须使用同一预共享密钥(PSK),且密钥需通过Kubernetes Secret挂载到
/var/run/cilium/state/encrypt-key
常见错误现象:Unable to load encryption key或Failed to set encryption key——基本就是Secret没创建、路径挂载错、或权限不是0600。
如何生成并部署加密密钥Secret
Cilium不接受任意长度密钥,必须是32字节AES-256密钥,且所有节点用同一份:
立即学习“go语言免费学习笔记(深入)”;
dd if=/dev/urandom bs=1 count=32 | base64 -w0 > encrypt-key.txt
然后创建Secret:
kubectl create secret generic cilium-encrypt-key \ --from-file=encrypt-key=encrypt-key.txt \ --namespace=kube-system
注意:encrypt-key.txt内容不能带换行;Secret名必须是cilium-encrypt-key(Cilium硬编码);挂载路径固定为/var/run/cilium/state/encrypt-key,不可改。
验证加密是否真正生效
别只看cilium status,要抓包确认:
- 在任一Pod执行
tcpdump -i any port 6379 -w redis.pcap(假设后端是Redis),然后发起调用 - 把pcap拖到本地用Wireshark打开,过滤
ip.addr == <target-pod-ip> - 如果看到TCP payload全是乱码、无明文Redis协议命令(如
SET、GET),说明加密生效;若能看到明文,说明要么没启用、要么密钥不一致、要么目标Pod未注入Cilium agent
容易被忽略的点:Cilium加密默认只对ClusterIP Service流量生效,NodePort/LoadBalancer或hostNetwork Pod的流量不加密;跨集群通信(如通过Gossip或Cilium ClusterMesh)需额外配置密钥同步机制,不能复用单集群PSK。


















