当前位置: 首页 > news >正文

Kubernetes控制平面组件:Kubelet详解(七):容器网络接口 CNI

云原生学习路线导航页(持续更新中)

  • kubernetes学习系列快捷链接
    • Kubernetes架构原则和对象设计(一)
    • Kubernetes架构原则和对象设计(二)
    • Kubernetes架构原则和对象设计(三)
    • Kubernetes控制平面组件:etcd(一)
    • Kubernetes控制平面组件:etcd(二)
    • Kubernetes控制平面组件:API Server详解(一)
    • Kubernetes控制平面组件:API Server详解(二)
    • Kubernetes控制平面组件:调度器Scheduler(一)
    • Kubernetes控制平面组件:调度器Scheduler(二)
    • Kubernetes控制平面组件:Controller Manager 之 内置Controller详解
    • Kubernetes控制平面组件:Controller Manager 之 NamespaceController 全方位讲解
    • Kubernetes控制平面组件:Kubelet详解(一):架构 及 API接口层介绍
    • Kubernetes控制平面组件:Kubelet详解(二):核心功能层
    • Kubernetes控制平面组件:Kubelet详解(三):CRI 容器运行时接口层
    • Kubernetes控制平面组件:Kubelet详解(四):gRPC 与 CRI gRPC实现
    • Kubernetes控制平面组件:Kubelet详解(五):切换docker运行时为containerd
    • Kubernetes控制平面组件:Kubelet详解(六):pod sandbox(pause)容器
    • Kubernetes控制平面组件:Kubelet 之 Static 静态 Pod

本文是 kubernetes 的控制面组件 kubelet 系列文章第七篇,主要对 容器网络接口CNI 进行讲解,包括:kubernetes网络模型的分类、通信原则、CNI发展历程、主要功能、工作原理、常见插件等,并对Calico插件的实现原理做了详细讲解

  • 希望大家多多 点赞 关注 评论 收藏,作者会更有动力继续编写技术文章

1.kubernetes网络模型

1.1.kubernetes网络模型分类

  • kubernetes网络模型大体可以分为三类
    • pod 之间的通信:包括 同节点pod通信、跨节点pod通信,这种一般通过CNI实现
    • pod 通过service 与别的pod通信:这种并非pod之间的直连通信,而是通过service通信。此类不属于CNI范畴,由kube-proxy管理
    • 外部流量访问pod:入站流量相关,由Ingress管理

1.2.pod 之间通信的基本原则

1.2.1.pod间通信基本原则

在这里插入图片描述

  • Kubernetes 的网络模型定义了容器间通信的基本规则,核心目标是确保所有 Pod 无论位于哪个节点,均可直接通过 IP 地址相互通信,无需 NAT 转换。

1.2.2.如何理解 pod 间通信无需NAT转换

  • NAT(网络地址转换)是一种 将私有网络内的设备IP地址转换为公共IP地址的技术,主要用于解决IPv4地址不足问题。它允许多个设备通过一个公网IP共享上网,常见于家庭路由器。
  • 因此pod之间通信不使用NAT,就表示 每个 Pod 拥有集群内全局唯一的 IP 地址,跨节点通信时流量直接通过 Pod IP 寻址,无需经过地址或端口转换(类似局域网设备直连)。
  • 对比传统 NAT 场景:若使用 NAT,Pod A 访问 Pod B 时,B 看到的源 IP 可能是 Pod A 所在的节点 IP,而非 Pod A 的真实 IP,破坏网络透明性并增加运维复杂度。

2.CNI(Container Network Interface)接口设计

2.1.CNI 的发展历程

  • Kubernetes 早期版本中,网络功能主要依赖 ​​kubenet​​ 等内置插件实现,存在显著局限性:

    • ​​灵活性不足​​:网络方案与特定实现深度绑定,难以支持多样化的网络需求(如跨云网络、安全策略等)。
    • ​​配置复杂​​:手动管理网络参数(如 IP 分配、路由规则)需要较高的运维成本,且易出错。
    • ​​扩展性差​​:无法快速集成新兴网络技术,阻碍了 Kubernetes 在复杂场景下的应用。
  • ​​为解决上述问题,CoreOS​​ 等公司于 2015 年提出了 ​​CNI 规范​​,CNI最初是由CoreOS为 rkt容器引擎创建的,目前已经成为事实标准。目前绝大部分的容器平台都采用CNI标准(rkt,Kubernetes,OpenShift等),核心设计原则包括:

    • ​​插件化架构​​:CNI 仅定义接口标准,具体实现由第三方插件完成(如 Flannel、Calico 等)。
    • ​​功能聚焦​​:仅关注容器的网络创建与销毁,接口设计简洁(如 ADD、DELETE 操作)。
    • ​​兼容性​​:支持多种容器运行时(Docker、containerd)和编排系统(Kubernetes、Mesos)。
  • 关键里程碑​​:​​2016年​​:Kubernetes 1.5 版本正式集成 CNI,取代原有网络模型,成为默认网络接口。

    • 标准化流程​​:CNI 插件需以可执行文件形式实现,通过配置文件(/etc/cni/net.d)定义网络参数。

2.2.CNI 的职能

  • CNI(Container Network Interface) 是 Kubernetes 网络模型的实现标准,负责实现 pod 之间的直接通信:包括 容器与主机的通信同节点pod通信跨节点pod通信
  • 实现手段:
    • 网络配置:在容器创建时分配 IP、配置路由和 DNS。
    • 插件链:插件化设计,支持多个插件按顺序执行(如先分配 IP 再设置防火墙规则)。
    • 资源管理:通过 IPAM(IP 地址管理)插件分配和回收 IP。

