1. 程式人生 > >Cilium架構設計與概念解析

Cilium架構設計與概念解析

作者:宋淨超
本文來自: ServiceMesher 社群

Cilium 要求 Linux kernel 版本在 4.8.0 以上,Cilium 官方建議 kernel 版本至少在 4.9.17 以上,高版本的 Ubuntu 發行版中 Linux 核心版本一般在 4.12 以上,如使用 CentOS7 需要升級核心才能執行 Cilium。

KV 儲存資料庫用儲存以下狀態:

  • 策略身份,Label 列表 <=> 服務身份標識

  • 全域性的服務 ID,與 VIP 相關聯(可選)

  • 封裝的 VTEP(Vxlan Tunnel End Point)對映(可選)

為了簡單起見,Cilium 一般跟容器編排排程器使用同一個 KV 儲存資料庫,例如在 Kubernetes 中使用 etcd 儲存。

組成

下圖是 Cilium 的元件示意圖,Cilium 是位於 Linux kernel 與容器編排系統的中間層。向上可以為容器配置網路,向下可以向 Linux 核心生成 BPF 程式來控制容器的安全性和轉發行為。

管理員通過 Cilium CLI 配置策略資訊,這些策略資訊將儲存在 KV 資料庫裡,Cilium 使用外掛(如 CNI)與容器編排排程系統互動,來實現容器間的聯網和容器分配 IP 地址分配,同時 Cilium 還可以獲得容器的各種元資料和流量資訊,提供監控 API。

Cilium Agent

Cilium Agent 作為守護程序執行在每個節點上,與容器執行時如 Docker,和容器編排系統互動如 Kubernetes。通常是使用外掛的形式(如 Docker plugin)或遵從容器編排標準定義的網路介面(如

CNI)。

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 官方文件

參考