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

參考

相關文章
相關標籤/搜索