2.3.CNI 插件分类及常见插件

github:https://github.com/containernetworking/plugins

在这里插入图片描述

  • CNI插件大体可以分为三类:
    • IPAM:IP Address Manager,负责管理 ip 地址,比如给pod分配ip
    • 主插件 网卡设置:负责实现 容器与主机的通信同节点pod通信跨节点pod通信
    • Meta 附加功能:负责cni的扩展功能。比如实现端口映射、容器网络限流、增加防火墙等

2.4.CNI工作原理

在这里插入图片描述

2.4.1.CNI 插件配置

  • CNI 默认配置目录:/etc/cni/net.d。配置文件中应该包含 插件名称、CNI版本、插件列表
  • 比如 使用calico作为cni插件时,/etc/cni/net.d目录会存在10-calico.conflist
    在这里插入图片描述
  • 再比如使用flannel作为CNI插件,配置文件可能是这样
    在这里插入图片描述

2.4.2.CNI 插件可执行文件

  • 在 CNI 标准化流程中,规定​ CNI 插件需以可执行文件形式实现,默认存放在目录:/opt/cni/bin
    • 因此,所谓的CNI插件,其实就是一个个编译好的二进制可执行文件,以供调用
  • 比如使用calico时,/opt/cni/bin 下会包含可执行文件
    在这里插入图片描述
  • 再比如使用flannel时,/opt/cni/bin 下会包含可执行文件
    [/opt/cni/bin]# ls
    bandwidth  bridge  dhcp  dummy  firewall  flannel  host-device  host-local  ipvlan  loopback  macvlan  portmap  ptp  sbr  static  tuning  vlan  vrf
    

2.4.3.CNI插件生效原理

在这里插入图片描述

  • /opt/cni/bin 存放所有的插件可执行文件
  • /etc/cni/net.d 存放cni配置,声明当前要开启哪些插件
  • CNI插件是如何生效的?
    • 当调用cni时,kubelet 就相当于执行了一条本地命令,找到这个可执行文件,给出入参,即可使用cni功能
  • 因此如果自己开发CNI插件,应该如何做?
    • 自己开发CNI插件,首先要定义清楚 ADD network、Delete network 等操作的实现
    • 然后以可执行文件方式放入 /opt/cni/bin,并在 /etc/cni/net.d 配置文件中开启
  • 调用 CNI插件 时,是如何传参的?
    • 通过设置环境变量,将 podId、sandbox net namespace、ADD/DEL 等信息设置为环境变量后,执行cni可执行文件,cni执行过程会读取这些预定义的env,进而执行特定的操作

2.4.4.CNI 与 kubelet 联动

在这里插入图片描述

  • kubelet 包含两个参数,分别用来设置 cni可执行文件目录、cni配置文件目录

2.5.CNI 插件的设计考量

在这里插入图片描述
在这里插入图片描述

2.6.pod Ip的分配过程简述

  • 学习了上述cni知识,知道有个IPAM插件用于为pod分配ip,那么pod ip分配后如何让apiserver知道呢?过程如下。
    • 启动pod时,containerRuntime会调用CNI,CNI插件链中包含IPAM,会给pod分配一个ip。
    • 然后 CNI主插件会将该ip 配置到 pod的网络namespace
    • 附加功能插件里比如bandwidth就会为之限制带宽,处理完成后将结果返回给containerRuntime。
    • containerRuntime会将ip以及结果返回给kubelet,kubelet上报到apiserver
    • apiserver将ip写入etcd,这样这个pod就具有ip了

3.CNI 插件

3.1.常见CNI插件

在这里插入图片描述

  • Calico、Cilium都是网络的一揽子解决方案,包括 容器与主机的通信同节点pod通信跨节点pod通信
  • 目前生产上 Calico、Cilium 使用的更多,其中 Cilium 性能会更优异

3.2.Flannel

在这里插入图片描述

  • Flannel 使用了VxLAN,会引入一些额外的开销,大约10%,所以注重效率的生产系统不太用Flannel
  • Flannel 本身只做CNI插件,没有完备的生态,比如不能做网络隔离,不如Calico、Cilium都是网络的一揽子解决方案

3.3.Calico

在这里插入图片描述

3.3.1.pod ip 规划方案

在容器ip的分配上,有多种方案:分配真实ip、建立私有网络

3.3.1.1.直接给pod分配 基础架构中的真实ip
  • 基础架构中的真实ip 在主机的网卡中都认识,所以pod之间的通信天然就是通的,不需要额外的配置,效率高。
  • 但是 一个集群的真实ip很有限,而且非常宝贵,规划不当的情况下会限制集群的规模。
3.3.1.2.为pod分配虚拟ip
  • 社区为了提供通用方案,假设pod都是私有ip,无法在底层基础架构中进行路由,只能实现主机内部通信,无法直接实现跨主机通信。
  • 跨主机ping不通,由此带来 跨主机通信的 一些解决方案:
    • 方案一:封包解包
      • 为了实现跨主机通信,最直接的方法就是把 pod的 ip数据包 再包一层,封包解包。
      • 如果数据包在主机内部流转,那么直接就可以路由到。
      • 但如果包要出去,就需要在原始包基础上再加一层包,这就叫 tunnel模式(隧道模式)
      • 封装包也有多种方式:
        • IPinIP:在ip包外边再加一层ip包
        • VxLAN:在ip包外边增加一层udp包。比如Flannel就是用了这种
      • 不过封包解包本身是有性能开销的
    • 方案二:动态路由协议
      • 既然网卡中的静态路由协议不认识这些私有的pod ip,那么可以自行维护动态路由协议,让主机能够知晓 这个ip在哪台主机
      • 这种路由模式,无需引入额外的封装层,效率大大提升

