Cilium架構設計與概念解析

ServiceMesher2018-11-24 21:37:07

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 內核生成 來控制容器的安全性和轉發行為。

員通過 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 地址,該功能與 flannel、calico 網絡插件類似。

  • 將其有關容器標識和地址的知識與已配置的安全性和可見性策略相結合,生成高效的 BPF 程序,用於控制容器的網絡轉發和安全行為。

  • 使用 clang/LLVM 將 BPF 程序編譯為字節碼,在容器的虛擬以太網設備中的所有數據包上執行,並將它們傳遞給 Linux 內核。

命令行工具

Cilium 提供了管理命令行管理工具,可以與 Cilium Agent API 交互。 cilium 命令使用方式如下。

  1. Usage:

  2.  cilium [command]

  3. Available Commands:

  4.  bpf                      直接訪問本地 BPF map

  5.  cleanup                  重置 agent 狀態

  6.  completion               bash 自動補全

  7.  config                   Cilium 配置選項

  8.  debuginfo                 agent 請求可用的調試信息

  9.  endpoint                 管理 endpoint

  10.  identity                 管理安全身份

  11.  kvstore                  直接訪問 kvstore

  12.  map                      訪問 BPF map

  13.  monitor                  顯示 BPF 程序事件

  14.  node                     管理集群節點

  15.  policy                   管理安全策略

  16.  prefilter                管理 XDP CIDR filter

  17.  service                  管理 service & loadbalancer

  18.  status                   顯示 daemon 的狀態

  19.  version                  打印版本信息

詳細使用情況請參考 Cilium Command Cheatsheet。

策略控制示例

使用 docker-compose 安裝測試,需要先用 vagrant 啟動虛擬機,使用的是 Ubuntu-17.10 的 vagrant box。在下面的示例中,Cilium 是使用 docker network plugin 的方式部署的。Cilium 的一項主要功能——為容器創建網絡,使用 docker inspect 來查詢使用 Cilium 網絡的容器配置,可以看到 Cilium 創建的容器網絡示例如下。

  1.            "Networks": {

  2.                "cilium-net": {

  3.                    "IPAMConfig": null,

  4.                    "Links": null,

  5.                    "Aliases": [

  6.                        "a08e52d13a38"

  7.                    ],

  8.                    "NetworkID": "c4cc3ac444f3c494beb1355e4a9c4bc474d9a84288ceb2030513e8406cdf4e9b",

  9.                    "EndpointID": "2e3e4486525c20fc516d0a9d1c52f84edf9a000f3068803780e23b4c6a1ca3ed",

  10.                    "Gateway": "",

  11.                    "IPAddress": "10.15.125.240",

  12.                    "IPPrefixLen": 32,

  13.                    "IPv6Gateway": "f00d::a0f:0:0:1",

  14.                    "GlobalIPv6Address": "f00d::a0f:0:0:ed50",

  15.                    "GlobalIPv6PrefixLen": 128,

  16.                    "MacAddress": "",

  17.                    "DriverOpts": null

  18.                }

  19.            }

  • NetworkID:每個網絡平面的唯一標識

  • EndpointID:每個容器/Pod 的在網絡中的唯一標識

在 docker-compose 安裝方式的快速開始指南中,演示瞭如何使用 Label 來選擇容器,從而限制兩個容器(應用)之間的流量訪問權限的。

策略使用 JSON 格式配置,例如官方示例使用 Cilium 直接在 L3/L4 層管理容器間訪問策略的方式。例如下面的策略配置具有 id=app2 標籤的容器可以使用 TCP 協議、80 端口訪問具有標籤 id=app1 標籤的容器。

  1. [{

  2.    "labels": [{"key": "name", "value": "l3-rule"}],

  3.    "endpointSelector": {"matchLabels":{"id":"app1"}},

  4.    "ingress": [{

  5.        "fromEndpoints": [

  6.            {"matchLabels":{"id":"app2"}}

  7.        ],

  8.        "toPorts": [{

  9.                "ports": [{"port": "80", "protocol": "TCP"}]

  10.        }]

  11.    }]

  12. }]

將該配置保存成 JSON 文件,在使用 cilium policyimport 命令即可應用到 Cilium 網絡中。

如圖所示,此時 id 標籤為其他值的容器就無法訪問 id=app1 容器,策略配置中的 toPorts 中還可以配置 HTTP methodpath,實現更細粒度的訪問策略控制,詳見 Cilium 官方文檔。

參考

  • https://cilium.readthedocs.io/en/stable/concepts/

  • https://cilium.readthedocs.io/en/stable/gettingstarted/docker/

相關閱讀推薦

Istio

IBM Istio

  • 111 Istio

  • 118 Istio上手

  • 1115 Istio

  • 11月22日 Envoy

  • 1129 使Istio

  • 126 Istio mixer -

  • 1213 Istio

  • 1220 Istio使Serverless knative

  • IBMIstio

點擊【閱讀原文】跳轉到ServiceMesher網站上瀏覽可以查看文中的鏈接。

  • SOFAMesh(https://github.com/alipay/sofa-mesh)基於Istio的大規模服務網格解決方案

  • SOFAMosn(https://github.com/alipay/sofa-mosn)使用Go語言開發的高性能Sidecar代理

合作社區

參與社區

以下是參與ServiceMesher社區的方式,最簡單的方式是聯繫我!

  • 加入微信交流群:關注本微信公眾號後訪問主頁右下角有獲取聯繫方式按鈕,添加好友時請註明姓名-公司

  • 社區網址:http://www.servicemesher.com

  • Slack:https://servicemesher.slack.com (需要邀請才能加入)

  • GitHub:https://github.com/servicemesher

  • Istio中文文檔進度追蹤:https://github.com/servicemesher/istio-official-translation

  • Twitter: https://twitter.com/servicemesher

  • 提供文章線索與投稿:https://github.com/servicemesher/trans


閱讀原文

TAGS: