Cilium架构设计与概念解析

做者:宋净超
本文来自: 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 地址,该功能与 flannelcalico 网络插件相似。

  • 将其有关容器标识和地址的知识与已配置的安全性和可见性策略相结合,生成高效的 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 methodpath,实现更细粒度的访问策略控制,详见 Cilium 官方文档

参考

相关文章
相关标签/搜索