云原生【免费下载链接】kubevirtKubernetes Virtualization API and runtime in order to define and manage virtual machines.项目地址https://gitcode.com/gh_mirrors/ku/kubevirt点击查看免费下载导读KubeVirt 通过 hook sidecar 接口将passt网络绑定插件注册为一种网络绑定机制在虚拟机VMI启动时由 sidecar 把 pod 网络接口改造成基于passt的 vhost-user 后端从而让非 root 的 virt-launcher 进程也能以无特权方式收发 pod 网络流量。本文以 cmd/sidecars/network-passt-binding/README.md 为主线结合仓库内 sidecar 服务端、domain 配置器、CNI 辅助插件与网络绑定插件的通用机制源码完整讲解passt绑定的注册方法、VMI 声明方式、底层工作原理、端口转发与 Istio 兼容行为以及配套 CNI 的部署方式。读完本文你将能够在 KubeVirt 集群中注册并使用passt绑定插件并理解其从 VMI spec 到 libvirt domain XML 的完整改造链路。注意passt网络绑定目前仅支持 pod 网络接口对应 VMI 的pod: {}网络不适用于 multus 等其他网络类型。一、Passt 绑定插件的定位与整体架构1.1 什么是 Passt 绑定passtnetworking/passt是一个无特权模式的网络地址转换与数据通路工具。KubeVirt 将passt包装为一种网络绑定插件VMI 不再使用传统的 tap 设备挂接到 bridge而是通过 libvirt 的vhostuser接口类型把 pod 网络接口直接暴露给passt后端由passt在宿主命名空间内完成数据包转发。从源码注释cmd/sidecars/network-passt-binding/domain/configurator.go可以看到 sidecar 会把 passt 日志写入/var/run/kubevirt/passt.log供 KubeVirt 消费和记录const ( //nolint:gosec // PasstLogFilePath passt log file path Kubevirt consume and record PasstLogFilePath /var/run/kubevirt/passt.log )1.2 与 KubeVirt hook sidecar 机制的关系网络绑定插件属于 KubeVirt 的 hook sidecar 机制。KubeVirt 在定义域define domain阶段会调用注册的 sidecarsidecar 以 gRPC 协议监听 unix socket 并对外暴露OnDefineDomain钩子virt-launcher 在生成域配置之后、交给 libvirt 之前调用该钩子让插件有机会修改mutatedomain XML。在 docs/network/network-binding-plugin.md 中描述了这一机制网络绑定 sidecar 通常会在OnDefineDomain钩子中修改域配置domain configuration……sidecar 的实现逻辑需要添加到OnDefineDomain中。passtsidecar 正是这一机制的典型实现。从 cmd/sidecars/network-passt-binding/main.go 可以看到它的启动流程在共享目录hooks.HookSocketsSharedDirectory即/var/run/kubevirt-hooks下创建名为passt.sock的 unix socket注册InfoServer对外声明自己支持的 API 版本为v1alpha3与V1alpha3Server实现具体的回调从环境变量NETWORK_BINDING_PLUGIN_NAME常量定义见 pkg/hooks/hooks.go读取绑定的插件名未设置时默认为passt启动 gRPC 服务并等待信号或Shutdown回调触发优雅退出。二、注册 Passt 绑定插件在 KubeVirt CR 中通过spec.configuration.network.binding注册passt绑定插件并指定 sidecar 镜像。以下示例与 cmd/sidecars/network-passt-binding/README.md 中的注册方式一致apiVersion: kubevirt.io/v1 kind: KubeVirt metadata: name: kubevirt namespace: kubevirt spec: configuration: network: binding: passt: sidecarImage: registry:5000/kubevirt/network-passt-binding:devel # ...参数说明字段说明configuration.network.binding.passt以插件名为 key 声明一个网络绑定插件passt即该插件的注册名sidecarImage承载 passt sidecar 逻辑的容器镜像需要在 virt-launcher pod 所在的节点可拉取私有仓库时需提前配置 imagePullSecret 或节点可访问需要注意的是sidecarImage中的镜像即 cmd/sidecars/network-passt-binding 目录所构建的镜像它以main.go为入口启动 gRPC 服务向 KubeVirt 声明自己支持OnDefineDomain与Shutdown两个钩子点见 cmd/sidecars/network-passt-binding/server/server.go 的Info实现。三、在 VMI 中启用 Passt 绑定注册插件后在 VMI spec 中把接口的binding.name指向passt并让该接口挂接 pod 网络apiVersion: kubevirt.io/v1 kind: VirtualMachineInstance metadata: name: vmi-passt spec: domain: devices: interfaces: - name: passt binding: name: passt # ... networks: - name: passt-net pod: {} # ...字段对应关系interfaces[].binding.name: passt声明该接口使用已注册的passt绑定插件networks[].name与接口name一致示例中passt与passt-net需一一对应实际使用时接口的name与网络的name必须匹配networks[].pod: {}pod 网络这是 passt 绑定目前唯一支持的网络类型README 明确强调。3.1 sidecar 对绑定声明的校验从源码看sidecar 在收到OnDefineDomain调用后会做严格的合法性校验cmd/sidecars/network-passt-binding/domain/configurator.go在 VMI 的网络列表中查找 pod 网络LookupPodNetwork找不到则报pod network not found按网络名查找对应的接口找不到则报no interface found校验该接口的binding.name是否为passt即 sidecar 从环境变量读到的绑定插件名否则报interface %q is not set with Passt network binding plugin从接口状态中查找主网络接口名PodInterfaceName后续用它作为 passt 后端的设备名。这解释了为什么 README 要求 pod 网络接口必须显式设置binding.name: passtsidecar 只会对满足该条件的接口执行改造。四、底层工作原理从 VMI spec 到 domain XML4.1 调用链OnDefineDomain钩子的完整调用链如下对应 cmd/sidecars/network-passt-binding/server/server.goKubeVirt virt-launcher 生成原始 domain XML通过 gRPC 传入sidecar 将 VMI 反序列化为VirtualMachineInstance对象并读取UseVirtioTransitional与 Istio 注入注解调用domain.NewPasstNetworkConfigurator(...)构造配置器调用callback.OnDefineDomain(domainXML, configurator)完成 XML 反序列化、变更与重新序列化实现见 cmd/sidecars/network-passt-binding/callback/callback.go——注意这里会显式补回 qemu schema 命名空间否则部分 domain 参数会因命名空间缺失而失效返回修改后的 domain XML 给 virt-launcher。4.2 域配置的改造内容Mutate方法cmd/sidecars/network-passt-binding/domain/configurator.go主要做两件事1替换接口定义按 VMI 接口的别名alias查找 domain XML 中对应的接口并整体替换为生成的 passt 接口若不存在则追加。generateInterface同文件 L141-L195生成的接口具备以下特征Type: vhostuserSource.Device指向主 pod 接口名Backend.Type: passt并携带日志文件PasstLogFilePath模型model默认取virtio当UseVirtioTransitional开启时映射为virtio-transitional否则为virtio-non-transitionalL151-L168继承 VMI 上声明的pciAddress、macAddress、acpiIndex。2强制内存共享passt 后端要求内存为共享模式。若 domain 已存在非shared的 memory backing access modeMutate会直接报错memory backing access mode must be shared否则补齐MemoryBacking.Access.Mode shared、MemoryBacking.Source.Type memfdL116-L125。这也是使用 passt 绑定时的隐性资源要求需保证 virt-launcher 能提供 memfd 共享内存。4.3 端口转发Port Forward的生成generatePortForwardcmd/sidecars/network-passt-binding/domain/configurator.go根据 VMI 接口声明的ports生成 passt 的端口转发规则未声明任何端口时默认生成tcp与udp两个无范围的转发条目即全端口转发声明了端口时按协议默认tcp分组生成带Start起始端口的 range非法端口号或 unsupported 协议会被日志记录并跳过端口号合法性由 admission webhook 前置校验因此源码中注释说明非法分支实际不可达与 Istio 兼容当 VMI 带有sidecar.istio.io/inject: true注解时会把istio.ReservedPorts()中的保留端口以Exclude: yes的方式排除在 TCP 转发之外避免与 Istio sidecar 的端口冲突L200-L204。五、配套 CNIpasst-binding-cnipasst 绑定还附带一个 CNI 插件passt-binding-cni用于在 pod 网络命名空间中调整 sysctl 参数使非 root 的 virt-launcherUID 107也能使用 passt 完成低端口监听与 ping 报文收发。5.1 CNI 插件行为从 cmd/cniplugins/passt-binding/pkg/plugin/plugin.go 的实现看ADD操作会在目标网络命名空间内执行net.ipv4.ip_unprivileged_port_start 0允许非特权进程绑定任意端口低端口不需要 root 权限net.ipv4.ping_group_range 107 107把 UID 107virtLauncherUserID加入 ping 组允许其发送 ICMP echo。sysctl 的写入通过 cmd/cniplugins/passt-binding/pkg/plugin/sysctl/sysctl.go 封装最终落到底层sysctl工具DEL与CHECK目前为空实现。该 CNI 还支持通过cni-args传入logicNetworkName用于日志标识config.go。5.2 部署方式仓库提供了安装 CNI 的 DaemonSet 清单 cmd/cniplugins/passt-binding/passt-binding-ds.yamlapiVersion: apps/v1 kind: DaemonSet metadata: name: passt-binding-cni namespace: kubevirt spec: # ... template: spec: containers: - name: installer image: registry:5000/kubevirt/network-passt-binding-cni:devel command: [ /bin/sh, -ce ] args: - | ls -la /cni/kubevirt-passt-binding cp -f /cni/kubevirt-passt-binding /opt/cni/bin echo passt binding CNI plugin installation complete..sleep infinity sleep 2147483647 securityContext: privileged: true volumeMounts: - name: cnibin mountPath: /opt/cni/bin volumes: - name: cnibin hostPath: path: /opt/cni/bin该 DaemonSet 以特权容器把编译好的kubevirt-passt-binding二进制拷贝到各节点的/opt/cni/bin从而让节点上的 CNI 链如 Multus能够调用它。这意味着使用 passt 绑定前需要在集群节点上安装该 CNI 二进制否则 virt-launcher pod 网络命名空间不会获得上述 sysctl 调整passt 的无特权数据通路可能受限。六、Hook 点与生命周期passtsidecar 通过InfoServer.Info声明了两个钩子点cmd/sidecars/network-passt-binding/server/server.goHook 点优先级作用OnDefineDomain0在域定义阶段修改 domain XML注入 vhost-user/passt 接口与共享内存配置Shutdown0收到 shutdown 通知后向Done通道发送信号触发 gRPC 服务优雅退出生命周期行为OnDefineDomain解析 VMI → 校验绑定声明 → 构造配置器 → 回调执行 XML 变更见 callback.goShutdown记录日志Shutdown passt network binding并写入Done通道server.go L125-L129服务退出waitForShutdown同时监听操作系统信号SIGHUP/SIGINT/SIGTERM/SIGQUIT、gRPC 服务错误与 shutdown 通道任一触发后调用server.GracefulStop()server.go L131-L161。七、使用前提与限制汇总仅支持 pod 网络README 明确指出 passt 绑定只适用于 pod 网络接口pod: {}multus 等附加网络不在支持范围需要注册 sidecar 镜像必须先在 KubeVirt CR 的configuration.network.binding中注册passt并指定可拉取的sidecarImage需要安装 CNI 插件集群节点需通过 passt-binding-ds.yaml 之类的 DaemonSet 部署kubevirt-passt-bindingCNI 到/opt/cni/bin内存共享要求domain 必须满足memoryBacking.access.mode shared且source.type memfd若已有冲突配置 sidecar 会拒绝启动报错并保持原 XMLIstio 兼容启用 Istio 注入时 passt 会排除 Istio 保留端口避免端口冲突接口模型默认使用 virtio 模型开启useVirtioTransitional时映射为virtio-transitional。八、深入阅读本文主体文档cmd/sidecars/network-passt-binding/README.mdSidecar 入口与 gRPC 服务cmd/sidecars/network-passt-binding/main.go、cmd/sidecars/network-passt-binding/server/server.go域配置改造与端口转发cmd/sidecars/network-passt-binding/domain/configurator.goXML 回调处理cmd/sidecars/network-passt-binding/callback/callback.goSidecar 测试用例cmd/sidecars/network-passt-binding/domain/configurator_test.go、cmd/sidecars/network-passt-binding/callback/callback_test.goCNI 插件cmd/cniplugins/passt-binding/pkg/plugin/plugin.go、cmd/cniplugins/passt-binding/pkg/plugin/config.goCNI 安装清单cmd/cniplugins/passt-binding/passt-binding-ds.yaml网络绑定插件通用机制docs/network/network-binding-plugin.md赞分享云原生【免费下载链接】kubevirtKubernetes Virtualization API and runtime in order to define and manage virtual machines.项目地址https://gitcode.com/gh_mirrors/ku/kubevirt点击查看免费下载相关推荐Babel 提案插件 babel/plugin-proposal-discard-binding 全解析void 绑定语法、配置与转换原理Babel 提案插件 babel/plugin proposal discard binding 全解析void 绑定语法、配置与转换原理 babel/p编译器开发工具Babel Codemod 插件 babel/plugin-codemod-optional-catch-binding 实战指南自动移除未使用的 catch 绑定Babel Codemod 插件 babel/plugin codemod optional catch binding 实战指南自动移除未使用的 catc编译器开发工具Babel 可选 catch 绑定转换插件 babel/plugin-transform-optional-catch-binding 完整指南Babel 可选 catch 绑定转换插件 babel/plugin transform optional catch binding 完整指南 本文以 Ba编译器开发工具上一篇macOS视频预览终极指南让Finder完美支持多格式视频下一篇Video Analyst5大核心功能解析视频理解开源利器创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考