网络
# 理论
# Kubernetes 网络
# 节点网络
- “物理上” 是可达的
- 承载跨节点网络流量
- 对 CNI 插件选型有影响
# 容器网络
- Pod 在相同 node 上可达
- Pod 跨 node 之间可达
- CNI 插件负责创建维护
# 集群网络
- 提供服务的抽象
- 服务到 Pod 的动态映射(DNS)
- 提供负载均衡(负载均衡算法转发流量到不同 Pod)
- 提供服务发现(能感知到 Pod 的变化)
# 网络安全
场景:不希望前端服务可以,跨过后端服务,访问数据库服务
- 外部网络访问
- 安全策略
# 网络基础
# TCP/IP 网络模型
# 以太网 L2 交换
(家用)路由器:即是二层 AP 设备,又是三层路由设备
场景:设备 A 发送请求到设备 B
- 设备 A 需要通过 ARP 协议广播询问
192.168.2.110
得知对应的设备 MAC 地址 - 成功响应后,设备 A 可知设备 B 的 ip、MAC 地址,设备 B 可知设备 A 的 ip、MAC 地址,路由器(MAC 表)可知设备 A、B (MAC) 对应的端口 (port)。
# IP L3 转发
场景:访问百度
- 通过 DNS 协议得到
www.baidu.com
对应的 ip 地址14.215.177.38
- 由于百度的 ip 地址不在当前子网,于是把流量转发给路由器网关
- 路由器网关收到数据包,发现不是自己子网的,于是又转发给光猫网关
- 光猫网关收到数据包,发现不是自己子网的...
# 虚拟机和容器网络
# Network namespace & veth pair & bridge
#
# Pod 网络创建过程
# CNI(container network interface)
# 简介
CNCF 项目,提供实现无关的规范来创建配置容器网络(不仅仅用于 k8s,包括 Mesos、 CloudFoundry、Podman、CRI-O)
定义执行流程和配置格式
# 主要功能
- 创建网络接口,连接 Pod 之间的网络。通过 overlay, route & underlay etc,(不通过 NAT)
- 进行 IP 地址管理,分配 pod IP 地址
- 提供网络安全策略
# 工作机制
通过 JSON 配置文件定义网络配置;
/etc/cni/net.d/xxnet.conf
通过调用可执行程序(CNI 插件)来对容器网络执行配置;
/opt/cni/bin/xxnet
通过链式调用的方式来支持多插件的组合使用。
调用过程:Kubelet->CRI->CNI-> 读取配置 -> 执行二进制插件
# 实现一个 CNI
- 支持 ADD, DEL, CHECK, VERSION 等操作
- 实现一组参数作为输入
# vxlan
- VXLAN (虚拟扩展局域网),是由 IETF 定义的 NVO3 (Network Virtualization over Layer 3) 标准技术之一,是对传统 VLAN 协议的一种扩展。
- VXLAN 本质上是一种隧道技术,在源网络设备与目的网络设备之间的 IP 网络上,建立一条逻辑隧道,将用户侧报文经过特定的封装后通过这条隧道转发。将 L2 的以太帧封装到 UDP 报文 (即 L2 over L4) 中,并在 L3 网络中传输。
- 解决了 vlan 的一些限制:vlan 数量,流量泛洪,FDB 表溢出
- 适应与大规模数据中心网络虚拟化,支持多租户
# BGP
- BGP (Border Gateway Protocol) 是一个去中心化自治路由协议,运用在不同的 AS (自治系统) 之间,是一种路径矢量路由协议,用于 AS 间路由信息的交换;可以实现自治系统间无环路的域间路由。BGP 是沟通 Internet 广域网的主用路由协议。
- AS:是指在一个实体管辖下的拥有相同选路策略的 IP 网络。BGP 网络中的每个 AS 都被分配一个唯的 AS 号,用于区分不同的 AS。
- BGP Speaker:运行 BGP 的路由器称为 BGP 发言者,或 BGP 路由器
- BGP Peer:两个建立 BGP 会话的路由器互为对等体 (Peer),BGP 对等体之间交换 BGP 路由表。
- RR (Router Reflector):允许把从 IBGP Peer 学到的路由反射到其他 IBGP Peer 的 BGP 设备。避免了 AS 内路由器的 mesh 网络。同时 RR 将 EBGP peer 学到的路由发布给其 AS 内部 peer.
# CNI Plugin
# Flannel
- 每个节点分配一个子网,所有 pod 从本地子网中分配 ip
- Pod 在本节点通过 bridge L2 通信
- 默认情况下,跨节点通过 vxlan 通信。通过 flannel.1 这个 udp 隧道进行流量的转发
- 除了 vxlan, flannel 也支持 IPIP(IP 隧道)、Host-GW(路由表实现)两种后端。
# Calico
- Felix 运行在每个节点的 agent 进程,主要负责网络接口管理和监听、路由、ARP 管理、ACL 管理和同步、状态上报等
- etcd 主要负责网络元数据的存储和一致性
- BIRD 主要负责把 Felix 写入 Kernel 的路由信息分发到当前 Calico 网络
- IP 地址管理:可以使用 host-local 或 calico-ipam 做地址管理。
- 大规模部署时使用,据弃所有节点互联的 mesh 模式,通过一个或者多个 BGP Route Reflector 来完成集中式
- 由于 Calico BGP 是一种纯三层的实现,因此可以避免与二层方案相关的数据包封装的操作,中间没有 NAT 没有的 overlay,所以它的转发效率高
- BGP 的限制是比如二层可达,如果节点属于不同二层网络,需要用 IPinIP/vxlan 做隧道。
# Multus
todo
如何查看当前Kubernetes的CNI插件?
kubectl get daemonset -n kube-system
# 参考资料
上次更新: 2024/03/11, 22:37:05