首页
Search
1
yamux: how to work?
79 阅读
2
The Art of Memory Allocation: Malloc, Slab, C++ STL, and GoLang Memory Allocation
70 阅读
3
How to receive a network packet in Linux
63 阅读
4
Maps and Memory Leaks in Go
54 阅读
5
C++ redis connection pool
52 阅读
测试
Wireguard
K8s
Redis
C++
Golang
Libcurl
Tailscale
Nginx
Linux
web3
Uniswap V2
Uniswap V3
EVM
security
solidity
openzeppelin
登录
Search
标签搜索
web3
solidity
web3 security
c++
uniswapV3
redis
evm
uniswap
性能测试
k8s
wireguard
CNI
http
tailscale
nginx
linux
设计模式
Jericho
累计撰写
51
篇文章
累计收到
13
条评论
首页
栏目
测试
Wireguard
K8s
Redis
C++
Golang
Libcurl
Tailscale
Nginx
Linux
web3
Uniswap V2
Uniswap V3
EVM
security
solidity
openzeppelin
页面
搜索到
1
篇与
的结果
2022-12-01
K8s bridge、CNI
一、项目地址 k8s CNI 插件 二、项目介绍bridge、IPAM 插件都在K8s的网络插件里面bridge插件首先创建一个虚拟网桥,其功能类似物理交换机,将所有容器接入一个二层网络;容器接入是通过创建的veth pair(虚拟网卡对)实现,将网卡对的一端放在容器中并分配IP地址,另一端放在host的namespace内连上虚拟网桥,网桥上可以配置IP作为容器的网关,通过网桥连接了两个不同namespace内的网卡,容器内发出的数据包可通过网桥转发到host网络协议栈或进入另一个容器,最终实现容器之间、容器和主机间、容器和服务间的通信。2.工作流程创建容器时的动作1)按名称检查网桥是否存在,若不存在则创建一个虚拟网桥2)创建虚拟网卡对,将host端的veth口连接到网桥上3)IPAM从地址池中分配IP给容器使用,并计算出对应网关配置到网桥4)进入容器网络名称空间,修改容器端的网卡ip并配置路由5)使用iptables增加容器内部网段到外部网段的masquerade规则6)获取当前网桥信息,返回给调用者删除容器时的动作1)按输入参数找到要删除容器的IP地址,调用ipam插件删除地址并将IP归还地址池2) 进入容器网络隔离ns,根据容器IP找到对应的网络接口并删除3) 在节点主机上删除创建网络时添加的所有iptables规则数据结构解析bridge配置需转化的json结构接口网桥提供了三个接口add、del、checkadd:解析配置文件,创建网桥,虚拟网卡对、获取当前namespace,用虚拟网卡对将网桥和namespace连接,调用ipam插件给namespace侧的虚拟网卡对分配ip,配置路由,配置snat,返回bridge信息del: 通过ipam插件删除容器申请的IP地址,并归还到地址池,进入容器ns删除对应的网络接口veth和IP地址,snatcheck: 调用ipam插件ExecCheck进行检查, 检测bridge端口类型和mac地址,检测容器接口类型和mac地址,检查bridge和容器的veth是否配对,检查ip是否配置正确,检查route是否配置正确四、IP Address Management (IPAM)DHCP模式一个DHCP的服务流程需要两个组件DHCP Client 和DHCP Server,而DHCP IPAM扮演的角色就是DHCP Client,DHCP Client运作的模式发送DHCP 请求等待DHCP 响应设定IP到目标网络介质上定期RenewDHCP模式下有两种运行的形式,一种是CNI模式(提供函数接口),一种是启动一个不停运行的daemon模式(使用rpc提供接口)。daemon 模式的功用很简单,接受所有来自 CNI 模式的请求,然后切换到目标的 namespace 里面去根据目标的网络介质发送一个 DHCP 请求封包,所以运行 DHCP IPAM 之前,要先在系统上跑一个 daemon,然后会通过 unix socket 的方式等待 DHCP IPAM CNI 发送命令过来,该命令需要包含 目标的namespace和目标的网卡名称。执行流程图首先当 DHCP CNI被调用后,会先通过 unix socket 的方式通知 daemondaemon 接着到该 ns 之中,确认这个ns存在就发送对应的DHCP 請求magic 的意思代表沒有限定数据包要怎么处理,总之 DHCP 封包要有办法出去最后外面的(甚至同一台机器)上面的 DHCP Server 可以看到 Request 并且回复Reply最后当DHCP Daemon 发送 DHCP 请求的那个 thread 接收到 DHCP 回复后,就会给目标网卡设置 IP 地址。Static模式static IPAM 是一个非常简单的 IPAM 插件,可以将 IPv4 和 IPv6 地址静态分配给容器。 这将有助于调试目的以及在不同 vlan/vxlan 中为容器分配相同 IP 地址的情况。需要手动设置IP 地址,包含了 ipv4/ipv6Route 路由表DNS 设置Host-Local模式大部分CNI 会使用这个IPAM去处理IP分配的问题1.config格式{ "ipam": { "type": "host-local", "ranges": [ [ { "subnet": "10.10.0.0/16", "rangeStart": "10.10.1.20", "rangeEnd": "10.10.3.50", "gateway": "10.10.0.254" }, { "subnet": "172.16.5.0/24" } ] ] } }返回的ip格式"cniVersion": "0.2.0", "ip4": { "ip": "10.10.1.20/16", "gateway": "10.10.0.254" }, "dns": {} }2.IP分配原理host-local IPAM 插件从一组地址范围中分配 IP 地址。 它将状态本地存储在主机文件系统上,从而确保单个主机上 IP 地址的唯一性。 分配器可以分配多个范围,并支持多个(不相交的)子网集。 分配策略在每个范围集中进行round-robin3.状态存储路径默认路径 /var/lib/cni/networks/sudo find /var/lib/cni/networks/ -type f/var/lib/cni/networks/last_reserved_ip.0/var/lib/cni/networks/10.10.1.20/var/lib/cni/networks/10.10.1.22/var/lib/cni/networks/10.10.1.21sudo find /var/lib/cni/networks/ -type f | xargs -I % sh -c 'echo -n "%: ->"; cat %; echo "";'/var/lib/cni/networks/last_reserved_ip.0: ->10.10.1.22/var/lib/cni/networks/10.10.1.20: ->ns1/var/lib/cni/networks/10.10.1.22: ->ns1/var/lib/cni/networks/10.10.1.21: ->ns1每个被用过的 IP 都会产生一个以该 IP 为名的文件,该文件中的內容非常简单,就是使用的 container ID(ns1),last_reserved_ip 的文件,该文件用来记住每个 range 目前分配的最后一个 IP 是哪个
2022年12月01日
19 阅读
0 评论
1 点赞