kubernetes网络原理
1.1. 基础原则
- 每个Pod都拥有一个独立的IP地址,而且假定所有Pod都在一个可以直接连通的、扁平的网络空间中,不管是否运行在同一Node上都可以通过Pod的IP来访问。
- k8s中Pod的IP是最小粒度IP。同一个Pod内所有的容器共享一个网络堆栈,该模型称为IP-per-Pod模型。
- Pod由docker0实际分配的IP,Pod内部看到的IP地址和端口与外部保持一致。同一个Pod内的不同容器共享网络,可以通过localhost来访问对方的端口,类似同一个VM内的不同进程。
- IP-per-Pod模型从端口分配、域名解析、服务发现、负载均衡、应用配置等角度看,Pod可以看作是一台独立的VM或物理机。
1.2. k8s对集群的网络要求
- 所有容器都可以不用NAT的方式同别的容器通信。
- 所有节点都可以在不同NAT的方式下同所有容器通信,反之亦然。
- 容器的地址和别人看到的地址是同一个地址。
以上的集群网络要求可以通过第三方开源方案实现,例如flannel。
1.3. 网络架构图
1.4. k8s集群IP概念汇总
由集群外部到集群内部:
IP类型 | 说明 |
---|---|
Proxy-IP | 代理层公网地址IP,外部访问应用的网关服务器。[实际需要关注的IP] |
Service-IP | Service的固定虚拟IP,Service-IP是内部,外部无法寻址到。 |
Node-IP | 容器宿主机的主机IP。 |
Container-Bridge-IP | 容器网桥(docker0)IP,容器的网络都需要通过容器网桥转发。 |
Pod-IP | Pod的IP,等效于Pod中网络容器的Container-IP。 |
Container-IP | 容器的IP,容器的网络是个隔离的网络空间。 |
kubernetes的网络实现
k8s网络场景
- 容器与容器之间的直接通信。
- Pod与Pod之间的通信。
- Pod到Service之间的通信。
- 集群外部与内部组件之间的通信。
1. Pod网络
Pod作为kubernetes的最小调度单元,Pod是容器的集合,是一个逻辑概念,Pod包含的容器都运行在同一个宿主机上,这些容器将拥有同样的网络空间,容器之间能够互相通信,它们能够在本地访问其它容器的端口。 实际上Pod都包含一个网络容器,它不做任何事情,只是用来接管Pod的网络,业务容器通过加入网络容器的网络从而实现网络共享。Pod网络本质上还是容器网络,所以Pod-IP就是网络容器的Container-IP。
一般将容器云平台的网络模型打造成一个扁平化网络平面,在这个网络平面内,Pod作为一个网络单元同Kubernetes Node的网络处于同一层级
2. 容器之间的通信
同一个Pod之间的不同容器因为共享同一个网络命名空间,所以可以直接通过localhost直接通信。
3. Pod之间的通信
3.1. 同Node的Pod之间的通信
同一个Node内,不同的Pod都有一个全局IP,可以直接通过Pod的IP进行通信。Pod地址和docker0在同一个网段。
3.2. 不同Node的Pod之间的通信
不同的Node之间,Node的IP相当于外网IP,可以直接访问,而Node内的docker0和Pod的IP则是内网IP,无法直接跨Node访问。需要通过Node的网卡进行转发。
所以不同Node之间的通信需要达到两个条件:
- 对整个集群中的Pod-IP分配进行规划,不能有冲突(可以通过第三方开源工具来管理,例如flannel)。
- 将Node-IP与该Node上的Pod-IP关联起来,通过Node-IP再转发到Pod-IP。
1. Pod间实现通信
例如:Pod1和Pod2(同主机),Pod1和Pod3(跨主机)能够通信
实现:因为Pod的Pod-IP是Docker网桥分配的,Pod-IP是同Node下全局唯一的。所以将不同Kubernetes Node的 Docker网桥配置成不同的IP网段即可。
2. Node与Pod间实现通信
例如:Node1和Pod1/ Pod2(同主机),Pod3(跨主机)能够通信
实现:在容器集群中创建一个覆盖网络(Overlay Network),联通各个节点,目前可以通过第三方网络插件来创建覆盖网络,比如Flannel和Open vSwitch等。
4. Service网络
Service的就是在Pod之间起到服务代理的作用,对外表现为一个单一访问接口,将请求转发给Pod,Service的网络转发是Kubernetes实现服务编排的关键一环。Service都会生成一个虚拟IP,称为Service-IP, Kuberenetes Porxy组件负责实现Service-IP路由和转发,在容器覆盖网络之上又实现了虚拟转发网络。
Kubernetes Porxy实现了以下功能:
- 转发访问Service的Service-IP的请求到Endpoints(即Pod-IP)。
- 监控Service和Endpoints的变化,实时刷新转发规则。
- 负载均衡能力。
开源的网络组件
Flannel
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)