3.3.2.Calico的pod通信方案

在这里插入图片描述

  • Calico支持上述的三种 跨跨主机通信模式,上图将Calico支持的三种模式都画了出来:
    • IPinIP:
    • VxLAN
    • BGP路由协议
组件名称功能说明
Felix Agent运行在每个节点(Master/Minion),负责:
- 配置本地路由表
- 管理 ACL(安全策略)
- 监控容器生命周期
BIRD Agent基于 BGP 协议的路由守护进程,负责:
- 节点间路由信息交换(图中未显式展示 BGP 对等连接)
- 生成跨主机路由规则
confd Agent动态生成 BIRD 的配置文件,监听 Etcd/Kubernetes API 的变更并更新路由策略
IP-in-IP 隧道封装 Pod 的原始 IP 包到宿主机 IP 包中,实现跨节点通信(如图中 tunnel IPinIP 连接)
3.3.2.1.Calico 支持 IPinIP 模式
  • 示例:Pod A(Node2)→ Pod B(Node3)
    • 封装:Pod A 的 IP 包被 Felix 封装到 Node2 的 IP 包中(源 IP:Node2,目标 IP:Node3)。
    • 传输:通过宿主机的物理网络传输到 Node3。
    • 解封装:Node3 的 Felix 解封装,将原始 Pod IP 包传递给 Pod B。
  • 适用场景
    • 底层网络限制:当底层网络(如公有云 VPC)不支持直接路由 Pod IP 时,IP-in-IP 通过隧道绕开限制。
    • 简单配置:无需依赖外部路由器或复杂网络策略。
3.3.2.2. Calico 支持 VxLAN 模式

在这里插入图片描述

  • 示例:Pod A(Node2)→ Pod B(Node3)
    • 封装
      1. Pod A 的 IP 包被 主机上vxlan.calico 设备封装为 VxLAN 格式(外层 UDP 头部,目标端口 4789)。
      2. 外层 IP 头源地址为 Node2,目标地址为 Node3。
      3. VxLAN 头部包含 VNI(Virtual Network Identifier),默认值为 4096,用于多租户隔离。
    • 传输:通过宿主机的物理网络传输到 Node3(基于 UDP 协议)。
    • 解封装
      1. Node3 的 vxlan.calico 识别 VxLAN 封装,剥离外层 UDP 和 VxLAN 头部。
      2. 将原始 Pod IP 包传递给 Pod B。
  • 适用场景
    • 多租户隔离:通过 VNI 实现不同租户或业务的网络隔离。
    • 复杂网络环境:适用于需要灵活扩展虚拟网络且底层网络支持组播或单播转发的场景(如混合云)。
  • 查看calico-vxlan设备:ip a
    在这里插入图片描述
3.3.2.3. Calico 支持 BGP 路由协议模式
  • 示例:Pod A(Node2)→ Pod B(Node3)
    • 路由同步:
      1. Node2 和 Node3 的 BIRD Agent 通过 BGP 协议向物理交换机或路由反射器宣告本地 Pod 子网(如 10.244.1.0/24)。
      2. 物理网络设备生成路由表,标记 Node3 的 Pod 子网下一跳为 Node3 的物理 IP。
    • 数据传输:
      1. Pod A 的 IP 包根据 Node2 的路由表直接通过物理网络发送到 Node3(无需封装)。
      2. Node3 根据本地路由规则将数据包转发给 Pod B。
  • 适用场景
    • 高性能需求:无封装开销,延迟最低,适合金融交易、实时计算等场景。
    • 私有数据中心:要求底层网络设备(交换机/路由器)支持 BGP 协议(如企业级网络架构)。

模式对比总结

模式封装方式性能网络要求典型场景
IP-in-IPIP-in-IP 隧道(IP 协议)中等仅需 IP 可达性公有云、简单 Overlay 网络
VxLANVxLAN 隧道(UDP 协议)中等支持组播或单播转发混合云、多租户隔离
BGP 路由无封装,依赖物理路由需 BGP 兼容的物理网络设备私有数据中心、高性能网络

通过灵活选择模式,Calico 可适配从公有云到私有数据中心的多样化网络需求。

3.3.3.Calico节点初始化

  • 前面我们知道在使用了calico的时候,每个节点的 /etc/cni/net.d/opt/cni/bin 目录下都会分别包含 calico的配置文件、calico的可执行文件。
  • 那么这些文件是如何被配置到主机上的?
    • 答:通过daemonset代替人工,方便高效
3.3.3.1.Calico DaemonSet
  • 在安装Calico时,一般会创建一个ds,用于启动Calico,现在看下这个ds都是做了什么
    在这里插入图片描述
  • 输出下ds的yaml,可以看到有一些initContainer,其中有个initContainer就负责 calico 的安装操作,这里实际上做的操作就是把 配置文件 拷贝到本机的/etc/cni/net.d,把calico相关的插件可执行文件 拷贝到 /opt/cni/bin
  • 如何拷贝?
    • 通过挂载hostpath,将目录挂载到容器中,然后就可以直接把文件拷贝进去
      在这里插入图片描述
3.3.3.2.很多CNI插件采用DaemonSet初始化
  • 除了calico,其他很多cni插件也是通过 daemonset initContainers 实现初始化的,比如Flannel
  • Flannel 这里更直接,直接用在command中用cp命令做拷贝
