Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >扩展 Kubernetes 之 CNI

扩展 Kubernetes 之 CNI

原创
作者头像
王磊-字节跳动
修改于 2020-10-19 16:50:33
修改于 2020-10-19 16:50:33
3.4K1
举报
文章被收录于专栏:01ZOO01ZOO

> 扩展 kubernetes 分为三种模式 webhook,binary 二进制,controller

简介

CNI 是什么

  • CNI: Container Network Interface 定义的是 将 container 插入 network, 和 将 container 从 network 移除的操作
  • CNI Plugin: 实现了 CNI 的二进制程序, 区别于 runtime, 调用方式为 runtime 调用 CNI plugin
  • Container = Linux network namespace, 可能是一个 pod 即多个 container 对应了一个 network namespace
  • Network 指 a group of entities that are uniquely addressable that can communicate amongst each other, Containers 可以加到一个或者多个 network 里

CNI Plugin 处于什么位置

image
image

CNI/CNI Plugins

CNI 项目包括两个部分

  1. The CNI specification documents 即 上面说的 CNI 的部分
    • libcni, 实现 CNI runtime 的 SDK,比如 kubernetes 里面的 NetworkPlugin 部分就使用了 libcni 来调用 CNI plugins. 这里面也有一些 interface,容易混淆,这个 interface 是对于 runtime 而言的,并不是对 plugin 的约束,比如 AddNetworkList, runtime 调用这个方法后,会按顺序执行对应 plugin 的 add 命令.
    • 值得一提的是 libcni 里面的 config caching:解决的是如果 ADD 之后配置变化了,如何 DEL 的问题.
    • skel provides skeleton code for a CNI plugin, 实现 CNI plugin 的骨架代码
    • cnitool 一个小工具,可以模拟 runtime 执行比如 libcni 的 AddNetworkList,触发执行 cni plugins
    • github.com/containernetworking/cni
  2. A set of reference and example plugins 即 CNI Plugin 的部分
    • Interface plugins: ptp, bridge, macvlan,...
    • "Chained" plugins: portmap, bandwidth, tuning
    • github.com/containernetworking/plugins

