做者:宋净超
本文来自: ServiceMesher 社区
Cilium 要求 Linux kernel 版本在 4.8.0 以上,Cilium 官方建议 kernel 版本至少在 4.9.17 以上,高版本的 Ubuntu 发行版中 Linux 内核版本通常在 4.12 以上,如使用 CentOS7 须要升级内核才能运行 Cilium。html
KV 存储数据库用存储如下状态:node
策略身份,Label 列表 <=> 服务身份标识docker
全局的服务 ID,与 VIP 相关联(可选)数据库
封装的 VTEP(Vxlan Tunnel End Point)映射(可选)安全
为了简单起见,Cilium 通常跟容器编排调度器使用同一个 KV 存储数据库,例如在 Kubernetes 中使用 etcd 存储。bash
下图是 Cilium 的组件示意图,Cilium 是位于 Linux kernel 与容器编排系统的中间层。向上能够为容器配置网络,向下能够向 Linux 内核生成 BPF 程序来控制容器的安全性和转发行为。网络
管理员经过 Cilium CLI 配置策略信息,这些策略信息将存储在 KV 数据库里,Cilium 使用插件(如 CNI)与容器编排调度系统交互,来实现容器间的联网和容器分配 IP 地址分配,同时 Cilium 还能够得到容器的各类元数据和流量信息,提供监控 API。app
Cilium Agent运维
Cilium Agent 做为守护进程运行在每一个节点上,与容器运行时如 Docker,和容器编排系统交互如 Kubernetes。一般是使用插件的形式(如 Docker plugin)或听从容器编排标准定义的网络接口(如 CNI)。ide
Cilium Agent 的功能有:
暴露 API 给运维和安全团队,能够配置容器间的通讯策略。还能够经过这些 API 获取网络监控数据。
收集容器的元数据,例如 Pod 的 Label,可用于 Cilium 安全策略里的 Endpoint 识别,这个跟 Kubernetes 中的 service 里的 Endpoint 相似。
与容器管理平台的网络插件交互,实现 IPAM 的功能,用于给容器分配 IP 地址,该功能与 flannel、calico 网络插件相似。
将其有关容器标识和地址的知识与已配置的安全性和可见性策略相结合,生成高效的 BPF 程序,用于控制容器的网络转发和安全行为。
使用 clang/LLVM 将 BPF 程序编译为字节码,在容器的虚拟以太网设备中的全部数据包上执行,并将它们传递给 Linux 内核。
Cilium 提供了管理命令行管理工具,能够与 Cilium Agent API 交互。cilium
命令使用方式以下。
Usage: cilium [command]Available Commands: bpf 直接访问本地 BPF map cleanup 重置 agent 状态 completion bash 自动补全 config Cilium 配置选项 debuginfo 从 agent 请求可用的调试信息 endpoint 管理 endpoint identity 管理安全身份 kvstore 直接访问 kvstore map 访问 BPF map monitor 显示 BPF 程序事件 node 管理集群节点 policy 管理安全策略 prefilter 管理 XDP CIDR filter service 管理 service & loadbalancer status 显示 daemon 的状态 version 打印版本信息复制代码
详细使用状况请参考 Cilium Command Cheatsheet。
使用 docker-compose 安装测试,须要先用 vagrant 启动虚拟机,使用的是 Ubuntu-17.10 的 vagrant box。在下面的示例中,Cilium 是使用 docker network plugin 的方式部署的。Cilium 的一项主要功能——为容器建立网络,使用 docker inspect
来查询使用 Cilium 网络的容器配置,能够看到 Cilium 建立的容器网络示例以下。
"Networks": { "cilium-net": { "IPAMConfig": null, "Links": null, "Aliases": [ "a08e52d13a38" ], "NetworkID": "c4cc3ac444f3c494beb1355e4a9c4bc474d9a84288ceb2030513e8406cdf4e9b", "EndpointID": "2e3e4486525c20fc516d0a9d1c52f84edf9a000f3068803780e23b4c6a1ca3ed", "Gateway": "", "IPAddress": "10.15.125.240", "IPPrefixLen": 32, "IPv6Gateway": "f00d::a0f:0:0:1", "GlobalIPv6Address": "f00d::a0f:0:0:ed50", "GlobalIPv6PrefixLen": 128, "MacAddress": "", "DriverOpts": null } }复制代码
NetworkID:每一个网络平面的惟一标识
EndpointID:每一个容器/Pod 的在网络中的惟一标识
在 docker-compose 安装方式的快速开始指南中,演示了如何使用 Label 来选择容器,从而限制两个容器(应用)之间的流量访问权限的。
策略使用 JSON 格式配置,例如官方示例使用 Cilium 直接在 L3/L4 层管理容器间访问策略的方式。例以下面的策略配置具备 id=app2
标签的容器可使用 TCP 协议、80 端口访问具备标签 id=app1
标签的容器。
[{ "labels": [{"key": "name", "value": "l3-rule"}], "endpointSelector": {"matchLabels":{"id":"app1"}}, "ingress": [{ "fromEndpoints": [ {"matchLabels":{"id":"app2"}} ], "toPorts": [{ "ports": [{"port": "80", "protocol": "TCP"}] }] }]}]复制代码
将该配置保存成 JSON 文件,在使用 cilium policy import
命令便可应用到 Cilium 网络中。
如图所示,此时 id
标签为其余值的容器就没法访问 id=app1
容器,策略配置中的 toPorts
中还能够配置 HTTP method
和 path
,实现更细粒度的访问策略控制,详见 Cilium 官方文档。