[root@VM /opt/cni/bin]# kubectl get ds -n kube-flannel kube-flannel-ds -oyaml
apiVersion: apps/v1
kind: DaemonSet
metadata:annotations:deprecated.daemonset.template.generation: "1"creationTimestamp: "2024-04-17T08:01:53Z"generation: 1labels:app: flannelk8s-app: flanneltier: nodename: kube-flannel-dsnamespace: kube-flannelresourceVersion: "97665682"selfLink: /apis/apps/v1/namespaces/kube-flannel/daemonsets/kube-flannel-dsuid: 8bb85be6-99a6-4896-ace9-11d2f7ecd2da
spec:revisionHistoryLimit: 10selector:matchLabels:app: flanneltemplate:metadata:creationTimestamp: nulllabels:app: flanneltier: nodespec:affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- key: kubernetes.io/osoperator: Invalues:- linuxcontainers:- args:- --ip-masq- --kube-subnet-mgrcommand:- /opt/bin/flanneldenv:- name: POD_NAMEvalueFrom:fieldRef:apiVersion: v1fieldPath: metadata.name- name: POD_NAMESPACEvalueFrom:fieldRef:apiVersion: v1fieldPath: metadata.namespace- name: EVENT_QUEUE_DEPTHvalue: "5000"image: docker.io/flannel/flannel:v0.25.1imagePullPolicy: IfNotPresentname: kube-flannelresources:requests:cpu: 100mmemory: 50MisecurityContext:capabilities:add:- NET_ADMIN- NET_RAWprivileged: falseterminationMessagePath: /dev/termination-logterminationMessagePolicy: FilevolumeMounts:- mountPath: /run/flannelname: run- mountPath: /etc/kube-flannel/name: flannel-cfg- mountPath: /run/xtables.lockname: xtables-lockdnsPolicy: ClusterFirsthostNetwork: trueinitContainers:- args:- -f- /flannel- /opt/cni/bin/flannelcommand:- cpimage: docker.io/flannel/flannel-cni-plugin:v1.4.0-flannel1imagePullPolicy: IfNotPresentname: install-cni-pluginresources: {}terminationMessagePath: /dev/termination-logterminationMessagePolicy: FilevolumeMounts:- mountPath: /opt/cni/binname: cni-plugin- args:- -f- /etc/kube-flannel/cni-conf.json- /etc/cni/net.d/10-flannel.conflistcommand:- cpimage: docker.io/flannel/flannel:v0.25.1imagePullPolicy: IfNotPresentname: install-cniresources: {}terminationMessagePath: /dev/termination-logterminationMessagePolicy: FilevolumeMounts:- mountPath: /etc/cni/net.dname: cni- mountPath: /etc/kube-flannel/name: flannel-cfgpriorityClassName: system-node-criticalrestartPolicy: AlwaysschedulerName: default-schedulersecurityContext: {}serviceAccount: flannelserviceAccountName: flannelterminationGracePeriodSeconds: 30tolerations:- effect: NoScheduleoperator: Existsvolumes:- hostPath:path: /run/flanneltype: ""name: run- hostPath:path: /opt/cni/bintype: ""name: cni-plugin- hostPath:path: /etc/cni/net.dtype: ""name: cni- configMap:defaultMode: 420name: kube-flannel-cfgname: flannel-cfg- hostPath:path: /run/xtables.locktype: FileOrCreatename: xtables-lockupdateStrategy:rollingUpdate:maxUnavailable: 1type: RollingUpdate
status:currentNumberScheduled: 1desiredNumberScheduled: 1numberAvailable: 1numberMisscheduled: 0numberReady: 1observedGeneration: 1updatedNumberScheduled: 1

3.3.4.Calico配置一览

在这里插入图片描述

3.3.5.Calico实现原理

本节解答问题:Calico是实现ip管理的?

3.3.5.1.Calico 自带众多CRD

在这里插入图片描述

  • ippools:整个集群的ip池,定义了ip的总量、每个node ip的数量、是否开启ipip mode等
    在这里插入图片描述

  • ipamblocks:在具体一个node上,按照ippools中对node ip 的规定,为当前node的ipamblocks分配ip段,并记录有哪些ip分配给了哪个pod,还有哪些ip没有分配等信息
    在这里插入图片描述

  • ipamhandles:每一个pod都会有一个具体的ipamhandle,记录自己分配到的ip
    在这里插入图片描述

3.3.5.2.如何查看calico的通信模式
  • 在 calico daemonset 中,规定了当前采用的通信模式
  • 比如下图表示当前采用 bird模式
    在这里插入图片描述
3.3.5.3.节点内pod通信实践

演示在 一个pod中,ping 同节点另一个pod 的包转发过程

  • 当前运行了两个pod,pod分别为:centos 192.168.166.144、nginx 192.168.166.142
    在这里插入图片描述
  • 我们进入centos 192.168.166.144 的 pod中,ping 一下 nginx 192.168.166.142,是可以ping通的。那么为什么能通呢,中间过程如何?
    在这里插入图片描述
  • 查看一下当前pod的网络设备 ip addr/ip a,可以看到自己的ip 192.168.166.144
    在这里插入图片描述
  • 查看一下当前pod的 路由表:ip route/ip r。明显169.254.1.1和pod ip不属于同一网段
    在这里插入图片描述
  • 通过arping查看 ping 过程中的设备mac地址,可以看出是 ee:ee:ee:ee:ee:ee
    在这里插入图片描述
  • 我们退出容器,回到主机上,查看主机的网络设备。ip addr/ip a,可以看到,所有calico建出来的网络设备,mac地址都是 ee:ee:ee:ee:ee:ee。说明只要是从centos网关出来的包都会被calico设备接收到
    在这里插入图片描述
  • 查看主机的路由表,可以看到有192.168.166.142,即只要在主机上访问 192.168.166.142,都会转发到 calico440f455693 的口,这个口的vethpair另一头正式连接的 nginx 192.168.166.142,包就被转发过去了
    在这里插入图片描述