CNI Plugin 对 runtime 的假设

  1. Container runtime 先为 container 创建 network 再调用 plugins.
  2. Container runtime 决定 container 属于哪个网络,继而决定执行哪个 CNI plugin.
  3. Network configuration 为 JSON 格式,包含一些必选可选参数.
  4. 创建时 container runtime 串行添加 container 到各个 network (ADD).
  5. 销毁时 container runtime 逆序将 container 从各个 network 移除 (DEL).
  6. 单个 container 的 ADD/DEL 操作串行,但是多个 container 之间可以并发.
  7. ADD 之后必有 DEL,多次 DEL 操作幂等.
  8. ADD 操作不会执行两次(对于同样的 KEY-network name, CNI_CONTAINERID, CNI_IFNAME

CNI 的执行流程

  1. 基本操作: ADD, DEL, CHECK and VERSION
  2. Plugins 是二进制,当需要 network 操作时,runtime 执行二进制对应 命令
  3. 通过 stdin 向 plugin 输入 JSON 格式的配置文件,以及其他 container 相关的信息 比如:
    • ADD 操作的参数有 Container ID, Network namespace path, Network configuration, Extra arguments, Name of the interface inside the container, 返回 Interfaces list, IP configuration assigned to each interface, DNS information
    • DEL/CHECK 操作的参数 基本相同,具体参考 SPEC
  4. 通过 stdout 返回结果

输出参数示例

代码语言:txt
AI代码解释
复制
{
  "cniVersion": "0.4.0",
  "interfaces": [                                            (this key omitted by IPAM plugins)
      {
          "name": "<name>",
          "mac": "<MAC address>",                            (required if L2 addresses are meaningful)
          "sandbox": "<netns path or hypervisor identifier>" (required for container/hypervisor interfaces, empty/omitted for host interfaces)
      }
  ],
  "ips": [
      {
          "version": "<4-or-6>",
          "address": "<ip-and-prefix-in-CIDR>",
          "gateway": "<ip-address-of-the-gateway>",          (optional)
          "interface": <numeric index into 'interfaces' list>
      },
      ...
  ],
  "routes": [                                                (optional)
      {
          "dst": "<ip-and-prefix-in-cidr>",
          "gw": "<ip-of-next-hop>"                           (optional)
      },
      ...
  ],
  "dns": {                                                   (optional)
    "nameservers": <list-of-nameservers>                     (optional)
    "domain": <name-of-local-domain>                         (optional)
    "search": <list-of-additional-search-domains>            (optional)
    "options": <list-of-options>                             (optional)
  }
}

Network Configuration

Network Configuration 是 CNI 输入参数中最重要当部分, 可以存储在磁盘上

Network Configuration 示例

代码语言:txt
AI代码解释
复制
// ------------------------------------
{
  "cniVersion": "0.4.0",
  "name": "dbnet",
  "type": "bridge",
  // type (plugin) specific
  "bridge": "cni0",
  "ipam": {
    "type": "host-local",
    // ipam specific
    "subnet": "10.1.0.0/16",
    "gateway": "10.1.0.1"
  },
  "dns": {
    "nameservers": [ "10.1.0.1" ]
  }
}

// ------------------------------------
{
  "cniVersion": "0.4.0",
  "name": "pci",
  "type": "ovs",
  // type (plugin) specific
  "bridge": "ovs0",
  "vxlanID": 42,
  "ipam": {
    "type": "dhcp",
    "routes": [ { "dst": "10.3.0.0/16" }, { "dst": "10.4.0.0/16" } ]
  },
  // args may be ignored by plugins
  "args": {
    "labels" : {
        "appVersion" : "1.0"
    }
  }
}

IPAM plugin

  • IPAM (IP Address Management) plugin 作为 CNI plugin 的一部分存在
  • 之所以设计成两部分是因为 Ip 分配的逻辑 在很多 CNI plugin 之间可以复用
  • CNI plugin 负责调用 IPAM plugin
  • IPAM plugin 完成确定 ip/subnet/gateway/route 的操作,然后返回给 main plugin
  • IPAM plugin 可能通过例如 dhcp 协议分配 ip,并在本地存储相关信息
  • IPAM plugin 和 CNI plugin 输入参数相同,返回参数见下面的示例
代码语言:txt
AI代码解释
复制
{
  "cniVersion": "0.4.0",
  "ips": [
      {
          "version": "<4-or-6>",
          "address": "<ip-and-prefix-in-CIDR>",
          "gateway": "<ip-address-of-the-gateway>"  (optional)
      },
      ...
  ],
  "routes": [                                       (optional)
      {
          "dst": "<ip-and-prefix-in-cidr>",
          "gw": "<ip-of-next-hop>"                  (optional)
      },
      ...
  ]
  "dns": {                                          (optional)
    "nameservers": <list-of-nameservers>            (optional)
    "domain": <name-of-local-domain>                (optional)
    "search": <list-of-search-domains>              (optional)
    "options": <list-of-options>                    (optional)
  }
}

CNI plugins

plugins 项目中有几个 cni team 维护的常用 plugin, 并且进行了分类 (尽管 main plugin 可能会调用其他 plugin, 但是对于实现来讲,几种 plugin 的对外接口并无区别):

  • Main: bridge, loopback, vlan, macvlan, ipvlan, host-device, ptp, Windows bridge, Windows overlay
  • IPAM: host-local, DHCP, static
  • Meta: bandwidth, firewall, flannel, portmap, source-based routing, tuning

常见 CNI plugins

IPAM host-local

  • host-local 的应用范围很广: kubenet、bridge、ptp、ipvlan 等 cni 插件的 IPAM 部分常配置成由 host-local 进行处理, 比如下面这个配置.
代码语言:txt
AI代码解释
复制
root@VM-4-10-ubuntu:/etc/cni/net.d/multus# cat bridge.conf
{
  "cniVersion": "0.1.0",
  "name": "bridge",
  "type": "bridge",
  "bridge": "cbr0",
  "mtu": 1500,
  "addIf": "eth0",
  "isGateway": true,
  "forceAddress": true,
  "ipMasq": false,
  "hairpinMode": false,
  "promiscMode": true,
  "ipam": {
    "type": "host-local",
    "subnet": "10.4.10.0/24",
    "gateway": "10.4.10.1",
    "routes": [
      { "dst": "0.0.0.0/0" }
    ]
  }
}
  • host-local 在本地完成对 subnet 中的 ip 的分配, 这里值得注意的是: subnet = node 的 podcidr, 这在 node_ipam_controller 中完成, 原始分配的范围来自 ControllerManager 的配置; 即 常见的 IP 分配流程如下图:
代码语言:txt
AI代码解释
复制
graph TD
ControllerManager配置subnet --> NodeSpec中生成子subnet 
NodeSpec中生成子subnet --> CNIAgent在各个node上生成配置文件,写入子subnet 
CNIAgent在各个node上生成配置文件,写入子subnet --> CNIplugin在子subnet中分配Ip

MAIN bridge

brige模式,即网桥模式。在node上创建一个linux bridge,并通过 vethpair 的方式在容器中设置网卡和 IP。只要为容器配置一个二层可达的网关:比如给网桥配置IP,并设置为容器ip的网关。容器的网络就能建立起来。

ADD 流程:

  1. setupBridge: brdige 组件创建一个指定名字的网桥,如果网桥已经存在,就使用已有的网桥, promiscMode 打开时开启混杂模式, 这一步关心的参数为 MTU, PromiscMode, Vlan
  2. setupVeth: 在容器空间创建 vethpair,将 node 端的 veth 设备连接到网桥上
  3. 如果由 ipam 配置:从ipam获取一个给容器使用的 ip,并根据返回的数据计算出容器对应的网关
  4. 进入容器网络名字空间,修改容器中网卡名和网卡ip,以及配置路由,并进行 arp 广播(注意我们只为vethpair的容器端配置ip,node端是没有ip的)
  5. 如果IsGW=true,将网桥配置为网关,具体方法是:将第三步计算得到的网关IP配置到网桥上,同时根据需要将网桥上其他ip删除。最后开启网桥的ip_forward内核参数;
  6. 如果IPMasq=true,使用iptables增加容器私有网网段到外部网段的masquerade规则,这样容器内部访问外部网络时会进行snat,在很多情况下配置了这条路由后容器内部才能访问外网。(这里代码中会做exist检查,防止生成重复的iptables规则)
  7. 配置结束,整理当前网桥的信息,并返回给调用者

MAIN host-device

本段来自

相比前面两种cni main组件,host-device显得十分简单因为他就只会做两件事情:

  • 收到ADD命令时,host-device根据命令参数,将网卡移入到指定的网络namespace(即容器中)。
  • 收到DEL命令时,host-device根据命令参数,将网卡从指定的网络namespace移出到root namespace。

在bridge和ptp组件中,就已经有“将vethpair的一端移入到容器的网络namespace”的操作。那这个host-device不是多此一举吗?

并不是。host-device组件有其特定的使用场景。假设集群中的每个node上有多个网卡,其中一个网卡配置了node的IP。而其他网卡都是属于一个网络的,可以用来做容器的网络,我们只需要使用host-device,将其他网卡中的某一个丢到容器里面就行。

host-device模式的使用场景并不多。它的好处是:bridge、ptp 等方案中,node上所有容器的网络报文都是通过node上的一块网卡出入的,host-device方案中每个容器独占一个网卡,网络流量不会经过node的网络协议栈,隔离性更强。缺点是:在node上配置数十个网卡,可能并不好管理;另外由于不经过node上的协议栈,所以kube-proxy直接废掉。k8s集群内的负载均衡只能另寻他法了。

META portmap

meta组件通常进行一些额外的网络配置(tuning),或者二次调用(flannel)

portmap 的主要作用是修改防火墙 iptables 规则, 配置 SNAT,DNAT 和端口转发

实践

用 bash 实现一个 bridge CNI plugin

  1. 在机器上准备 cni 配置和 网桥 (这一步实践也可以在 cni plugin 中 ensure) brctl addbr cni0;ip link set cni0 up; ip addr add <bridge-ip>/24 dev cni0
  2. 安装 nmap 和 jq
  3. bash-cni 脚本,完整脚本参考自 bash-cni
代码语言:txt
AI代码解释
复制
#!/bin/bash -e

if [[ ${DEBUG} -gt 0 ]]; then set -x; fi

exec 3>&1 # make stdout available as fd 3 for the result
exec &>> /var/log/bash-cni-plugin.log

IP_STORE=/tmp/reserved_ips # all reserved ips will be stored there

echo "CNI command: $CNI_COMMAND" 

stdin=`cat /dev/stdin`
echo "stdin: $stdin"

# 分配 ip,从所有 ip 中选择没有 reserved 的, 同时更新到 store 的reserved ip 列表
allocate_ip(){
	for ip in "${all_ips[@]}"
	do
		reserved=false
		for reserved_ip in "${reserved_ips[@]}"
		do
			if [ "$ip" = "$reserved_ip" ]; then
				reserved=true
				break
			fi
		done
		if [ "$reserved" = false ] ; then
			echo "$ip" >> $IP_STORE
			echo "$ip"
			return
		fi
	done
}

# 实现 cni plugin 的4个命令
case $CNI_COMMAND in
ADD)
	network=$(echo "$stdin" | jq -r ".network") # network 配置
	subnet=$(echo "$stdin" | jq -r ".subnet")   # 子网配置
	subnet_mask_size=$(echo $subnet | awk -F  "/" '{print $2}') 

	all_ips=$(nmap -sL $subnet | grep "Nmap scan report" | awk '{print $NF}') # 所有ip
	all_ips=(${all_ips[@]})
	skip_ip=${all_ips[0]}
	gw_ip=${all_ips[1]}
	reserved_ips=$(cat $IP_STORE 2> /dev/null || printf "$skip_ip\n$gw_ip\n") # reserving 10.244.0.0 and 10.244.0.1 预留 ip
	reserved_ips=(${reserved_ips[@]})
	printf '%s\n' "${reserved_ips[@]}" > $IP_STORE # 预留 ip 存储到文件
	container_ip=$(allocate_ip)
	
	# ---- 以上是 ip 分配流程

	mkdir -p /var/run/netns/
	ln -sfT $CNI_NETNS /var/run/netns/$CNI_CONTAINERID

	rand=$(tr -dc 'A-F0-9' < /dev/urandom | head -c4)
	host_if_name="veth$rand"
	ip link add $CNI_IFNAME type veth peer name $host_if_name 

	ip link set $host_if_name up 
	ip link set $host_if_name master cni0 

	ip link set $CNI_IFNAME netns $CNI_CONTAINERID
	ip netns exec $CNI_CONTAINERID ip link set $CNI_IFNAME up
	ip netns exec $CNI_CONTAINERID ip addr add $container_ip/$subnet_mask_size dev $CNI_IFNAME
	ip netns exec $CNI_CONTAINERID ip route add default via $gw_ip dev $CNI_IFNAME
	
	# ------ 以上是创建 veth, 绑定到 网桥,设置 容器端的 ip, route 的过程

	mac=$(ip netns exec $CNI_CONTAINERID ip link show eth0 | awk '/ether/ {print $2}')
