云世
微信公众号:云世
【云世】公众号关注每个想要提升硬实力和软实力上的人,持续不断发布以下话题的相关内容:
Ø 云原生系列(容器Docker,K8s,Service Mesh,DevOps,云原生落地实践等)
Ø 微服务系列(服务划分,DDD实践,微服务架构,微服务落地实践等)
Ø 职场软技能(认知提升,思考力模型,场景应对方法论)
Ø 数据分析系列 (Python,可视化图形制作等)
Ø 互联网产品系统化模型+方法论
Ø MBA考研资料免费放送
Ø 技术团队管理
通过之前的学习(「K8s从入门到精通全系列」见公众号【云世】),相信你对 Kubernetes 越来越熟悉了。理论上,Kubernetes 可以跑在任何环境中,比如公有云、私有云、物理机、虚拟机、树莓派,但是任何基础设施(Infrastructure)对网络的需求都是最基本的。网络同时也是 Kubernetes 中比较复杂的一部分。
我们今天就来聊聊 Kubernetes 中的网络,先来看看 Kubernetes 中定义的网络模型。
Kubernetes 网络模型
Kubernetes 的网络模型在设计的时候就遵循了一个基本原则,即每一个 Pod 都拥有一个自己的独立的 IP 地址,且这些 Pod 之间可以不通过任何 NAT 互相连通。
基于这样一个 IP-per-Pod 的方式,用户在使用的时候就不需要再额外考虑如何建立 Pod 之间的连接,也不用考虑如何将容器的端口映射到主机端口,毕竟动态地分配映射端口不仅会给整个系统增加很大的复杂度,还不方便服务间做服务发现。而且由于主机端口的资源也是有限的,端口映射还会给集群的可扩展性带来很大挑战。
每个 Pod 有了独立的 IP 地址以后,通信双方看到的 IP 地址就是对方实际的地址,即不经过 NAT。不管 Pod 是否在同一个宿主机上,都可以直接基于对方 Pod 的 IP 进行访问。
基于这样的一个网络模型,我们来看看 Kubernetes 中的如下 4 种场景是如何进行网络通信的:
-
Pod 内容器之间的网络通信;
-
Pod 之间的网络通信;
-
Pod 到 Service 之间的网络通信;
-
集群外部与内部组件之间的网络通信。