3.3.5.4.跨节点的pod通信实践:BIRD
  • 如何通过BIRD实现跨节点的pod通信?
  • 每个节点上都会运行一个 BIRD Daemon,所有节点上的BIRD会彼此建立长连接,互相同步路由表。
  • 路由表示例
    ipamblock:
    10-233-90-0-24
    node1
    # node1的网段
    cidr: 10.233.90.0/24
    # 路由表:凡是10.233.96.0/24网段的,都在192.168.34.11节点上
    10.233.96.0/24 via 192.168.34.11 dev tunl0 proto bird onlinkipamblock:
    10-233-96-0-24
    node: node2
    # node2的网段
    cidr: 10.233.96.0/24
    # 路由表:凡是10.233.90.0/24网段的,都在192.168.34.10节点上
    10.233.90.0/24 via 192.168.34.10 dev tunl0 proto bird onlink
    

3.4.CNI plugin 对比

在这里插入图片描述

  • 生产建议:Calico/Cilium
  • Cilium性能好,但是需要比较新的 kernel

4.CNI 接口

  • CNI提供了4个接口,由容器运行时调用,用于管理容器网络的生命周期
    • ADD - 将容器添加到网络,或修改配置
    • DEL - 从网络中删除容器,或取消修改
    • CHECK - 检查容器网络是否正常,如果容器的网络出现问题,则返回错误
    • VERSION - 显示插件的版本
接口幂等性必须实现典型插件逻辑
ADD创建网卡、分配 IP、配置路由
DEL删除网卡、释放 IP、清理路由
CHECK否(可选)检查 IP 有效性、路由是否存在
VERSION返回支持的 CNI 版本列表

4.1.ADD接口

  • 作用:为容器分配网络资源(如 IP、路由、网卡等),并配置网络连接。

  • 调用时机

    • 容器创建时(如 Pod 启动时)
    • 容器加入新网络时(多网络场景)
  • 输入参数(JSON 格式)

    {"cniVersion": "1.0.0",        // CNI 版本"name": "mynet",             // 网络名称"type": "bridge",            // 插件类型"containerID": "abcd1234",   // 容器唯一 ID"netns": "/proc/1234/ns/net", // 容器的网络命名空间路径"ifName": "eth0",            // 容器内的网卡名称"args": { ... },             // 额外参数(如 Kubernetes 传递的 Pod 元数据)"prevResult": { ... }        // 前一个插件的执行结果(插件链场景)
    }
    
  • 输出结果

    • interfaces:分配的网卡列表(如 veth pair)。
    • ips:分配的 IP 地址及网关。
    • routes:路由规则。
    • dns:DNS 配置。
  • 示例输出

    {"cniVersion": "1.0.0","interfaces": [{"name": "eth0","mac": "0a:58:0a:01:01:02","sandbox": "/proc/1234/ns/net"}],"ips": [{"version": "4","address": "10.1.1.2/24","gateway": "10.1.1.1"}]
    }
    

4.2.DEL 接口

  • 作用:释放容器占用的网络资源(如删除 IP、清理路由、卸载网卡等)。
  • 调用时机
    • 容器删除时(如 Pod 终止时)。
    • 容器离开网络时(多网络场景)。
  • 输入参数
    • 参数与 ADD 接口一致
  • 输出结果
    • 无特定输出,但需返回成功(状态码 0)或失败(非零状态码)。

4.3.CHECK 接口

  • 作用:验证容器的网络配置是否正常(如 IP 是否有效、路由是否存在)。
  • 调用时机
    • 容器运行过程中定期检查。
    • 容器网络异常时主动触发。
  • 输入参数
    • ADD 接口一致,但需要 prevResult 字段(即 ADD 接口的输出结果)。
  • 输出结果
    • 无特定输出,但需返回成功(状态码 0)或失败(非零状态码)。

4.4.VERSION 接口

  • 作用:报告插件支持的 CNI 版本列表。
  • 调用方式
    • 容器运行时通过命令行参数 --version 调用插件。
  • 输出结果
    {"cniVersion": "1.0.0","supportedVersions": ["0.4.0", "1.0.0"]
    }
    

相关文章:

Kubernetes控制平面组件:Kubelet详解(七):容器网络接口 CNI

云原生学习路线导航页(持续更新中) kubernetes学习系列快捷链接 Kubernetes架构原则和对象设计(一)Kubernetes架构原则和对象设计(二)Kubernetes架构原则和对象设计(三)Kubernetes控…...

Pandas 构建并评价聚类模型② 第六章

构建并评价聚类模型 构建并评价聚类模型一、数据读取与准备(代码6 - 6部分)结果代码解析 二、Kmeans聚类(代码6 - 6部分)结果代码解析 三、数据降维可视化(代码6 - 6部分)结果代码解析 四、FMI评价&#xf…...

【simulink】IEEE33节点系统潮流分析模型

目录 主要内容 程序内容 2.1 33节点simulink模型一览 2.2 节点模型图 下载链接 主要内容 该仿真采用simulink模型对33节点网络进行模拟仿真,在simulink模型中定义了33节点系统的电阻、电抗、节点连接关系等参数,通过控制块来实现信号连接关系&…...

彻底解决docker代理配置与无法拉取镜像问题