echo "{
  \"cniVersion\": \"0.3.1\",
  \"interfaces\": [                                            
      {
          \"name\": \"eth0\",
          \"mac\": \"$mac\",                            
          \"sandbox\": \"$CNI_NETNS\" 
      }
  ],
  \"ips\": [
      {
          \"version\": \"4\",
          \"address\": \"$container_ip/$subnet_mask_size\",
          \"gateway\": \"$gw_ip\",          
          \"interface\": 0 
      }
  ]
}" >&3

;;

DEL)
	ip=$(ip netns exec $CNI_CONTAINERID ip addr show eth0 | awk '/inet / {print $2}' | sed  s%/.*%% || echo "")
	if [ ! -z "$ip" ]
	then
		sed -i "/$ip/d" $IP_STORE
	fi
;;

GET)
	echo "GET not supported"
	exit 1
;;

VERSION)
echo '{
  "cniVersion": "0.3.1", 
  "supportedVersions": [ "0.3.0", "0.3.1", "0.4.0" ] 
}' >&3
;;

*)
  echo "Unknown cni commandn: $CNI_COMMAND" 
  exit 1
;;

esac

使用 cni-tool 测试

代码语言:txt
AI代码解释
复制
$ ip netns add testing
$ CNI_PATH=/opt/cni/bin/ CNI_IFNAME=test CNI_CONTAINERID=testing cnitool add mynet /var/run/netns/testing
{
    "cniVersion": "0.3.1",
    "interfaces": [
        {
            "name": "eth0",
            "sandbox": "/var/run/netns/testing"
        }
    ],
    "ips": [
        {
            "version": "4",
            "interface": 0,
            "address": "10.244.149.16/24",
            "gateway": "10.244.149.1"
        }
    ],
    "dns": {}
}

