[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状态
- 启动容器报错
