本章节主要学习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间通信
(1)查看k8s-node-1中Pod运行状态
(2)查看k8s-node-1的IP地址以及路由
(3)查看k8s-node-1中Pod的IP地址
Pod-1:
Pod-2:
(4)测试连通性
2、在不同Node节点间不同Pod间通信
(1)查看Pod运行状态
(2)查看Node节点上的IP地址:
K8s-Node-1:
K8s-Node-2:
(3)查看k8s-Node-1的Pod-1和k8s-Node-2的Pod-3的IP地址
Pod-1:
Pod-3:
(4)测试连通性
三、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。
1、查看DNS
2、查看Pod
3、查看service
4、查看service详细信息
四、Pod与外部通信原理
1、Pod访问外部
(1)查看Pod的解析记录
(2)查看去外网的路由表
(3)测试与外网的连通性
2、外部访问内部群集
将服务暴露给外部客户端,以便外部访问kubernetes群集。方法有很多种,在这里介绍以下两种方式以便理解去原理:
(1)将服务的类型设置成NodePort
NodePort 服务是引导外部流量到你的服务的最原始方式。NodePort,正如这个名字所示,在所有节点(虚拟机)上开放一个特定端口,任何发送到该端口的流量都被转发到对应服务。
(2)将服务的类型设置成LoadBalance
LoadBalancer 服务是暴露服务到 internet 的标准方式。在 GKE 上,这种方式会启动一个Network Load Balancer,它将给你一个单独的 IP 地址,转发所有流量到群集中的服务。kubernetes默认应用此方式。所有通往你指定的端口的流量都会被转发到对应的服务。它没有过滤条件,没有路由等。这意味着你几乎可以发送任何种类的流量到该服务,像 HTTP,TCP,UDP,Websocket,gRPC 或其它任意种类。
这个方式的最大缺点是每一个用LoadBalancer暴露的服务都会有它自己的IP地址,每个用到的LoadBalancer都需要付费,这将是非常昂贵的。
1、查看service相信信息
2、从外部访问内部Pod资源