使用 k8s yaml 测试

代码语言:txt
AI代码解释
复制
$ kubectl apply -f https://raw.githubusercontent.com/s-matyukevich/bash-cni-plugin/master/01_gcp/test-deployment.yml

参考

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
1 条评论
热度
最新
赞了。学习ing
赞了。学习ing
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
k8s网络开发丨k8s与OpenStack网络如何打通?
点击上方“腾讯云TStack”关注我们 获取最in云端资讯和海量技术干货 本文作者 / ice yao 喜欢看动漫的IT男 还是火影迷、海贼迷、死神迷、妖尾迷、全职猎人迷、龙珠迷、网球王子迷~ 左手一个OpenStack,右手一个K8s~ 背 景 有OpenStack, 又有Kubernetes; 网络想做统一管理,k8s集群运行在OpenStack VM下, 如何做到更深层面的网络打通,典型的原因有: 1、 VM防arp欺骗,默认OpenStack虚拟机端口都开启了此功能;处于OpenStac
腾讯云TStack
2020/11/30
3.9K0
彻底理解kubernetes CNI
CNI接口很简单,特别一些新手一定有克服恐惧心里,和我一探究竟,本文结合原理与实践,认真读下来一定会对原理理解非常透彻。
sealyun
2019/08/05
1.8K0
​如何实现一个 Kubernetes 网络插件
目前容器的网络解决方案越来越多,每出现一种新的解决方案,都要为网络方案和不同的容器运行时进行适配,这显然是不合理的,而 CNI 就是为了解决这个问题。
CS实验室
2021/03/22
7170
​如何实现一个 Kubernetes 网络插件
Kubernetes之CNI详解
要深入了解Kubernetes的CNI(Container Network Interface)历史,需要从其早期网络模型、CNI规范的引入、主要CNI插件的发展,以及社区的演进等方面进行详细探讨。
锅总
2024/06/26
6750
Kubernetes之CNI详解
9021年了,你还不知道CNI?
目前專注於 Kubernetes CNI 插件開發,並透過 Open vSwitch 設計容器網路於多物理節點上的虛擬網路架構
腾讯云TStack
2019/05/16
9520
9021年了,你还不知道CNI?
浅谈 K8s Pod IP 分配机制
王成,腾讯云研发工程师,Kubernetes member,从事数据库产品容器化、资源管控等工作,关注 Kubernetes、Go、云原生领域。
腾讯云原生
2023/08/03
1.6K0
浅谈 K8s Pod IP 分配机制
容器网络硬核技术内幕 (9) 大道至简
在上期的专题《五湖四海的友谊》中我们提到,Kubernetes为第三方开发者提供了CNI(Container Network Interface)接口,通过安装CNI插件,在创建pod的时候,调用CNI插件的API,实现pod自动化入网。同样地,在pod销毁的时候,释放相应的网络资源。
用户8289326
2022/07/28
2130
容器网络硬核技术内幕 (9) 大道至简
Kubernetes 中数据包的生命周期 -- 第 1 部分
Kubernetes 集群中的网络可能会令人感到有点困惑,即便是对于拥有虚拟网络和路由实践经验的工程师来说也是如此。本系列文章将分为 4 个部分,帮助你理解基本的 Kubernetes 网络,本文属于第一部分。
Se7en258
2022/06/24
1.2K0
Kubernetes 中数据包的生命周期 -- 第 1 部分
040.集群网络-CNI网络模型
生产环境中,跨主机容器间的网络互通已经成为基本要求,更高的要求包括容器固定IP地址、一个容器多个IP地址、多个子网隔离、ACL控制策略、与SDN集成等。目前主流的容器网络模型主要有Docker公司提出的Container Network Model(CNM)模型和CoreOS公司提出的Container Network Interface(CNI)模型。
木二
2020/03/25
1.2K0
Kubernetes CNI网络插件
Kubernetes通过一个CNI接口,维护了单独的网桥代替docker0,该网桥就是CNI网桥,默认是cni0。
shysh95
2023/08/23
5910
Kubernetes CNI网络插件
《CNI 揭秘:打造高性能的容器网络》
🐯 猫头虎博主来啦!在容器化的时代,网络性能变得至关重要。我发现越来越多的技术爱好者在搜索 “CNI 介绍”、“容器网络优化” 或 “CNI 最佳实践”。为此,我决定深入研究 CNI,与大家分享如何打造一个高效的容器网络环境。从 CNI 的基础到实际应用,一切尽在本文。🚀
猫头虎
2024/04/09
2800
深入理解kubernetes(k8s)网络原理之五-flannel原理
flannel有udp、vxlan和host-gw三种模式,udp模式因为性能较低现在已经比较少用到,host-gw我们在前面简单介绍过,因为使用场景比较受限,所以vxlan模式是flannel使用最多的模式,本章我们来介绍一下vxlan模式的原理。
一生无聊
2021/09/02
4.1K0
深入理解kubernetes(k8s)网络原理之五-flannel原理
docker实践(7) 容器网络和网络SR-IOV插件
我们去年为了上云,先逐步是使用docker部署,然后逐步k8s部署,为此搭建了docker容器平台,该平台分配ip需要绑定宿主机cvm的弹性网卡,为此专门引入了网络SR-IOV插件,趁此补充完善该文。
黄规速
2023/12/10
1.9K0
docker实践(7) 容器网络和网络SR-IOV插件
containerd快速安装指南🚀
本指南旨在提供一个简洁有效的方法来安装containerd。我们将通过一份易于理解的脚本步骤,指导您完成安装🔧。请根据您的实际需求,适当调整containerd版本及其相关依赖。
GousterCloud
2024/03/29
3060
containerd快速安装指南🚀
SDNLAB技术分享(十五):容器网络大观
一、容器网络概述 容器这一两年火的不行,可以说是独领IT风骚,一时风光无二。相比于虚拟机来说,容器更轻,一台服务器上可以运行成百上千的容器,这意味着更为密集的计算资源,因此基于容器运行工作负载的模式深受云服务提供商们的青睐。 然而对于云管理员来说,管理容器确是一件相当头疼的事情,容器的生命周期更短了,容器的数量更多了,容器间的关系更复杂了。为了简化大规模容器集群的运维,各路容器管理与编排平台应运而生,Docker社区开发了Swarm+Machine+Compose的集群管理套件,Twitter主推Apach
SDNLAB
2018/04/02
1.4K0
SDNLAB技术分享(十五):容器网络大观
cni | 容器网络接口规范|Container Networking Interface Specification
Application containers on Linux are a rapidly evolving area, and within this area networking is not well addressed as it is highly environment-specific. We believe that many container runtimes and orchestrators will seek to solve the same problem of making the network layer pluggable.
heidsoft
2022/04/18
9870
cni | host-local IP 地址管理插件
host-local IPAM allocates IPv4 and IPv6 addresses out of a specified address range. Optionally, it can include a DNS configuration from a resolv.conf file on the host.
heidsoft
2022/04/18
1.2K0
25 Sep 2019 kubernetes网络(一)
flannel的vxlan模式中,kubernetes借助cni接口,维护了一个类似docker0的网桥,即cni网桥cni0。完成容器的跨主通信。cni网桥只会接管由其创建的容器之间的容器。cni主要功能是kubernetes启动infra容器后,调用相应的cni插件,为infra容器的network namespace配置网络栈,如网卡、回环设备、路由表和iptables规则。
俊采
2023/10/17
2620
4 张图带你搞懂 Kubernetes Pod 如何获取 IP 地址
在学习 Kubernetes 网络模型的过程中,了解各种网络组件的作用以及如何交互非常重要。本文就介绍了各种网络组件在 Kubernetes 集群中是如何交互的,以及如何帮助每个 Pod 都能获取 IP 地址。
iMike
2021/02/07
5.2K0
从CNI到OVN
诸如calico flannel等CNI实现,通过牺牲一些功能让网络复杂度得以大幅度降低是我极其推崇的,在云原生时代应用不再关心基础设施的场景下是一个明智之举,给网络调错带来了极大方便。
sealyun
2019/07/25
1.5K0
相关推荐
k8s网络开发丨k8s与OpenStack网络如何打通?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档