最近业界使用范围最广的K8S CNI网络方案 Calico 宣布支持 eBPF,而作为第一个通过 eBPF 实现了 kube-proxy 所有功能的 K8S 网络方案——Cilium,它的先见之名是否能转成优势,继而成为 CNI 新的头牌呢?今天我们一起来入门最 Cool Kubernetes 网络方案 Cilium。Cilium介绍
以下基于 Cilium官网文档翻译整理。
> 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 如果所有的 deployment 都能成功运行起来,说明 Cilium 已经成功部署并工作正常。网络可视化神器 Hubble上文提到了 Cilium 强大之处就是提供了简单高效的网络可视化功能,它是通过 Hubble组件完成的。Cilium在1.7版本后推出并开源了Hubble,它是专门为网络可视化设计,能够利用 Cilium 提供的 eBPF 数据路径,获得对 Kubernetes 应用和服务的网络流量的深度可见性。这些网络流量信息可以对接 Hubble CLI、UI 工具,可以通过交互式的方式快速诊断如与 DNS 相关的问题。除了 Hubble 自身的监控工具,还可以对接主流的云原生监控体系—— Prometheus 和 Grafana,实现可扩展的监控策略。
> 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 服务了。打开效果如下所示:
Service Map
,默认情况下可以自动发现基于网络 3 层和 4 层的访问依赖路径,看上去非常 cool,也有点分布式链路追踪图的感觉。点击某个服务,还能看到更为详细的关系图:--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。 你可以对接现有的 Grafana+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 完成部署后,打开 Grafana 网页,导入官方制作的 dashboard,可以快速创建基于 Hubble 的 metrics 监控。等待一段时间,就能在 Grafana 上看到数据了: Cilium 配合 Hubble,的确非常好用!取代 kube-proxy 组件Cilium 另外一个很大的宣传点是宣称已经全面实现kube-proxy的功能,包括
ClusterIP
, NodePort
, ExternalIPs
和 LoadBalancer
,可以完全取代它的位置,同时提供更好的性能、可靠性以及可调试性。当然,这些都要归功于 eBPF 的能力。官方文档中提到,如果你是在先有 kube-proxy 后部署的 Cilium,那么他们是一个 “共存” 状态,Cilium 会根据节点操作系统的内核版本来决定是否还需要依赖 kube-proxy 实现某些功能,可以通过以下手段验证是否能停止 kube-proxy 组件:# 检查 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
责任编辑:haq
全部0条评论
快来发表一下你的评论吧 !