做者:宋淨超
本文來自: 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 官方文檔。