Kubernetes 网络方案——炫酷的 Cilium
最近业界使用范围最广的K8S CNI网络方案 Calico 宣布支持 eBPF,而作为第一个通过 eBPF 实现了 kube-proxy 所有功能的 K8S 网络方案——Cilium,它的先见之名是否能转成优势,继而成为 CNI 新的头牌呢?今天我们一起来入门最 Cool Kubernetes 网络方案 Cilium。
Cilium介绍
以下基于 Cilium官网文档翻译整理。
当前趋势
现有问题
解决方案
![](https://filescdn.proginn.com/4c926de5688f803bac02a1489451b258/d44086fe3e0eb6701b8a7d94c35794a1.webp)
官方建议所有部署节点都使用 Linux 最新稳定内核版本,这样所有的功能都能启用,具体部署环境建议可以参照这里。 作为一个 Kubernetes 网络组件,它应该在部署 Kubernetes 其他基础组件之后,才进行部署。这里,我自己遇到的问题是,因为还没有 CNI 插件,coredns 组件的状态一直是 pending的,直到部署完 Cilium 后,coredns 完成了重置变成running状态。
![](https://filescdn.proginn.com/46c8dcd62909f07a56c4d5880e08e012/a951e13fd7061fc5c5ec4957ab7e9b5c.webp)
测试安装效果
> kubectl apply -f connectivity-check.yaml
NAME READY UP-TO-DATE AVAILABLE AGE
echo-a 1/1 1 1 16d
echo-b 1/1 1 1 16d
host-to-b-multi-node-clusterip 1/1 1 1 16d
host-to-b-multi-node-headless 1/1 1 1 16d
pod-to-a 1/1 1 1 16d
pod-to-a-allowed-cnp 1/1 1 1 16d
pod-to-a-external-1111 1/1 1 1 16d
pod-to-a-l3-denied-cnp 1/1 1 1 16d
pod-to-b-intra-node 1/1 1 1 16d
pod-to-b-multi-node-clusterip 1/1 1 1 16d
pod-to-b-multi-node-headless 1/1 1 1 16d
pod-to-external-fqdn-allow-google-cnp 1/1 1 1 16d
![](https://filescdn.proginn.com/5f13090fc7553cb1ca6ae65c93010e7f/cdcbdeae4fb103a812682bd63b037596.webp)
网络可视化神器 Hubble
![](https://filescdn.proginn.com/1adc45bf30fd58881811f88b36b1de87/123315268ea5e044150168fb3d62c8bc.webp)
部署 Hubble 和 Hubble UI
> helm template hubble \
--namespace kube-system \
--set metrics.enabled="{dns:query;ignoreAAAA;destinationContext=pod-short,drop:sourceContext=pod;destinationContext=pod,tcp,flow,port-distribution,icmp,http}" \
--set ui.enabled=true \
> hubble.yaml
> kubectl apply -f hubble.yaml
# 包含两个组件
# - daemonset hubble
# - deployment hubble UI
> kubectl get pod -n kube-system |grep hubble
hubble-67ldp 1/1 Running 0 21h
hubble-f287p 1/1 Running 0 21h
hubble-fxzms 1/1 Running 0 21h
hubble-tlq64 1/1 Running 1 21h
hubble-ui-5f9fc85849-hkzkr 1/1 Running 0 15h
hubble-vpxcb 1/1 Running 0 21h
运行效果
# hubble-ui-nodeport-svc.yaml
kind: Service
apiVersion: v1
metadata:
namespace: kube-system
name: hubble-ui-np
spec:
selector:
k8s-app: hubble-ui
ports:
- name: http
port: 12000
nodePort: 32321
type: NodePort
kubectl apply -f hubble-ui-nodeport-svc.yaml
,就可以通过任意集群节点 IP 地址加上 32321 端口访问 Hubble UI 的 web 服务了。打开效果如下所示:![](https://filescdn.proginn.com/35c8e7d6a91ab7fd76969ca86688975b/43f1f6766897f83fd2c5fbda048af437.webp)
页面上半部分是之前部署的一整套 conectivity-check 组件的数据流向图,官方叫做 Service Map
,默认情况下可以自动发现基于网络 3 层和 4 层的访问依赖路径,看上去非常 cool,也有点分布式链路追踪图的感觉。点击某个服务,还能看到更为详细的关系图:
![](https://filescdn.proginn.com/92525bef63d9b8b2937dc745815855a4/5b7e8ce450a9969f5cad8b1d8768ee10.webp)
下图是 kube-system 命名空间下的数据流图,能看到 Hubble-UI 组件和 Hubble 组件是通过gRPC 进行通信的,非常有趣。但令人感到的好奇的是,为何没有显示 Kubernetes 核心组件之间的调用关系图:
![](https://filescdn.proginn.com/52e46f5ad4fd8ca4456ff7cf503b4ecf/8ee68448713d3ac0313964931a9bdcbd.webp)
![](https://filescdn.proginn.com/a8435bbd749d1b6a4e4648edebda6fca/5bed2cdb32e0244d99e2f017fee2a86b.webp)
![](https://filescdn.proginn.com/4797701e5b59e111c4eecb69ebe21c23/46d3675d0fe0169cd55d23ef47dcba8f.webp)
![](https://filescdn.proginn.com/ccc468b6f70aaea65e150353dca35f16/19f01c0279d5a2cbd63333c31e1c3617.webp)
对接 Grafana + Prometheus
--set metrics.enabled="{dns:query;ignoreAAAA;destinationContext=pod-short,drop:sourceContext=pod;destinationContext=pod,tcp,flow,port-distribution,icmp,http}"
# 上面的设置,表示开启了 hubble 的 metrics 输出模式,并输出以上这些信息。
# 默认情况下,Hubble daemonset 会自动暴露 metrics API 给 Prometheus。
# 下面的命令会在命名空间 cilium-monitoring 下部署一个 Grafana 服务和 Prometheus 服务
$ kubectl apply -f https://raw.githubusercontent.com/cilium/cilium/v1.6/examples/kubernetes/addons/prometheus/monitoring-example.yaml
# 创建对应 NodePort Service,方便外部访问 web 服务
$ kubectl expose deployment/grafana --type=NodePort --port=3000 --name=gnp -n cilium-monitoring
$ kubectl expose deployment/prometheus --type=NodePort --port=9090 --name=pnp -n cilium-monitoring
![](https://filescdn.proginn.com/10c0916d2347a797d85addc2eb001071/a09b638b717bc4bb3049836ad6fff63a.webp)
取代 kube-proxy 组件
ClusterIP
, NodePort
, ExternalIPs
和 LoadBalancer
,可以完全取代它的位置,同时提供更好的性能、可靠性以及可调试性。当然,这些都要归功于 eBPF 的能力。# 检查 Cilium 对于取代 kube-proxy 的状态
> kubectl exec -it -n kube-system [Cilium-agent-pod] -- cilium status | grep KubeProxyReplacement
# 默认是 Probe 状态
# 当 Cilium agent 启动并运行,它将探测节点内核版本,判断 BPF 内核特性的可用性,
# 如果不满足,则通过依赖 kube-proxy 来补充剩余的 Kubernetess,
# 并禁用 BPF 中的一部分功能
KubeProxyReplacement: Probe [NodePort (SNAT, 30000-32767), ExternalIPs, HostReachableServices (TCP, UDP)]
# 查看 Cilium 保存的应用服务访问列表
# 有了这些信息,就不需要 kube-proxy 进行中转了
> kubectl exec -it -n kube-system [Cilium-agent-pod] -- cilium service list
ID Frontend Service Type Backend
1 10.96.0.10:53 ClusterIP 1 => 100.64.0.98:53
2 => 100.64.3.65:53
2 10.96.0.10:9153 ClusterIP 1 => 100.64.0.98:9153
2 => 100.64.3.65:9153
3 10.96.143.131:9090 ClusterIP 1 => 100.64.4.100:9090
4 10.96.90.39:9090 ClusterIP 1 => 100.64.4.100:9090
5 0.0.0.0:32447 NodePort 1 => 100.64.4.100:9090
6 10.1.1.179:32447 NodePort 1 => 100.64.4.100:9090
7 100.64.0.74:32447 NodePort 1 => 100.64.4.100:9090
8 10.96.190.1:80 ClusterIP
9 10.96.201.51:80 ClusterIP
10 10.96.0.1:443 ClusterIP 1 => 10.1.1.171:6443
2 => 10.1.1.179:6443
3 => 10.1.1.188:6443
11 10.96.129.193:12000 ClusterIP 1 => 100.64.4.221:12000
12 0.0.0.0:32321 NodePort 1 => 100.64.4.221:12000
13 10.1.1.179:32321 NodePort 1 => 100.64.4.221:12000
14 100.64.0.74:32321 NodePort 1 => 100.64.4.221:12000
15 10.96.0.30:3000 ClusterIP
16 10.96.156.253:3000 ClusterIP
17 100.64.0.74:31332 NodePort
18 0.0.0.0:31332 NodePort
19 10.1.1.179:31332 NodePort
20 10.96.131.215:12000 ClusterIP 1 => 100.64.4.221:12000
# 查看 iptables 是否有 kube-proxy 维护的规则
> iptables-save | grep KUBE-SVC
<Empty> # 说明 kube-proxy 没有维护任何应用服务跳转,即可以停止它了。
小结
文章转载:DevOps技术栈
(版权归原作者所有,侵删)
![](https://filescdn.proginn.com/541f53dd2ee2abc1efb535a0712a0fa6/e065ff48c2fcf15b0977d6bbb2e202a7.webp)
点击下方“阅读原文”查看更多
评论