为什么会有这篇文章? 博主在去年为部署dify研究了docker,最后也是成功部署,但是因为众所周知的原因,卡ziji脖子 ,所以期间遇到各种网络问题的报错,好在最后解决了. 但时隔一年,博主最近因为学习原因又一次使用docker,原本解决的问题却又没来由的出现,且和之前有很多不同(有时…...

Linux 安装 Unreal Engine

需要对在unreal engine官网进行绑定github账号,然后到unreal engine github仓库中进行下载对应的版本,并进行安装unreal engine官网 github地址...

tensorflow图像分类预测

tensorflow图像分类预测 CPU版本和GPU版本二选一 CPU版本 pip -m install --upgrade pippip install matplotlib pillow scikit-learnpip install tensorflow-intel2.18.0GPU版本 工具 miniconda 升级依赖库 conda update --all创建目录 mkdir gpu-tf进入目录 cd gpu-tf创建虚…...

C++数组详解:一维和多维数组的定义、初始化、访问与遍历

1. 引言 数组是C中最基础的数据结构之一,用于存储相同类型的元素的集合。它提供了高效的内存访问方式,适用于需要快速查找和遍历数据的场景。本文将全面介绍: 一维数组的定义、初始化与遍历多维数组(如二维数组)的定…...

linux下编写shell脚本一键编译源码

0 前言 进行linux应用层编程时,经常会使用重复的命令对源码进行编译,然后把编译生成的可执行文件拷贝到工作目录,操作非常繁琐且容易出错。本文编写一个简单的shell脚本一键编译源码。 1 linux下编写shell脚本一键编译源码 shell脚本如下&…...

安卓端互动娱乐房卡系统调试实录:从UI到协议的万字深拆(第一章)

前言:调房卡,不如修空调(但更费脑) 老实说,拿到这套安卓端互动组件源码的时候,我内心是拒绝的。不是因为它不好,而是太好了,目录规整、界面精美、逻辑还算清晰,唯一的问…...

【通用大模型】Serper API 详解:搜索引擎数据获取的核心工具

Serper API 详解:搜索引擎数据获取的核心工具 一、Serper API 的定义与核心功能二、技术架构与核心优势2.1 技术实现原理2.2 对比传统方案的突破性优势 三、典型应用场景与代码示例3.1 SEO 监控系统3.2 竞品广告分析 四、使用成本与配额策略五、开发者注意事项六、替…...

宝塔面板屏蔽垃圾搜索引擎蜘蛛和扫描工具的办法

首先进入宝塔面板,文件管理进入/www/server/nginx/conf目录,新建空白文件kill_bot.conf。然后将以下代码保存到当前文件中。 #禁止垃圾搜索引擎蜘蛛抓取if ($http_user_agent ~* "CheckMarkNetwork|Synapse|Nimbostratus-Bot|Dark|scraper|LMAO|Ha…...

【低成本STM32的T-BOX开发实战:高可靠的车联网解决方案】

基于STM32的车辆远程通信终端(T-BOX)开发实战:低成本高可靠的车联网解决方案 目录 引言:为什么需要T-BOX?系统总体设计:T-BOX的架构与核心功能硬件设计:STM32主控与关键模块解析 STM32F105VCT6…...

聚类算法K-means和Dbscan的对比

K-means和DBSCAN_dbscan和kmeans的区别-CSDN博客...

mysql的高可用

1. 环境准备 2台MySQL服务器(node1: 192.168.1.101,node2: 192.168.1.102)2台HAProxy Keepalived服务器(haproxy1: 192.168.1.103,haproxy2: 192.168.1.104)虚拟IP(VIP: 192.168.1.100&#x…...

vue3 elementplus tabs切换实现

Tabs 标签页 | Element Plus <template><!-- editableTabsValue 是当前tab 的 name --><el-tabsv-model"editableTabsValue"type"border-card"editableedit"handleTabsEdit"><!-- 这个是标签面板 面板数据 遍历 editableT…...

printf在c语言中代表什么(非常详细)

在C语言中&#xff0c;有三个函数可以用来向控制台&#xff08;可以理解为显示器或者屏幕&#xff09;输出数据&#xff0c;它们分别是&#xff1a; 输出函数说明用法演示puts()只能输出字符串&#xff0c;并且输出结束后会自动换行puts("C language is great");put…...

Linux梦开始的地方

1.概率 经过C语言&#xff0c;数据结构&#xff0c;C的学习我们现在要开始学习Linux的学习了。我们学习Linux是从四部分来进行的&#xff1a; 1.Linux初识&#xff0c;Linux环境&#xff0c;Linux指令&#xff0c;Linux开发环境。 2.Linux系统。 3.Linux网络 4.MySQL Lin…...

关于机器学习的实际案例

以下是一些机器学习的实际案例&#xff1a; 营销与销售领域 - 推荐引擎&#xff1a;亚马逊、网飞等网站根据用户的品味、浏览历史和购物车历史进行推荐。 - 个性化营销&#xff1a;营销人员使用机器学习联系将产品留在购物车或退出网站的用户&#xff0c;根据客户兴趣定制营销…...

Kubernetes控制平面组件:Kubelet详解(五):切换docker运行时为containerd

云原生学习路线导航页&#xff08;持续更新中&#xff09; kubernetes学习系列快捷链接 Kubernetes架构原则和对象设计&#xff08;一&#xff09;Kubernetes架构原则和对象设计&#xff08;二&#xff09;Kubernetes架构原则和对象设计&#xff08;三&#xff09;Kubernetes控…...

<前端小白> 前端网页知识点总结

HTML 标签 1. 标题标签 h1到h6 2. 段落标签 p 3. 换行 br 水平线 hr 4. 加粗 strong 倾斜 em 下划线 ins 删除 del 5. 图像标签 img src-图像的位置 alt- 图片加载失败显示的文字 替换文本 title--- 鼠标放到图片上显示的文字 提示…...

【Linux驱动】Linux 按键驱动开发指南

Linux 按键驱动开发指南 1、按键驱动开发基础 1.1. 按键驱动类型 Linux下的按键驱动主要有两种实现方式&#xff1a; 输入子系统驱动&#xff1a;最常用&#xff0c;通过input子系统上报按键事件 字符设备驱动&#xff1a;较少用&#xff0c;需要自己实现文件操作接口 1.…...

AI日报 - 2025年05月19日

&#x1f31f; 今日概览 (60秒速览) ▎&#x1f916; 大模型前沿 | GPT-5传闻再起&#xff0c;将基于全新模型构建&#xff0c;与GPT-4彻底分离&#xff1b;Claude 3.7 Sonnet系统提示泄露&#xff0c;揭示其主动引导对话、多语言支持及安全新特性&#xff1b;研究指出直接复用…...

BUUCTF——ReadlezPHP

BUUCTF——ReadlezPHP 进入靶场 看了看框架和源码信息 没有什么可以利用的地方 爆破一下目录看看 结果只出来个index.php 看了一下Findsomthing 报了个路径 /time.php?source拼接访问一下 出了个php代码 <?php #error_reporting(0); class HelloPhp {public $a;pub…...

java集合相关的api-总结

简介 集合是存储数据的容器&#xff0c;集合相关的API提供了不同的数据结构&#xff0c;来满足不同的需求。这里是对常见集合API的使用场景和相关源码的一个总结&#xff0c;在实际开发中&#xff0c;如果不知道该选择什么集合&#xff0c;这篇文章也许可以参考一下。 集合相…...

FloodFill算法:洪水般的图像处理艺术

简单来说就是一场洪水&#xff08;雨水&#xff09;会把低洼的地方淹没 也就是一道题&#xff0c;你要找出所有为负数的连通块&#xff0c;对角线不能连通&#xff0c;所以上述图有两个 其实也很简单&#xff0c;就是你扫描的过程&#xff0c;发现一个负数&#xff0c;就以这…...

【开源分享】健康饮食管理系统(双端+论文)

&#x1f4bb;技术栈 前后端分离项目&#xff0c;PC双端&#xff08;管理端用户端&#xff09; 后端&#xff1a;Javaspringboot 前端&#xff1a;vue 数据库&#xff1a;mysql &#x1f4a1;运行效果图 1. 管理端&#xff1a; 2. 用户端&#xff1a; &#x1f4d5;源码获…...

【图像生成大模型】CogVideoX-5b:开启文本到视频生成的新纪元

CogVideoX-5b&#xff1a;开启文本到视频生成的新纪元 项目背景与目标模型架构与技术亮点项目运行方式与执行步骤环境准备模型加载与推理量化推理 执行报错与问题解决内存不足模型加载失败生成质量不佳 相关论文信息总结 在人工智能领域&#xff0c;文本到视频生成技术一直是研…...

C++学习:六个月从基础到就业——C++20:协程(Coroutines)

C学习&#xff1a;六个月从基础到就业——C20&#xff1a;协程(Coroutines) 本文是我C学习之旅系列的第五十篇技术文章&#xff0c;也是第三阶段"现代C特性"的第十二篇&#xff0c;继续介绍C20引入的新特性&#xff0c;本篇重点是协程(Coroutines)。查看完整系列目录…...

【DAY22】 复习日

内容来自浙大疏锦行python打卡训练营 浙大疏锦行 仔细回顾一下之前21天的内容 作业&#xff1a; 自行学习参考如何使用kaggle平台&#xff0c;写下使用注意点&#xff0c;并对下述比赛提交代码 kaggle泰坦里克号人员生还预测...

tauri2项目使用sidcar嵌入可执行文件并使用命令行调用

Sidecar 是 Tauri 框架中的一个功能&#xff0c;允许你将现有的命令行程序&#xff08;CLI&#xff09;打包并分发到你的 Tauri 应用程序中。以下是它的主要作用和用法。集成命令行工具&#xff1a;将现有的 CLI 程序无缝集成到你的 Tauri 应用中。跨平台分发&#xff1a;确保你…...

选择合适的AI模型:解析Trae编辑器中的多款模型及其应用场景

在当今数字化时代&#xff0c;人工智能技术飞速发展&#xff0c;各种AI模型层出不穷&#xff0c;为人们的工作和生活带来了极大的便利。Trae编辑器作为一款集成了多种先进AI模型的工具&#xff0c;为用户提供了丰富的选择&#xff0c;以满足不同场景下的多样化需求。本文将深入…...

超越想象:利用MetaGPT打造高效的AI协作环境

前言 在人工智能迅速发展的今天&#xff0c;如何让多个大语言模型&#xff08;LLM&#xff09;高效协同工作成为关键挑战。MetaGPT 作为一种创新的多智能体框架&#xff0c;成功模拟了一个真实软件公司的运作流程&#xff0c;实现了从需求分析到代码实现的全流程自动化&#x…...

BOM知识点

BOM&#xff08;Browser Object Model&#xff09;即浏览器对象模型&#xff0c;是用于访问和操作浏览器窗口的编程接口。以下是一些BOM的知识点总结&#xff1a; 核心对象 • window&#xff1a;BOM的核心对象&#xff0c;代表浏览器窗口。它也是全局对象&#xff0c;所有全…...

IDE/IoT/搭建物联网(LiteOS)集成开发环境,基于 LiteOS Studio + GCC + JLink

文章目录 概述LiteOS Studio不推荐&#xff1f;安装和使用手册呢?HCIP实验的源码呢&#xff1f; 软件和依赖安装软件下载软件安装插件安装依赖工具-方案2依赖工具-方案1 工程配置打开或新建工程板卡配置组件配置编译器配置-gcc工具链编译器配置-Makefile脚本其他配置编译完成 …...

常见的 HTTP 接口(请求方法)

一&#xff1a;GET 作用&#xff1a;从服务器获取资源&#xff08;查询数据&#xff09;。特点&#xff1a; 请求参数通过 URL 传递&#xff08;如https://api.example.com/users?id123&#xff09;&#xff0c;参数会显示在地址栏中。不修改服务器数据&#xff0c;属于幂等操…...

墨水屏显示模拟器程序解读

程序如下&#xff1a;出处https://github.com/tsl0922/EPD-nRF5?tabreadme-ov-file // GUI emulator for Windows // This code is a simple Windows GUI application that emulates the display of an e-paper device. #include <windows.h> #include <stdint.h>…...

【图像生成大模型】Step-Video-T2V:下一代文本到视频生成技术

Step-Video-T2V&#xff1a;下一代文本到视频生成技术 引言Step-Video-T2V 项目概述核心技术1. 视频变分自编码器&#xff08;Video-VAE&#xff09;2. 3D 全注意力扩散 Transformer&#xff08;DiT w/ 3D Full Attention&#xff09;3. 视频直接偏好优化&#xff08;Video-DPO…...

【Java学习笔记】【第一阶段项目实践】房屋出租系统(面向对象版本)

房屋出租系统&#xff08;面向对象版本&#xff09; 整体思想&#xff1a;采用数组存储房屋信息&#xff0c;深刻体会面向对象的好处和过程 一、实现需求 &#xff08;1&#xff09;用户层 系统菜单显示 提示用户输入对应的数字选择功能 各个功能界面操作提示&#xff08;底…...

18. 结合Selenium和YAML对页面继承对象PO的改造

18. 结合Selenium和YAML对页面继承对象PO的改造 一、架构改造核心思路 1.1 改造前后对比 #mermaid-svg-ziagMhNLS5fIFWrx {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-ziagMhNLS5fIFWrx .error-icon{fill:#5522…...

Vue-监听属性

监听属性 简单监听 点击切换名字&#xff0c;来回变更Tom/Jerry&#xff0c;输出 你好&#xff0c;Tom/Jerry 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><title>监听属性</title><!-- …...

AI写PPT可以用吗?我测试了3款AI写PPT工具,分享感受

上周五临下班&#xff0c;领导突然让我周末赶出一份季度营销报告 PPT&#xff0c;还要求周一晨会展示。看着空荡荡的 PPT 页面&#xff0c;我满心都是绝望 —— 周末不仅泡汤&#xff0c;搞不好还得熬夜到凌晨。好在同部门的前辈给我推荐了几款 AI 写 PPT 工具&#xff0c;没想…...

FreeSWITCH 简单图形化界面43 - 使用百度的unimrcp搞个智能话务台,用的在线的ASR和TTS

FreeSWITCH 简单图形化界面43 - 使用百度的unimrcp搞个智能话务台 0、一个fs的web配置界面预览1、安装unimrcp模块2、安装完成后&#xff0c;配置FreeSWITCH。2.1 有界面的配置2.1.1 mod_unimrcp模块配置2.1.2 mod_unimrcp客户端配置 2.2 无界面的配置 3、呼叫规则4、编写流程4…...

C 语言学习笔记(函数)

内容提要 函数 函数的概述函数的分类函数的定义形参和实参函数的返回值 函数 函数的概述 **函数&#xff1a;**实现一定功能的&#xff0c;独立的代码模块&#xff0c;对于函数的使用&#xff0c;一定是先定义&#xff0c;后使用。 使用函数的优势&#xff1a; ①我们可以…...

数据结构 -- 树形查找(二)平衡二叉树

平衡二叉树 定义 平衡二叉树&#xff08;AVL树&#xff09; – 树上的任意一点的左子树和右子树的高度之差不超过1 节点的平衡因子 左子树高-右子树高 平衡二叉树的结点的平衡因子的值只可能是-1、0、1 //平衡二叉树结点 typedef struct AVLNode{int key; //数据域int bal…...

day 29

类装饰器 类有修饰器&#xff0c;他的逻辑&#xff1a;接收一个类&#xff0c;返回一个修改后的类。例如 1. 添加新的方法或属性&#xff08;如示例中的 log 方法&#xff09;。 2. 修改原有方法&#xff08;如替换 __init__ 方法&#xff0c;添加日志&#xff09;。 3. 甚…...

Java 并发编程

黑马程序员深入学习Java并发编程 进程与线程 预备知识 java8&#xff0c;pom.xml <dependencies><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.10</version></depe…...

windows笔记本连接RKNN3588网络配置解析

这几天拿到了一块RKNN3588的板子,准备做视觉和Ros开发用,但是拿到后就蒙蔽了,不知道怎么ssh连到板子上去,更甚者不知道怎么配置网络让RKNN能够联网更新环境,这里记录一下整个过程。主要包括以下两个内容: 1.adb连接RKNN3588开发 2. 网口连接RKNN更新板子环境开发 adb连…...

C++ asio网络编程(8)处理粘包问题

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言 粘包问题一、粘包原因总结&#xff1a; 二、如何处理粘包处理方法 三、完善消息节点MsgNode代码部分细节详解memcpy(_data, &max_len, HEAD_LENGTH);_data…...

【架构美学】Java 访问者模式:解构数据与操作的双重分发哲学

一、模式定义与核心思想 访问者模式&#xff08;Visitor Pattern&#xff09;是一种行为型设计模式&#xff0c;其核心目标是将数据操作与数据结构分离。通过定义一个独立的访问者类&#xff0c;使得新增对数据结构中元素的操作时&#xff0c;无需修改元素本身的类结构&#x…...

UE5无法编译问题解决

1. vs编译 2. 删除三个文件夹 参考...