[TOC]
# 封裝
當未提供配置時,Cilium 會自動在此模式下運行,因為它是對底層網絡基礎設施要求最低的模式。
在此模式下,所有集群節點使用基于 UDP 的封裝協議 VXLAN 或 Geneve 形成隧道網格。 Cilium 節點之間的所有流量都被封裝。
## 對網絡的要求
- 封裝依賴于正常的節點到節點連接。 這意味著如果 Cilium 節點已經可以相互到達,則所有路由要求都已滿足。
- 底層網絡和防火墻必須允許封裝數據包:
| 封裝方式 | 端口范圍/協議 |
| :-: | :-: |
| VXLAN (Default) | 8472/UDP |
| Geneve | 6081/UDP |
## 該模型的優點
- 簡單
連接集群節點的網絡不需要了解 PodCIDR。 集群節點可以產生多個路由或鏈路層域。 只要集群節點可以使用 IP/UDP 相互訪問,底層網絡的拓撲結構就無關緊要。
- 尋址空間
由于不依賴于任何底層網絡限制,可用的尋址空間可能會更大,并且如果相應配置了 PodCIDR 大小,則允許每個節點運行任意數量的 pod。
- 自動配置
當與 Kubernetes 等編排系統一起運行時,集群中所有節點的列表(包括其關聯的分配前綴節點)將自動可供每個代理使用。 加入集群的新節點將自動合并到網格中。
- 身份上下文
封裝協議允許隨網絡數據包一起攜帶元數據。 Cilium 利用此功能來傳輸元數據,例如源安全身份。 身份傳輸是一種優化,旨在避免在遠程節點上進行一次身份查找。
## 該模型的缺點
- MTU 開銷
由于添加了封裝標頭,有效負載可用的有效 MTU 低于本機路由(VXLAN 每個網絡數據包 50 字節)。 這會導致特定網絡連接的最大吞吐量降低。 通過啟用巨型幀(每 1500 字節 50 字節的開銷 vs 每 9000 字節 50 字節的開銷)可以在很大程度上緩解這一問題。
# 主機路由
本地路由數據路徑使用 `tunnel: disabled` 啟用并啟用本機數據包轉發模式。本地數據包轉發模式利用 Cilium 運行的網絡的路由功能,而不是執行封裝。網絡性能基本與主機相差不遠。

