本章节主要学习Flannel网络是如何通信,从而深刻理解从内部到外部,从外部到内部的资源访问。

一、container-container通信原理解析

这种场景对于Kubernetes来说没有任何问题,根据Kubernetes的架构设计。Kubernetes创建Pod时,首先会创建一个pause容器,为Pod指派一个唯一的IP地址。然后,以pause的网络命名空间为基础,创建同一个Pod内的其它容器(–net=container:xxx)。因此,同一个Pod内的所有容器就会共享同一个网络命名空间,在同一个Pod之间的容器可以直接使用localhost进行通信。

二、Pod-Pod通信原理解析

flannel会在每一个宿主机上运行名为flanneld代理,其负责为宿主机预先分配一个子网,并为Pod分配IP地址。同时,Flannel使用etcd来存储网络配置、分配的子网和主机公共IP等信息。数据包则通过VXLAN、UDP或host-gw等转发类型的后端机制进行数据转发。

1、在同一个Node节点中不同Pod间通信


k8s设置ClusterIP范围 k8s clusterip原理_grpc通信原理


(1)查看k8s-node-1中Pod运行状态


k8s设置ClusterIP范围 k8s clusterip原理_IP_02


(2)查看k8s-node-1的IP地址以及路由


k8s设置ClusterIP范围 k8s clusterip原理_k8s设置ClusterIP范围_03


k8s设置ClusterIP范围 k8s clusterip原理_IP_04


(3)查看k8s-node-1中Pod的IP地址


k8s设置ClusterIP范围 k8s clusterip原理_grpc通信原理_05


Pod-1:


k8s设置ClusterIP范围 k8s clusterip原理_IP_06


Pod-2:


k8s设置ClusterIP范围 k8s clusterip原理_grpc通信原理_07


(4)测试连通性


k8s设置ClusterIP范围 k8s clusterip原理_IP_08


2、在不同Node节点间不同Pod间通信


k8s设置ClusterIP范围 k8s clusterip原理_IP_09


(1)查看Pod运行状态


k8s设置ClusterIP范围 k8s clusterip原理_grpc通信原理_10


(2)查看Node节点上的IP地址:

K8s-Node-1:


k8s设置ClusterIP范围 k8s clusterip原理_IP_11


K8s-Node-2:


k8s设置ClusterIP范围 k8s clusterip原理_通信原理_12


(3)查看k8s-Node-1的Pod-1和k8s-Node-2的Pod-3的IP地址

Pod-1:


k8s设置ClusterIP范围 k8s clusterip原理_k8s设置ClusterIP范围_13


Pod-3:


k8s设置ClusterIP范围 k8s clusterip原理_grpc通信原理_14


(4)测试连通性


k8s设置ClusterIP范围 k8s clusterip原理_Pod_15


三、Pod-Service通信原理解析

Service是Kubernetes中最核心的概念,正是因为对此概念的支持,Kubernetes在某种角度下可以被看成是一种微服务平台。Kubernetes中的pod并不稳定,比如由ReplicaSet、Deployment、DaemonSet等副本控制器创建的pod,其副本数量、pod名称、pod所运行的节点、pod的IP地址等,会随着集群规模、节点状态、用户缩放等因素动态变化。Service是一组逻辑pod的抽象概念,分配一个虚拟网络,为一组pod提供统一入口,用户只需与service打交道,service提供DNS解析名称,负责追踪pod动态变化并更新转发表,通过负载均衡算法最终将流量转发到后端的pod。

创建一个service时,相应会创建一个指向这个service的域名,域名规则为{服务名}.{namespace}.svc.{集群名称}。全部为iptables维护和转发。iptables则由kubelet维护。service仅支持udp和tcp协议,所以ping的icmp协议是用不了的,无法ping通service ip。


k8s设置ClusterIP范围 k8s clusterip原理_k8s设置ClusterIP范围_16


1、查看DNS


k8s设置ClusterIP范围 k8s clusterip原理_k8s设置ClusterIP范围_17


2、查看Pod


k8s设置ClusterIP范围 k8s clusterip原理_IP_18


3、查看service


k8s设置ClusterIP范围 k8s clusterip原理_IP_19


4、查看service详细信息


k8s设置ClusterIP范围 k8s clusterip原理_Pod_20


四、Pod与外部通信原理

1、Pod访问外部

(1)查看Pod的解析记录


k8s设置ClusterIP范围 k8s clusterip原理_Pod_21


(2)查看去外网的路由表


k8s设置ClusterIP范围 k8s clusterip原理_k8s设置ClusterIP范围_22


(3)测试与外网的连通性


k8s设置ClusterIP范围 k8s clusterip原理_k8s设置ClusterIP范围_23


2、外部访问内部群集

将服务暴露给外部客户端,以便外部访问kubernetes群集。方法有很多种,在这里介绍以下两种方式以便理解去原理:

(1)将服务的类型设置成NodePort

NodePort 服务是引导外部流量到你的服务的最原始方式。NodePort,正如这个名字所示,在所有节点(虚拟机)上开放一个特定端口,任何发送到该端口的流量都被转发到对应服务。


k8s设置ClusterIP范围 k8s clusterip原理_IP_24


(2)将服务的类型设置成LoadBalance

LoadBalancer 服务是暴露服务到 internet 的标准方式。在 GKE 上,这种方式会启动一个Network Load Balancer,它将给你一个单独的 IP 地址,转发所有流量到群集中的服务。kubernetes默认应用此方式。所有通往你指定的端口的流量都会被转发到对应的服务。它没有过滤条件,没有路由等。这意味着你几乎可以发送任何种类的流量到该服务,像 HTTP,TCP,UDP,Websocket,gRPC 或其它任意种类。

这个方式的最大缺点是每一个用LoadBalancer暴露的服务都会有它自己的IP地址,每个用到的LoadBalancer都需要付费,这将是非常昂贵的。


k8s设置ClusterIP范围 k8s clusterip原理_通信原理_25


1、查看service相信信息


k8s设置ClusterIP范围 k8s clusterip原理_k8s设置ClusterIP范围_26


2、从外部访问内部Pod资源


k8s设置ClusterIP范围 k8s clusterip原理_k8s设置ClusterIP范围_27


k8s设置ClusterIP范围 k8s clusterip原理_grpc通信原理_28