[TOC]
IP 地址管理 (IPAM) 負責 Cilium 管理的網絡端點(容器等)使用的 IP 地址的分配和管理。 支持多種IPAM模式,滿足不同用戶的需求:
- Cluster Scope (Default)
- Kubernetes Host Scope
>[danger] 不建議更改現有集群的 IPAM 模式。 在生產環境中更改 IPAM 模式可能會導致現有工作負載的連接持續中斷。
# 集群范圍
集群范圍 IPAM 模式將 PodCIDR 分配給每個節點,并使用每個節點上的主機范圍分配器分配 IP。因此它類似于 Kubernetes 主機范圍模式。區別在于 Kubernetes 不是通過 Kubernetes v1.Node資源分配每個節點的 PodCIDR,而是 Cilium Operator 通過 v2.CiliumNode 資源管理每個節點的 PodCIDR。這種模式的優點是它不依賴于 Kubernetes 被配置為分發每個節點的 PodCIDR。

如果無法將 Kubernetes 配置為分發 PodCIDR 或需要更多控制,這將非常有用。
在這種模式下,Cilium 代理將在啟動時等待,直到 PodCIDRs 范圍通過 Cilium 節點 v2.CiliumNode 對象,通過 v2.CiliumNode 中設置的資源字段為所有啟用的地址族提供:
| 字段 | 描述 |
| :-: | :-: |
| Spec.IPAM.PodCIDRs | IPv4 和/或 IPv6 PodCIDR 范圍 |
## 安裝時啟用該模式
1. 使用 helm 和以下選項為 Kubernetes 設置 Cilium:--set ipam.mode=cluster-pool。該參數默認值為 cluster-pool
2. 根據您是否使用 IPv4 和/或 IPv6,您可能需要使用以下選項調整為集群的 pod 分配的 podCIDR:
- --set ipam.operator.clusterPoolIPv4PodCIDRList=<IPv4CIDR>,該參數默認值為 ["10.0.0.0/8"]
- --set ipam.operator.clusterPoolIPv6PodCIDRList=<IPv6CIDR>,該參數默認值為 ["fd00::/104"]
3. 要調整應分配給每個節點的 CIDR 大小,您可以使用以下選項:
- --set ipam.operator.clusterPoolIPv4MaskSize=<IPv4MaskSize>,該參數默認值為 24
- --set ipam.operator.clusterPoolIPv6MaskSize=<IPv6MaskSize>,該參數默認值為 120
4. 部署 Cilium 和 Cilium-Operator。 Cilium 將自動等待,直到 Cilium Operator 為其節點分配 podCIDR。
5. 驗證
- `kubectl get ciliumnodes -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.spec.ipam.podCIDRs}{"\t"}{.status.ipam.operator-status}{"\n"}{end}'`,檢查最后一個字段為空,且CIDRs字段是在指定參數范圍內
## 擴展cluster-pool范圍
不要更改 clusterPoolIPv4PodCIDRList 列表的任何現有元素,因為更改會導致意外行為。 **如果 IPAM 已耗盡,則將新地址范圍添加到列表中**。 最小掩碼長度為 /30,建議的最小掩碼長度至少為 /29。 添加新元素而不是更改現有元素的原因是分配器為每個 CIDR 塊保留 2 個 IP 用于網絡和廣播地址。 **更改 clusterPoolIPv4MaskSize 也是不可能的**。
# Kubernetes 主機范圍
Kubernetes 主機范圍 IPAM 模式啟用 ipam: kubernetes 并將地址分配委托給集群中的每個單獨節點。Kubernetes 分配的 IP 超出了與每個節點關聯的 PodCIDR 范圍。

在這種模式下,Cilium 代理將在啟動時等待,直到 PodCIDR 范圍通過 Kubernetes v1.Node 對象通過以下方法之一為所有啟用的地址家族提供:
**通過 v1.Node 資源字段**
| 字段 | 描述 |
| :-: | :-: |
| spec.podCIDRs | IPv4 和 / 或 IPv6 PodCIDR 范圍 |
| spec.podCIDR | IPv4 或 IPv6 PodCIDR 范圍 |
>[warning] kube-controller-manager 使用 --allocate-node-cidrs 標志運行 kube-controller-manager 以指示 Kubernetes 應該分配的 PodCIDR 范圍。
**通過 v1.Node 注釋**
| 注解 | 描述 |
| :-: | :-: |
| io.cilium.network.ipv4-pod-cidr | IPv4 PodCIDR 范圍 |
| io.cilium.network.ipv6-pod-cidr | IPv6 PodCIDR 范圍 |
| io.cilium.network.ipv4-cilium-host | cilium 主機接口的 IPv4 地址 |
| io.cilium.network.ipv6-cilium-host | cilium 主機接口的 IPv6 地址 |
| io.cilium.network.ipv4-health-ip | cilium-health 端點的 IPv4 地址 |
| io.cilium.network.ipv6-health-ip | cilium-health 端點的 IPv6 地址 |
>[info] 基于注釋的機制主要與舊版 Kubernetes 結合使用,這些版本尚不支持 `spec.podCIDR`,但啟用了對 IPv4 和 IPv6 的支持。
>
> 可以通過 `kubectl explain nodes.spec | grep podCIDR` 來確認是否支持
## 安裝時啟用該模式
1. 使用 helm 和以下選項為 Kubernetes 設置 Cilium:`--set ipam.mode=kubernetes`。
2. 如果 cidr 地址范圍啟動ipv4,則添加 `--set k8s.requireIPv4PodCIDR=true`。不過當 `--set ipam.mode=kubernetes` 時,如果enable-ipv4為true,自動啟用該選項
3. 如果 cidr 地址范圍啟動ipv6,則添加 `--set k8s.requireIPv6PodCIDR=true`。不過當 `--set ipam.mode=kubernetes` 時,如果enable-ipv6為true,自動啟用該選項
# 確認當前使用IPAM模式
```shell
kubectl -n kube-system exec -it ds/cilium -c cilium-agent -- cilium config get IPAM
```
- 前言
- 架構
- 部署
- 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狀態
- 啟動容器報錯