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.pswp.cn/pingmian/81379.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/81379.shtml
英文地址,請注明出處:http://en.pswp.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 (