在本機路由模式下,Cilium 會將所有未發送至另一個本地端點的數據包委托給 Linux 內核的路由子系統。 這意味著數據包將被路由,就像本地進程發出數據包一樣。 因此,連接集群節點的網絡必須能夠路由 PodCIDR。
配置本機路由時,Cilium 會自動在 Linux 內核中啟用 IP 轉發。
## 對網絡的要求
- 為了運行本機路由模式,連接運行 Cilium 的主機的網絡必須能夠使用為 Pod 或其他工作負載提供的地址轉發 IP 流量。
- 節點上的 Linux 內核必須知道如何轉發運行 Cilium 的所有節點的 pod 數據包或其他工作負載。 這可以通過兩種方式實現:
1. 節點本身不知道如何路由所有 pod IP,但網絡上存在一個知道如何到達所有其他 pod 的路由器。在這種情況下,Linux 節點配置為包含指向此類路由器的默認路由。該模型用于云提供商網絡集成。
2. 每個單獨的節點都知道所有其他節點的所有 Pod IP,并且路由被插入到 Linux 內核路由表中來表示這一點。如果所有節點共享一個 L2 網絡,則可以通過啟用 `auto-direct-node-routes: true` 選項來解決此問題。否則,必須運行額外的系統組件(例如 BGP 守護程序)來分發路由。請參閱 使用 kube-router 運行 BGP 指南,了解如何使用 kube-router 項目實現此目的。
>[info] 測試主機是否為二層網絡可達:
> 1. 當在執行ping主機時,兩臺主機是否都有學習到對方mac地址 `arp -a`
> 2. 使用 `arping` 命令探測
## 配置
必須設置以下配置選項以在本地路由模式下運行數據路徑:
- tunnel: disabled:啟用本機路由模式。
- ipv4-native-routing-cidr: x.x.x.x/y:設置可以執行本機路由的 CIDR。
# 確認當前模式
```shell
# 查看網絡route模式
crictl logs `crictl ps --name cilium-agent -q` 2>&1 | egrep "native-routing|tunnel|auto-direct"
```
# 修改路由模式
從封裝改成主機路由模式
```shell
# 獲取當前版本號
cilium_version=$(helm -n kube-system ls | awk '/cilium/ {print $NF}')
echo $cilium_version
# 備份上一次安裝的參數
helm -n kube-system get values cilium > cilium_custom.yaml
sed -i '1d' cilium_custom.yaml
# 添加參數
cat <<EOF | tee -a cilium_custom.yaml >> /dev/null
# 禁止設置隧道
tunnel: disabled
# 設置可執行本地路由的CIDR
ipv4NativeRoutingCIDR: 10.0.0.0/16
# 所有k8s節點在二層網絡,則使用該參數。
autoDirectNodeRoutes: true
EOF
# 修改參數
helm -n kube-system upgrade cilium cilium/cilium --version $cilium_version -f cilium_custom.yaml
# 重啟cilium
kubectl -n kube-system rollout restart daemonset cilium
kubectl -n kube-system rollout status daemonset cilium
# 驗證
crictl logs `crictl ps --name cilium-agent -q` 2>&1 | egrep "native-routing|tunnel|auto-direct"
```
- 前言
- 架構
- 部署
- kubeadm部署
- kubeadm擴容節點
- 二進制安裝基礎組件
- 添加master節點
- 添加工作節點
- 選裝插件安裝
- Kubernetes使用
- k8s與dockerfile啟動參數
- hostPort與hostNetwork異同
- 應用上下線最佳實踐
- 進入容器命名空間
- 主機與pod之間拷貝
- events排序問題
- k8s會話保持
- 容器root特權
- CNI插件
- calico
- calicoctl安裝
- calico網絡通信
- calico更改pod地址范圍
- 新增節點網卡名不一致
- 修改calico模式
- calico數據存儲遷移
- 啟用 kubectl 來管理 Calico
- calico卸載
- cilium
- cilium架構
- cilium/hubble安裝
- cilium網絡路由
- IP地址管理(IPAM)
- Cilium替換KubeProxy
- NodePort運行DSR模式
- IP地址偽裝
- ingress使用
- nginx-ingress
- ingress安裝
- ingress高可用
- helm方式安裝
- 基本使用
- Rewrite配置
- tls安全路由
- ingress發布管理
- 代理k8s集群外的web應用
- ingress自定義日志
- ingress記錄真實IP地址
- 自定義參數
- traefik-ingress
- traefik名詞概念
- traefik安裝
- traefik初次使用
- traefik路由(IngressRoute)
- traefik中間件(middlewares)
- traefik記錄真實IP地址
- cert-manager
- 安裝教程
- 頒布者CA
- 創建證書
- 外部存儲
- 對接NFS
- 對接ceph-rbd
- 對接cephfs
- 監控平臺
- Prometheus
- Prometheus安裝
- grafana安裝
- Prometheus配置文件
- node_exporter安裝
- kube-state-metrics安裝
- Prometheus黑盒監控
- Prometheus告警
- grafana儀表盤設置
- 常用監控配置文件
- thanos
- Prometheus
- Sidecar組件
- Store Gateway組件
- Querier組件
- Compactor組件
- Prometheus監控項
- grafana
- Querier對接grafana
- alertmanager
- Prometheus對接alertmanager
- 日志中心
- filebeat安裝
- kafka安裝
- logstash安裝
- elasticsearch安裝
- elasticsearch索引生命周期管理
- kibana安裝
- event事件收集
- 資源預留
- 節點資源預留
- imagefs與nodefs驗證
- 資源預留 vs 驅逐 vs OOM
- scheduler調度原理
- Helm
- Helm安裝
- Helm基本使用
- 安全
- apiserver審計日志
- RBAC鑒權
- namespace資源限制
- 加密Secret數據
- 服務網格
- 備份恢復
- Velero安裝
- 備份與恢復
- 常用維護操作
- container runtime
- 拉取私有倉庫鏡像配置
- 拉取公網鏡像加速配置
- runtime網絡代理
- overlay2目錄占用過大
- 更改Docker的數據目錄
- Harbor
- 重置Harbor密碼
- 問題處理
- 關閉或開啟Harbor的認證
- 固定harbor的IP地址范圍
- ETCD
- ETCD擴縮容
- ETCD常用命令
- ETCD數據空間壓縮清理
- ingress
- ingress-nginx header配置
- kubernetes
- 驗證yaml合法性
- 切換KubeProxy模式
- 容器解析域名
- 刪除節點
- 修改鏡像倉庫
- 修改node名稱
- 升級k8s集群
- 切換容器運行時
- apiserver接口
- 其他
- 升級內核
- k8s組件性能分析
- ETCD
- calico
- calico健康檢查失敗
- Harbor
- harbor同步失敗
- Kubernetes
- 資源Terminating狀態
- 啟動容器報錯