1、基本概念
容器:Container(容器)是一种便携式、轻量级的操作系统级虚拟化技术。它使用 NameSpace 隔离不同的软件运行环境,并通过镜像自包含软件的运行环境,从而使得容器可以很方便的在任何地方运行。
Pod:Kubernetes 使用 Pod 来管理容器,每个 Pod 可以包含一个或多个紧密关联的容器,一对多的关系。
Service:Service 是应用服务的抽象,通过 labels 为应用提供负载均衡和服务发现。匹配 labels 的 Pod IP 和端口列表组成 endpoints,由 kube-proxy 负责将服务 IP 负载均衡到这些 endpoints 上。
Namespace:Namespace是Linux提供的一种对于系统全局资源的隔离机制;从进程的视角来看,同一个namespace中的进程看到的是该namespace自己独立的一份全局资源,这些资源的变化只在本namespace中可见,对其他namespace没有影响。容器就是采用namespace机制实现了对网络,进程空间等的隔离。不同的Container(在K8S中是以Pod为单位)属于不同namespace,实现了Container或Pod之间的资源互相隔离,互不影响。
Network namespace允许你在Linux中创建相互隔离的网络视图,每个网络名字空间都有自己独立的网络配置,包括:网卡、回环设备、网络栈;网络设备、路由表、IPTables规则。
2、k8s网络模型
kubernetes网络模型设计的目的是给pod、service等提供一个简单、一致的网络视图和使用体验,对他们屏蔽了宿主机环境的网络拓扑的同时,也屏蔽了网络模型上实现的细节;
同时要求每个Pod都拥有一个独立的IP地址,而且假定所有Pod都在一个可以直接连通的、扁平的网络空间中;
如何对扁平的网络进行理解:
- 所有的 Pod 可以与任何其他 Pod 直接通信,无需使用 NAT 映射(network address translation);
- 所有节点可以与所有 Pod 直接通信,无需使用 NAT 映射;
- Pod 内部获取到的 IP 地址与其他 Pod 或节点与其通信时的 IP 地址是同一个;
k8s的网络组成有:
- 集群内:同一个pod上不同容器的通信、pod间通信,pod和服务(service)之间的通信,
- 集群外:外部和service服务间的通信
接下来具体分析k8s对集群内网络模型的解决方案
同一个pod上不同容器的通信
Kubernetes创建Pod时,首先会创建一个infra容器,为Pod指派一个唯一的IP地址。然后,以infra的网络命名空间为基础,创建同一个Pod内的其它容器;因此,同一个Pod内的所有容器就会共享同一个网络命名空间,在同一个Pod之间的容器可以直接使用localhost进行通信。
pod间通信
使用两个虚拟接口组成的veth对可以使不同的网络命名空间连接起来,这些虚拟接口分布在多个网络命名空间上,这里通过veth对让pod1的eth0和veth0、pod2的eth0和veth1关联起来;
再通过网桥把veth0和veth1组成为一个以太网,从而让pod1和pod2相互通信。