![247982d2a2631f1999b1315b8384fc77.gif](https://i-blog.csdnimg.cn/blog_migrate/7a600c139c2f810a66dc2fa53afc1d5c.gif)
本章节主要学习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间通信
![d1a1e0aa4ec22e4ac985eb26fb470c46.png](https://i-blog.csdnimg.cn/blog_migrate/10cc24bd53dcb3003bed853d4657ff88.jpeg)
(1)查看k8s-node-1中Pod运行状态
![bea269a53537017721d3bcba04ad8d35.png](https://i-blog.csdnimg.cn/blog_migrate/f06b35ec0be3576bc380892398b1fd25.jpeg)
(2)查看k8s-node-1的IP地址以及路由
![2ac50bd4f6100af3533dcbd5dabce9aa.png](https://i-blog.csdnimg.cn/blog_migrate/ef6f6232953355c4f29b2e53c00c2f73.jpeg)
![af4dfe2d4260e9fa236b7474dac99192.png](https://i-blog.csdnimg.cn/blog_migrate/7d5d6e49d366ab62316611488f4365ce.jpeg)
(3)查看k8s-node-1中Pod的IP地址
![1c77b031e5f4e52b3ed79c408470c614.png](https://i-blog.csdnimg.cn/blog_migrate/a15532976180085f62450ca1a4daf598.jpeg)
Pod-1:
![233332436e99431af896b39651aa2570.png](https://i-blog.csdnimg.cn/blog_migrate/12db070c75ee13c7f8d2fe8f9173c671.jpeg)
Pod-2:
![26124f63a32ef8c2e2c51cd72eeee1dc.png](https://i-blog.csdnimg.cn/blog_migrate/43f6ca31407bd47a9db3a4ae08f6ef52.jpeg)
(4)测试连通性
![0fb18197286a15a1b9c0377cd2ec9065.png](https://i-blog.csdnimg.cn/blog_migrate/d23d4bb0a8a52aa238117699682405a0.jpeg)
2、在不同Node节点间不同Pod间通信
![7f9ff0c4d5fa1d0c97759cc7e4ee5ab7.png](https://i-blog.csdnimg.cn/blog_migrate/24e8296d4328baef6aea2d1c6f7e5774.jpeg)
(1)查看Pod运行状态
![63f6a5bf2a11319dafd291caeee4b283.png](https://i-blog.csdnimg.cn/blog_migrate/8b62d80047136181f4065122a7670c5c.jpeg)
(2)查看Node节点上的IP地址:
K8s-Node-1:
![99cae995c9a7b5fa72529d154f36fbc1.png](https://i-blog.csdnimg.cn/blog_migrate/53df4c2f519c123003890545fe4bcd5d.jpeg)
K8s-Node-2:
![8b9f6fa378b21757049a8babf8989816.png](https://i-blog.csdnimg.cn/blog_migrate/b52abd1b7e50e8fd67383323e63a5b89.jpeg)
(3)查看k8s-Node-1的Pod-1和k8s-Node-2的Pod-3的IP地址
Pod-1:
![34d9ec2b77ded358d1fa26361881656e.png](https://i-blog.csdnimg.cn/blog_migrate/cda8f6da1a1b8f37755d2a148b8f2d2b.jpeg)
Pod-3:
![dfe2533b273671ebeac6d2604bbf9a38.png](https://i-blog.csdnimg.cn/blog_migrate/21bbbcf13d2941913f32ce22f6bb7de4.jpeg)
(4)测试连通性
![0a99a47e12de467630e4c09c341b56b8.png](https://i-blog.csdnimg.cn/blog_migrate/ba3bc4be3f0b601976af80e25aedb374.jpeg)
三、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。
![ce4e393e70260480c94ba60691625c0d.png](https://i-blog.csdnimg.cn/blog_migrate/9abd9bb51de221be60f9f16ab421080d.jpeg)
1、查看DNS
![791f5b0f3f74b48987eb0f55c02afa22.png](https://i-blog.csdnimg.cn/blog_migrate/d4a3e29313f5a0eed8a874f2882bac42.jpeg)
2、查看Pod
![5f0f76917bc061c59e0d735df2daf475.png](https://i-blog.csdnimg.cn/blog_migrate/cea11d7da8cd2674970f982030b90c00.jpeg)
3、查看service
![70b95fc3ea77c2a76b129e721f388145.png](https://i-blog.csdnimg.cn/blog_migrate/51e78019655ad9f93bd5e9f5c4046814.jpeg)
4、查看service详细信息
![2b7c2d8a5ae74bb14039b960d9db4912.png](https://i-blog.csdnimg.cn/blog_migrate/cdffabbe9cf781c1c886d3e504ecf3bf.jpeg)
四、Pod与外部通信原理
1、Pod访问外部
(1)查看Pod的解析记录
![2cf73166d1b0bea9511525f7365ba4df.png](https://i-blog.csdnimg.cn/blog_migrate/b7f56315ea25187b6e470f10a49d570d.jpeg)
(2)查看去外网的路由表
![49272c37aa89529180a09801a39ce8a4.png](https://i-blog.csdnimg.cn/blog_migrate/d5f09e614226f028907d83ad03c8f435.jpeg)
(3)测试与外网的连通性
![605614eca696994b9b8518c0d21d9760.png](https://i-blog.csdnimg.cn/blog_migrate/40be86f93e04516c1f0dffc62c1eddfa.jpeg)
2、外部访问内部群集
将服务暴露给外部客户端,以便外部访问kubernetes群集。方法有很多种,在这里介绍以下两种方式以便理解去原理:
(1)将服务的类型设置成NodePort
NodePort 服务是引导外部流量到你的服务的最原始方式。NodePort,正如这个名字所示,在所有节点(虚拟机)上开放一个特定端口,任何发送到该端口的流量都被转发到对应服务。
![c2eaff1cfdc2587e76554d4d2ef563e4.png](https://i-blog.csdnimg.cn/blog_migrate/36def8093185d200d8291b63abc99ed7.jpeg)
(2)将服务的类型设置成LoadBalance
LoadBalancer 服务是暴露服务到 internet 的标准方式。在 GKE 上,这种方式会启动一个Network Load Balancer,它将给你一个单独的 IP 地址,转发所有流量到群集中的服务。kubernetes默认应用此方式。所有通往你指定的端口的流量都会被转发到对应的服务。它没有过滤条件,没有路由等。这意味着你几乎可以发送任何种类的流量到该服务,像 HTTP,TCP,UDP,Websocket,gRPC 或其它任意种类。
这个方式的最大缺点是每一个用LoadBalancer暴露的服务都会有它自己的IP地址,每个用到的LoadBalancer都需要付费,这将是非常昂贵的。
![e0155cfefae832619257510d5fd3199e.png](https://i-blog.csdnimg.cn/blog_migrate/ecac0fe8a10bad420a350dd81f5e9eaa.jpeg)
1、查看service相信信息
![27a2e25764a6fa7367c7ef073eabe4f8.png](https://i-blog.csdnimg.cn/blog_migrate/c2b9532bf6dcb1c81e225e2ce3ce49d6.jpeg)
2、从外部访问内部Pod资源
![72153f92e139112aa7ad476dfac618c8.png](https://i-blog.csdnimg.cn/blog_migrate/c087a21b6e3a7b9d8f13f5dd0ea1e19c.jpeg)
![bc9568092ef15893016d82388e882721.png](https://i-blog.csdnimg.cn/blog_migrate/a8c4479a63a4a985a02633c098a793de.jpeg)
![54cf4039287ba699f14e1368c61ccbd2.png](https://i-blog.csdnimg.cn/blog_migrate/edc58862853d2ee7c97aa2e29dcb9994.jpeg)