Cluster scope
cluster-scope
模式是cilium默认的IPAM模式,它为每个node分配PodCIDRs,并为每个节点提供host-scope
级的分配器。这与 Kubernetes Host Scope 模式非常像,不同之处在于cilium operator会通过v2.CiliumNode
资源管理每个node的PodCIDRs,而Kubernetes Host Scope 模式是通过kubernetes的v1.Node
来为每个node分配PodCIDRs。
架构
kubernetes无法通过简单配置为node分配PodCIDRs场景下,Cluster scope会非常有用。
这种模式下,cliium agent会等待 v2.CiliumNode
的ip地址族资源字段可用后再启动。
字段 | 描述 |
---|---|
Spec.IPAM.PodCIDRs | IPv4 and/or IPv6 PodCIDR range |
使用cluster-pool IPAM作为CRD-backend的后端
启用 cluster-pool IPAM 模式
-
通过helm安装cilium设置
--set ipam.mode=cluster-pool
选项。 -
根据使用IPv4/IPv6需求选定并按需调整集群级pod的CIDR:
-
--set ipam.operator.clusterPoolIPv4PodCIDRList=<IPv4CIDR>
-
--set ipam.operator.clusterPoolIPv6PodCIDRList=<IPv6CIDR>
-
使用以下选项调整要分配给每个节点的CIDR大小
-
--set ipam.operator.clusterPoolIPv4MaskSize=<IPv4MaskSize>
-
--set ipam.operator.clusterPoolIPv6MaskSize=<IPv6MaskSize>
-
部署cilium和cilium-operator,cilium 会自动等待operator把每个节点的PodCIDR分配完成
验证安装
- 验证cilium正确启动
$ cilium status --all-addresses
KVStore: Ok etcd: 1/1 connected, has-quorum=true: https://192.168.60.11:2379 - 3.3.12 (Leader)
[...]
IPAM: IPv4: 2/256 allocated,
Allocated addresses:
10.0.0.1 (router)
10.0.0.3 (health)
- 验证
spec.ipam.podCIDRs
部分
$ kubectl get cn k8s1 -o yaml
apiVersion: cilium.io/v2
kind: CiliumNode
metadata:
name: k8s1
[...]
spec:
ipam:
podCIDRs:
- 10.0.0.0/24
故障排查
查找ip分配错误
检查 Status.Operator.Error
字段:
kubectl get ciliumnodes -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.status.operator.error}{"\n"}{end}'
检查node CIDRs冲突
pod 默认的CIDR是10.0.0.0/8
。如果node的网路与该网段范围冲突的话可能出现pod无法与其它node通信的问题:所有发出的数据包会认为目标是拥有目标地址所在包含CIDR的所在节点上的pod,而非其它的node。
下面两种方法可以解决该问题:
- 显式地将
clusterPoolIPv4PodCIDRList
设置为非冲突的CIDR - node节点使用不同的CIDR
Cluster Pool v2(Beta版本)
Cluster Pool V2扩展了上述机制,允许将额外的PodCIDRs动态的分配给每个节点。每个cilium agent会通过v2.CiliumNode
对象报告已分配的PodCIDRs的利用率。
如果一个节点可用pod ip资源不足,operator会为该节点分配额外的PodCIDR。与之对应如果一个节点有未使用的PodCIDRs,operator 最终会释放空闲PodCIDRs并重新分配给其它节点。
v2.CIiliumNode
新增扩展了的PodCIDRs字段。
字段 | 描述 |
---|---|
Spec.IPAM.PodCIDRs | List of assigned IPv4 and/or IPv6 PodCIDRs |
Status.IPAM.PodCIDRs | PodCIDR utilization (one of: in-use, depleted, or released) |
当一个node的所有PodCIDR都处于 depleted
或 released
状态时,operator会为node分配一个新的 PodCIDR。
限制
Cluster Pool V2 是一个预览版本的特性,以下限制适用于在cluster-pool-v2beta
模式下运行cilium。
- Cluster Pool V2 只支持本地路由模式,不支持隧道模式的网络。
- 不支持使用IPSec进行透明加密。
- 更多限制详见 GitHub issue 18987。
配置
在helm选项中设置 --set ipam.mode=cluster-pool-v2beta
即可启用 Cluster Pool V2。Cluster Pool V2的CIDR池配置与常规集群相同。请参考 [使用cluster-pool IPAM作为CRD-backend的后端](#使用cluster-pool IPAM作为CRD-backend的后端)
通过下面的字段可以配置每个节点的PodCIDR触发重新分配和释放的阈值:
-
Spec.IPAM.PodCIDRAllocationThreshold
: -
定义每个节点PodCIDR池中最小可用的空闲IP数。
-
如果PodCIDR池中的IP地址总数小于此值,则此节点当前使用的PodCIDRs将被标记为耗尽,cilium operator将为此节点分配新的PodCIDR。
-
该值有效的定义了在无需cilium operator参与时可用IP地址的缓冲区。
-
默认值为8
-
Spec.IPAM.PodCIDRReleaseThreshold
: -
定义节点PodCIDR池最大空闲IP数。
-
当PodCIDR的可用空闲IP总数大于该值,cilium agent会尝试释放当前未使用的PodCIDR。
-
默认值是16。