ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Calico CNI 插件指南:构建、配置与网络/IPAM 插件工作原理

Calico CNI 插件指南:构建、配置与网络/IPAM 插件工作原理 网络云原生网络安全【免费下载链接】calicoCloud native networking and network security项目地址https://gitcode.com/gh_mirrors/cal/calico点击查看免费下载本文围绕 Calico 开源仓库中的 cni-plugin 组件系统讲解其两个核心产物——CNI 网络插件calico与 CNI IPAM 插件calico-ipam——的构建方法、测试方式、配置字段与底层工作流程。读完本文你将掌握如何本地编译这两个插件、如何理解 CNI 网络配置中每个关键参数的含义以及 ADD/DEL 调用链在源码层面的完整执行路径可直接用于接入任何遵循 CNI 规范的容器编排系统如 Kubernetes、Mesos。Calico CNI 插件解决了什么问题CNIContainer Network Interface是容器运行时与网络插件之间的标准接口协议。任何遵循该规范如 0.1.0、0.2.0、0.3.0、0.3.1、0.4.0、1.0.0的编排器都可以通过配置一个 CNI 网络配置文件把容器的网络接入交给第三方插件完成。Calico 的 cni-plugin 正是这样一组插件它包含两个部分顶层 CNI 网络插件networking plugin负责在容器创建时建立 veth 网络设备对、把容器接入主机网络、将 workload endpoint 信息写入数据存储并关联 Calico 策略CNI IPAM 插件基于 Calico IPAM 模块为容器分配/回收 IP 地址。仓库中把两者打包进同一个二进制入口 cmd/calico/calico.go 通过argv[0]进程被调用时的名字来决定分发到哪个子程序——以calico或calico.exe运行时进入网络插件 plugin.Main以calico-ipam或calico-ipam.exe运行时进入 IPAM 插件 ipamplugin.Mainswitch filename { case calico, calico.exe: plugin.Main(buildinfo.Version) case calico-ipam, calico-ipam.exe: ipamplugin.Main(buildinfo.Version) default: panic(Unknown binary name: filename) }因此部署时只需安装一份可执行文件再以两个名字或符号链接放置到 CNI 的 bin 目录即可。这一点在 Makefile 中也有印证$(BIN)/calico-ipam就是calico的符号链接ln -sf ./calico。本地构建插件与运行测试README 给出的构建入口非常简洁克隆仓库后直接执行make即可完成两个 CNI 插件二进制的构建并运行测试。这里的前提是本地环境装有较新版本的 Docker因为默认构建流程是在容器内完成的。按需拆分的三个目标如下命令作用产物make构建全部插件二进制并运行单元测试bin/$ARCH/calico、bin/$ARCH/calico-ipammake build只构建二进制不跑测试同上make test只运行测试不构建无其中$ARCH为当前目标架构如amd64。查看 Makefile 可以看到测试还会额外依赖 host-local、loopback、portmap、tuning、flannel 等 CNI 辅助插件它们由仓库中的 third_party/cni-plugins 组件构建后拷贝到bin/$ARCH下供单元测试使用。如果不想用容器构建README 特别注明需要Go 1.7 和 glide作为本地依赖管理工具这是仓库编写时点的要求当前仓库根目录的 go.mod 已采用 Go Modules 管理依赖实际构建以仓库当时的 Makefile 与工具链为准。单元测试的三套矩阵Makefile 将单元测试拆分为三个场景均通过ut目标统一触发ut-etcd以DATASTORE_TYPEetcdv3运行使用 CNI 规范版本0.3.1ut-kdd以DATASTORE_TYPEkubernetesKubernetes datastore运行使用 CNI 规范版本1.0.0并排除 KubeVirt 相关用例ut-kubevirt同样基于 Kubernetes datastore 与 CNI 1.0.0但只运行 KubeVirt 标签的用例测试前会先通过install-kubevirt-crds目标把 kubevirt-test-crds.yaml 安装到本地 apiserver。测试以特权容器方式执行--privileged --nethost需要访问 etcd默认http://127.0.0.1:2379与本地 Kubernetes apiserver相关用例见 tests/calico_cni_test.go、tests/calico_cni_ipam_test.go 等文件。Windows 侧的测试则在 win_tests 目录。关于 Windows 构建Makefile 中 Linux 版插件被打包进calico/calico镜像因此该组件只单独产出 Windows 镜像cni-windows。Windows 的calico.exe由仓库根目录的 cmd/calico-windows/main.go 构建它同时携带component cni install子命令树由 operator 驱动完成插件安装安装器再将其以calico与calico-ipam两个名字 stage 到宿主机上。一份真实的 CNI 网络配置示例CNI 插件通过标准输入接收 JSON 格式的网络配置netconf。仓库测试脚本中保留了完整可用的示例 calico-go-with-host-local.json{ cniVersion: 0.3.1, name: net1, type: calico, log_level: INFO, etcd_authority: 1.2.3.4:2379, etcd_endpoints: http://127.0.0.1:2379, ipam: { type: host-local, subnet: 10.0.0.0/8 } }type必须为calico运行时按此名在CNI_PATH下查找插件二进制ipam.type指明 IPAM 插件生产环境通常为calico-ipam也可混用官方host-local此时 Calico 网络插件会在cmdAdd中调用ipam.ExecAdd(conf.IPAM.Type, args.StdinData)执行它见 pkg/plugin/plugin.go。完整的配置字段定义集中在 pkg/types/types.go 的NetConf结构体中下表梳理了主要字段及含义字段说明默认/取值cniVersionCNI 规范版本缺省时回退为0.2.0高于1.0.0会被拒绝name网络名同时用作 Calico profile 名必填type插件类型calicomode/vxlan_mac_prefix/vxlan_vniVXLAN 相关配置可选ipam.typeIPAM 插件类型calico-ipam或host-local等ipam.assign_ipv4/ipam.assign_ipv6是否分配 IPv4/IPv6默认分配 1 个 IPv4、0 个 IPv6ipam.ipv4_pools/ipam.ipv6_pools指定从哪些 IPPool 分配不指定则按默认池mtu容器网卡 MTU0 时读取 MTU 文件见require_mtu_filenum_queuesveth 队列数默认 1nodename/nodename_file节点名来源默认读取/var/lib/calico/nodenamenodename_file_optional节点名文件缺失时是否继续默认 false缺失即报错ipam_lock_file主机级 IPAM 文件锁路径用于串行化并发分配datastore_type/etcd_endpoints/etcd_discovery_srv数据存储连接配置etcdv3也支持kuberneteslog_level/log_file_path等日志级别与轮转配置默认 INFOpolicy.type策略处理器k8s时走 Kubernetes 策略分支kubernetes.kubeconfig/kubernetes.node_nameKubernetes 客户端配置可选feature_control.ip_addrs_no_ipam是否启用免 IPAM 的固定 IP非 k8s 运行时启用会报错device_typeLinux 端虚拟设备类型空/veth为 veth 对netkit使用内核 6.7 的 netkit L2readiness_gates等待就绪的 HTTP endpoint 列表可选ADD 前轮询 30 秒windows_use_single_networkWindows 单 HNS 网络模式限 1 个 IPAM block其中device_type会在cmdAdd入口处被严格校验未知值直接返回错误“unknown device_type in CNI config”而不是静默回退netkit则仅在支持的内核上使用否则回退到 veth。网络插件 ADD/DEL 的源码级流程入口 plugin.Main 支持两个辅助命令行参数-v打印插件版本后退出-t测试数据存储连接——它读取 stdin 中的 netconf、创建 Calico 客户端、查询ClusterInformation的DatastoreReady标志并在配置了kubernetes.kubeconfig时进一步探测 K8s apiserver 的ServerVersion。该参数被安装器用于“等数据存储就绪后再写入 CNI 配置文件”避免编排器过早开始调度 Pod 造成启动竞态。随后通过skel.PluginMainFuncs注册Add/Del/Check回调声明支持 CNI 规范0.1.01.0.0。ADD 流程cmdAdd是创建网络的核心其主干步骤如下解析与校验反序列化 netconf检查cniVersion缺省0.2.0高于 1.0.0 报错校验device_type设置num_queues默认 1若配置了mtu0则尝试从 MTU 文件读取就绪检查确认/var/lib/calico/nodename或nodename_file指定路径存在否则提示检查 calico/node 容器是否挂载了该目录随后创建客户端并再次确认DatastoreReady若配置了readiness_gates则对每个 endpoint 以 5 秒间隔轮询、最长 30 秒工作负载标识解析通过utils.GetIdentifiers从 CNI_ARGS 中提取节点名、编排器、容器 ID、Pod 名/命名空间Kubernetes 场景据此计算 workload endpointWEP名称前缀WEP 复用匹配按前缀列出已有 WorkloadEndpoint并用NameMatches按节点、编排器、容器 ID、Pod 名匹配不比较接口名因为当前每 Pod 仅支持一个接口。匹配到则复用现有 endpoint 并只追加 profile未匹配则新建分支处理Kubernetes 场景Orchestrator k8s委托给 pkg/k8s/k8s.go 的CmdAddK8s其他编排器如 Mesos走默认分支调用 IPAM 插件取地址 → 构造 WorkloadEndpoint 对象并填充Spec.IPNetworks→ 通过dataplane.GetDataplane选择数据面实现Linux 原生 / Windows HNS / gRPC 后端见 pkg/dataplane/dataplane.go→DoNetworking创建 veth主机侧命名为cali 容器 ID 前 11 字符→ 回填 MAC 与接口名落库与 ProfileCreateOrUpdate写入 endpoint若policy.type为空则检查网络名对应的 Profile 是否存在不存在则创建——Kubernetes 场景下入站规则为Allow全部非 K8s 场景则只允许来自带同名 tag 的 profile 的流量输出结果清空网关字段Calico IPAM 不设置网关按请求的cniVersion格式把接口、IP 打印到 stdout 返回给运行时。整个函数对 panic 做了 recover 包装确保任何异常都会以标准 CNI 错误结构返回而非崩溃。DEL 流程cmdDel是对称的清理过程解析配置 → 确认 nodename 文件与数据存储就绪 → 计算 WEP 名 → Kubernetes 场景委托CmdDelK8s非 K8s 场景依次执行调用 IPAM 插件释放地址DeleteIPAM→ 删除 WorkloadEndpoint若不存在则记录日志继续→CleanUpNamespace清理命名空间内的网络设备。若 IPAM 释放失败该错误会在最后作为整体操作失败返回确保调用方感知清理不完整。IPAM 插件地址分配与回收calico-ipam 插件 除了常规的Add/Del外还提供两个特有参数-v打印版本-upgrade从 host-local 迁移到 calico-ipam。该模式要求环境变量KUBERNETES_NODE_NAME指定节点名通过upgrade.Migrate把该节点上 host-local 分配的地址迁入 Calico IPAM 数据存储失败会每秒重试直到成功。迁移逻辑见 pkg/upgrade/migrate.go设计背景可参考 pkg/ipamplugin/DESIGN.md。ADD自动分配与指定分配cmdAdd的分配逻辑分两条路径指定 IPipAddrs注解解析 CNI_ARGS 中的ip参数构造AssignIPArgs含IntendedUse: Workload交由 IPAM 强制执行 IPPool 的AllowedUses加锁后调用AssignIP若地址已被本 Pod 的旧 sandbox 持有则通过transferFromPriorSandbox执行MoveIPToHandle完成转移若地址仍在 cooldown 期则拒绝复用。自动分配默认num41, num60由ipam.assign_ipv4false/ipam.assign_ipv6true调整解析ipv4_pools/ipv6_pools缺省按节点默认池解析构造AutoAssignArgs后调用AutoAssign。若 IPv4 分配不足而 IPv6 已分配成功或反之会先把成功一侧的地址释放掉再返回错误避免地址泄漏。两条路径都通过acquireIPAMLockBestEffort获取主机级文件锁默认路径常量ipamLockPath可用ipam_lock_file覆盖。该锁把同一主机上并发 CNI 调用串行化虽然AutoAssign本身并发安全但串行化能显著降低对 apiserver 的瞬时压力并发请求数被摊平。分配成功后插件按 IP 版本生成 /32 或 /128 掩码的IPConfig并为每个地址追加一条目标为该地址的路由Routes以cniVersion要求的格式输出。DEL按 handle 释放cmdDel依据容器 ID 计算 handle IDKubernetes 场景额外兼容 v2.x 时代的namespace.podworkloadID加锁后调用ReleaseByHandle依次释放两个 handle 下的地址地址不存在时仅告警并继续保证幂等。KubeVirt 虚拟机地址持久化IPAM 插件还内置了 KubeVirt 支持对virt-launcher-前缀的 Pod通过 owner reference 与 VMI 资源校验其身份并在IPAMConfig.Spec.KubeVirtVMAddressPersistence开启默认开启时改用基于 VM 命名空间/名称的 handle IDvmipam.CreateVMHandleID使 VM 重建、热迁移期间 IP 保持不变迁移目标 Pod 复用源 Pod 分配的地址并写入 AlternateOwner 属性宿主侧不再重复编程路由。相关逻辑分布在handleVirtLauncherPod与getVMIInfoForPod中测试见 tests/kubevirt_ipam_test.go。部署安装器与配置注入生产环境通常由 calico/node 或 operator 调用安装器把插件和配置部署到宿主机。安装逻辑位于 pkg/install/install.go通过环境变量控制行为常用变量如下环境变量作用默认值CNI_NET_DIR主机 CNI 配置目录/etc/cni/net.dCNI_CONF_NAME要写入的配置文件名自动选择CNI_NETWORK_CONFIG/CNI_NETWORK_CONFIG_FILE待写入的 netconf 内容或其文件路径空SKIP_CNI_BINARIES逗号分隔、跳过安装的二进制名空UPDATE_CNI_BINARIES是否覆盖同名旧二进制trueSLEEP安装完成后是否驻留trueCALICO_API_GROUP使用的 CRD API groupcrd.projectcalico.org/v1安装器会先把 TLS 资产/calico-secrets与二进制 stage 到宿主机再以-t参数探测数据存储就绪最后写入网络配置文件并在SLEEPtrue时保持运行以便监听后续更新。Windows 侧由calico.exe component cni install子命令驱动同一套安装流程。与 K8s 集成的客户端配置可参考 kubeconfig.sample。许可证说明Calico 的二进制遵循 Apache v2.0 许可唯一例外是 Felix 仓库下bpf-gpl目录中的部分 eBPF 程序采用 GPL 许可。此外插件导入的第三方 Go 包均为 Apache 兼容许可完整清单见 licenses 目录基础容器镜像中还包含多种许可的预打包软件部署前如需合规审计应从上述两处入手核对。赞分享网络云原生网络安全【免费下载链接】calicoCloud native networking and network security项目地址https://gitcode.com/gh_mirrors/cal/calico点击查看免费下载相关推荐Kubespray网络插件全解析Calico、Cilium等CNI对比Kubespray网络插件全解析Calico、Cilium等CNI对比 本文全面解析Kubespray支持的多种CNI网络插件包括Calico、Cilium云原生容器编排DevOps运维HashiCorp Nomad 中的 CNI 插件与桥接网络配置指南HashiCorp Nomad 中的 CNI 插件与桥接网络配置指南 前言 在现代容器编排系统中网络配置是一个关键组件。HashiCorp Nomad 通过集任务调度云原生运维后端kubespray网络隔离多CNI插件与网络策略配置kubespray网络隔离多CNI插件与网络策略配置 概述 在现代Kubernetes集群中网络隔离是确保应用安全性和稳定性的关键要素。kubespray作云原生容器编排DevOps运维创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表