Cilium 流量治理功能与部署实践
Cilium 概述
Cilium 是一个具备 API 感知的网络和安全的开源软件,用于透明保护使用 Docker 和 Kubernetes 等 Linux 容器管理平台部署的应用程序服务之间的网络连接。Cilium 的基础是一种称为 BPF 的新 Linux 内核技术,该技术可在 Linux 自身内部动态插入强大的安全可见性和控制逻辑。
由于 BPF 在 Linux 内核中运行,因此可以应用和更新 Cilium 安全策略,而无需更改应用程序代码或容器配置。与传统的 sidecar 代理模式相比,不需要在应用容器边上单独部署一个流量代理的容器。可以基于 Linux 内核收集网络包信息,利用 eBPF 程序编写包过滤的规则,减少 Linux 内核网络栈开销。
02
组件及安装方式
包含 cilium、hubble、etcd 和 eBPF 四个部分。其中 eBPF 是 Linux 高版本内核自带的特性,无需额外部署。从图中可以看出,以 DaemonSet 的方式在每一个 k8s Node 部署了一个 Agent,并且与相应的控制面 Cilium Operator 交互(实例数至少一个)。Hubble 提供了一些基础监控的功能,并提供了一个可视化的 UI 界面,可以基于 namespace,协议类型,入流出流等进行一些过滤。在没有 service 请求的情况下,UI 界面下无法展示。
Cilium 各组件交互
Mesh 分支的安装:
[1] 系统要求
Linux Kernel>=4.9.17
clang+LLVM>=10.0
不部署 calico 和 flannel,将 cilium 作为 CNI.
[2] cilium install --version -service-mesh:v1.11.0-beta.1 --config enable-envoy-config=true --kube-proxy-replacement=probe --datapath-mode=vxlan
[3] cilium hubble enable --ui
03
官方 mesh demo 功能总结
作为 CNI,提供了 CiliumNetworkPolicy。
CiliumEnvoyConfig 可以定义负载均衡策略,重写访问路径。
kafka topic 的读写也可以通过 CiliumNetWorkPolicy 定义。
ingress 与 cilium 融合需要 k8s1.19+,external-ip 需要云厂商提供 LB 能力,否则会一直 pending。支持以 RESTFUL API 方式从集群外访问 Service。
支持以 4 层的方式访问 Service,例如通过 IP+Port。包括 externalIPs Service、LoadBalancer Service。
https://github.com/cilium/cilium-service-mesh-beta
CiliumEnvoyConfig 路径重写演示
CiliumNetWorkPolicy 拒绝策略演示
正常情况:
[root@master demo]# kubectl exec tiefighter -- curl -s -XPOST deathstar.default.svc.cluster.local/v1/request-landing
Ship landed
应用拒绝策略后:
04
融合 istio 部署实践
图中的 reviews 各个版本之间的负载均衡是通过 Virtualservice 和 Destinationrule 实现。通过 cilium 安装 istio 需要部署融合版的 istio,一般只有特定的 namespace 下的流量会被 istio 接管,从而可以复用 istio 已有的 CRD 及功能。
兼容 istio 后可以使用的 CRD
05
展望
CiliumEnvoyConfig 支持的 envoy 配置有待扩展
多租户场景:支持 NodePort 的单节点暴露,即多租户隔离。
替代 istio 控制面的选择有待确定:Istio , SMI.当前方案直接安装 istiod
单个 pod 多网卡的支持,以及和其他网络插件的兼容
基于 CiliumEnvoyConfig 开发一系列更加用户友好的 CRD,便于配置
评论