本期课堂由谐云研发工程师叶元鹏作为讲师,带来《Cilium 流量治理功能概述及部署实践》分享,围绕Cilium进行了详细介绍,并对其组件、安装方式及路径功能等进行了深入讲解。

cilium安装 bgp cilium部署_kubernetes

01 Cilium 概述

Cilium是一个具备API感知的网络和安全的开源软件,用于透明保护使用Docker和Kubernetes等Linux容器管理平台部署的应用程序服务之间的网络连接。Cilium的基础是一种称为BPF的新Linux内核技术,该技术可在Linux自身内部动态插入强大的安全可见性和控制逻辑。

由于BPF在Linux内核中运行,因此可以应用和更新Cilium安全策略,而无需更改应用程序代码或容器配置。与传统的sidecar代理模式相比,不需要在应用容器边上单独部署一个流量代理的容器。可以基于Linux内核收集网络包信息,利用eBPF程序编写包过滤的规则,减少Linux内核网络栈开销。

02 组件及安装方式

cilium安装 bgp cilium部署_kubernetes_02

包含cilium、hubble、etcd和eBPF四个部分。其中eBPF是Linux 高版本内核自带的特性,无需额外部署。从图中可以看出,以DaemonSet的方式在每一个k8s Node部署了一个Agent,并且与相应的控制面Cilium Operator交互(实例数至少一个)。Hubble提供了一些基础监控的功能,并提供了一个可视化的UI界面,可以基于namespace,协议类型,入流出流等进行一些过滤。在没有service请求的情况下,UI界面下无法展示。

cilium安装 bgp cilium部署_中间件_03

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路径重写演示

cilium安装 bgp cilium部署_安全_04

CiliumNetWorkPolicy拒绝策略演示

正常情况:
[root@master demo]# kubectl exec tiefighter – curl -s -XPOST deathstar.default.svc.cluster.local/v1/request-landing
Ship landed

应用拒绝策略后:

cilium安装 bgp cilium部署_cilium安装 bgp_05

04 融合istio部署实践

cilium安装 bgp cilium部署_cilium安装 bgp_06

图中的reviews各个版本之间的负载均衡是通过Virtualservice和Destinationrule实现。通过cilium安装istio需要部署融合版的istio,一般只有特定的namespace下的流量会被istio接管,从而可以复用istio已有的CRD及功能。
兼容istio后可以使用的CRD

05

展望

CiliumEnvoyConfig 支持的envoy配置有待扩展

多租户场景:支持NodePort的单节点暴露,即多租户隔离。

替代istio 控制面的选择有待确定:Istio , SMI.当前方案直接安装istiod

单个pod多网卡的支持,以及和其他网络插件的兼容

基于CiliumEnvoyConfig开发一系列更加用户友好的CRD,便于配置