host-local
是一种IP地址管理(IPAM)插件。
它从一组地址范围中分配IP地址,也可以从主机上的resolv.conf文件中获取DNS配置。它在主机文件系统上存储本地状态,因此可以确保单个主机上IP地址的唯一性。
该分配器可以分配多个地址范围,并支持多个(不相交的)子网集。分配策略是在每个范围集中松散的轮询。
在 CNI 调用链中,每个插件都会返回一个 JSON 格式的结果,其中会包含网络配置信息,如 IP 地址、子网掩码、网关等。当一个插件执行完毕,将其返回的结果传递给下一个插件,下一个插件将使用上一个插件返回的网络配置信息来配置网络。当最后一个插件执行完毕后,kubelet 会检查所有插件返回的结果,只有当所有插件都成功设置了 IP 地址,才会认为整个 CNI 调用链执行成功。如果其中一个插件失败,后续的插件将不会被执行,同时整个 CNI 调用链也会被标记为失败。
配置示例(多个地址范围)
ranges
表示一个列表,元素是rangeSet
,下面的ranges
包含两个rangeSet
。ranges
的长度表示返回多少ip
。rangeSet
表示ip
地址的可选范围。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31{
"ipam": {
"type": "host-local",
"ranges": [
[
{
"subnet": "10.10.0.0/16",
"rangeStart": "10.10.1.20",
"rangeEnd": "10.10.3.50",
"gateway": "10.10.0.254"
},
{
"subnet": "172.16.5.0/24"
}
],
[
{
"subnet": "3ffe:ffff:0:01ff::/64",
"rangeStart": "3ffe:ffff:0:01ff::0010",
"rangeEnd": "3ffe:ffff:0:01ff::0020"
}
]
],
"routes": [
{ "dst": "0.0.0.0/0" },
{ "dst": "192.168.0.0/16", "gw": "10.10.5.1" },
{ "dst": "3ffe:ffff:0:01ff::1/64" }
],
"dataDir": "/run/my-orchestrator/container-ipam-state"
}
}
ip地址分配
对于每一个请求的自定义 IP,host-local 分配器会在它所管理的地址范围中进行请求。因此可以指定多个自定义 IP 和多个地址范围。如果一个IP在使用中或者不在范围内将会分配失败。
文件存储
host-local
将已分配的 IP 地址作为文件存储在 /var/lib/cni/networks/$NETWORK_NAME 目录下。
源码分析
host-local入口
1 | // PluginMain 是plugin的main函数,自动进行了错误处理 |
三个方法cmdCheck,cmdAdd, cmdDel。
cmdCheck
1 | // 根据提供的ContainerID和IfName,判断ip是否存在。如不存在则返回一个错误。 |
cmdAdd
1 | // 从可选分配一个ip |
cmdDel
1 | // 释放ip |
对应的一些结构体
1 |
|
REF:
1.https://www.cni.dev/plugins/current/ipam/host-local/
2.plugins/ipam/host-local/main.go
3.plugins/ipam/host-local/backend/allocator/allocator.go
4.plugins/ipam/host-local/backend/disk/backend.go
5. plugins/ipam/host-local/backend/allocator/config.go