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"]
    }
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/81379.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【推荐】新准则下对照会计报表172个会计科目解释

序号 科目名称 对应的会计报表项目 序号 科目名称 对应的会计报表项目   一、资产类     二、负债类   1 1001 库存现金 货币资金 103 2001 短期借款 短期借款 2 1002 银行存款 货币资金 104 2101 交易性金融负债 易性金融负债 3 1012 其他货币资…

MongoDB的安装及简单使用

MongoDB 是一个开源的文档型 NoSQL 数据库​​,由 MongoDB Inc. 开发,专为灵活性和可扩展性设计。 特点: ​​1.文档模型​​:数据以 BSON(二进制 JSON)格式存储,支持嵌套结构。 ​​2.动态 S…

Gartner《如何将生成式人工智能(GenAI)集成到应用架构》学习心得

针对软件架构师、技术专业人士如何更好的把 GenAI 如何融入解决方案,提升用户体验、生产力并带来差异化成果的趋势,Gartner发布了《Integrating GenAI Into Your Application Architecture》研究报告。 报告首先介绍了 GenAI 的发展背景,指出其已成为主流趋势,大型语言模型…

IDEA - Windows IDEA 代码块展开与折叠(基础折叠操作、高级折叠操作)

一、基础折叠操作 折叠当前代码块:Ctrl - # 操作方式按下 【Ctrl】 键,再按下 【-】 键展开当前代码块:Ctrl # 操作方式按下 【Ctrl】 键,再按下 【】 键折叠所有代码块:Ctrl Shift - # 操作方式按下 【Ctrl】…

基于STM32F103与Marvell88W8686的WIFI无线监控视频传输系统研发(论文)

基于STM32F103与Marvell88W8686的WIFI无线监控视频传输系统研发 中文摘要 在当今社会信息化进程不断加速的时代背景下,众多领域对于监控系统的需求日益增长,像车内安全监控、电梯运行监控等场景都离不开监控系统的支持。过去,不少领域普遍采用…

Java基础知识总结(超详细整理)

一:概述 1.1Java类及类的成员 属性、方法、构造器、代码块、内部类 (1)数组 java虚拟机内存划分 各区域作用 内存解析 基本使用 两个变量指向一个一维数组 没有new就不会在堆里新开辟空间 (2)对象数组 (3&a…

StarRocks Community Monthly Newsletter (Apr)

版本动态 3.4.3 版本更新 核心功能升级 Routine Load和Stream Load新增Lambda表达式支持,支持复杂的列数据提取 增强JSON数据处理能力,支持将JSON Array/Object转为ARRAY/MAP类型 优化information_schema.task_runs视图查询,新增LIMIT支持…

探索AI新领域:生成式人工智能认证(GAI认证)助力职场发展

在数字化时代的大潮中,人工智能(AI)技术以其强大的影响力和广泛的应用前景,正逐步重塑我们的生活与工作方式。随着生成式AI技术的崛起,掌握这一前沿技能已成为职场竞争中的关键优势。那么,如何通过系统的学…

数据库触发器Trigger

在数据库管理系统中,触发器(Trigger)是一种特殊的存储过程,它在特定的事件发生时自动执行。触发器通常用于维护数据的完整性和一致性。通过事件触发而被执行,不能直接调用。 触发器的三要素 触发事件 before/after&a…

如何利用 Java 爬虫获得某书笔记详情:实战指南

在知识分享和学习的领域,许多平台提供了丰富的书籍笔记和学习资源。通过 Java 爬虫技术,我们可以高效地获取这些笔记的详细信息,以便进行进一步的分析和整理。本文将详细介绍如何利用 Java 爬虫获取某书笔记详情,并提供完整的代码…

主成分分析的应用之sklearn.decomposition模块的PCA函数

主成分分析的应用之sklearn.decomposition模块的PCA函数 一、模型建立整体步骤 二、数据 2297.86 589.62 474.74 164.19 290.91 626.21 295.20 199.03 2262.19 571.69 461.25 185.90 337.83 604.78 354.66 198.96 2303.29 589.99 516.21 236.55 403.92 730.05 438.41 225.80 …

【Redis】List 列表

文章目录 初识列表常用命令lpushlpushxlrangerpushrpushxlpop & rpoplindexlinsertllen阻塞操作 —— blpop & brpop 内部编码应用场景 初识列表 列表类型,用于存储多个字符串。在操作和实现上,类似 C 的双端队列,支持随机访问(O(N)…

Android framework 中间件开发(三)

前两篇我们讲了中间件的开发和打包应用, Android framework 中间件开发(一) Android framework 中间件开发(二) 这边我们来讲一下在中间件中编写JNI 1.新建C文件 找到frameworks\base\services\core\jni\路径,新建一个cpp文件,文件名为com_android_server_DarkControlService.c…

深入了解linux系统—— 基础IO(上)

文件 在之前学习C语言文件操作时,我们了解过什么是文件,这里简单回顾一下: 文件存在磁盘中,文件有分为程序文件、数据文件;二进制文件和文本文件等。 详细描述见文章:文件操作——C语言 文件在磁盘里&a…

Flink CDC—实时数据集成框架

Flink CDC 是一个基于流的数据集成工具,旨在为用户提供一套功能更加全面的编程接口(API),它基于数据库日志的 CDC(变更数据捕获)技术实现了统一的增量和全量数据读取。 该工具使得用户能够以 YAML 配置文件…

ES(ES2023/ES14)最新更新内容,及如何减少内耗

截至2023年10月,JavaScript(ECMAScript)的最新版本是 ES2023(ES14)。 ES2023 引入了许多新特性,如findLast、toSorted等,同时优化了性能。通过减少全局变量、避免内存泄漏、优化循环、减少DOM操作、使用Web Workers、懒加载、缓存、高效数据结构和代码压缩,可以显著降低…

常见的 Python 环境配置问题及解决方案

1. Python 环境配置的常见问题 初学者在配置 Python 环境时,可能会遇到以下几类问题: 1.1 不同版本的兼容性 Python 目前有两个主要版本系列:Python 2.x 和 Python 3.x。Python 2.x 已于 2020 年 1 月 1 日停止维护,因此强烈建…

day20-线性表(链表II)

一、调试器 1.1 gdb(调试器) 在程序指定位置停顿 1.1.1 一般调试 gcc直接编译生成的是发布版(Release) gcc -g //-g调式版本,(体积大,内部有源码)(DeBug&#…

基于Spring Boot+Layui构建企业级电子招投标系统实战指南

一、引言:重塑招投标管理新范式 在数字经济浪潮下,传统招投标模式面临效率低、透明度不足、流程冗长等痛点。本文将以Spring Boot技术生态为核心,融合Mybatis持久层框架、Redis高性能缓存及Layui前端解决方案,构建一个覆盖招标代理…

uniapp -- uCharts 仪表盘刻度显示 0.9999999 这样的值问题处理。

文章目录 🍉问题🍉解决方案🍉问题 在仪表盘上,23.8变成了 23.799999999999997 🍉解决方案 formatter格式化问题 1:在 config-ucharts.js 或 config-echarts.js 配置对应的 formatter 方法 formatter: {yAxisDemo1: function (