Kubernetes容器网络模型解析
2021-11-18 23:00:22云原生(Cloud Native)可以认为是一套技术体系或生态,它包含2大部分:云(Cloud)和原生(Native)。
云原生(Cloud Native)可以认为是一套技术体系或生态,它包含2大部分:云(Cloud)和原生(Native)。云(Cloud)表示应用程序位于云中,而不是传统的数据中心;原生(Native)表示应用程序从设计之初即考虑到云的环境,原生为云而设计,在云上以最佳状态运行,充分利用和发挥云平台的弹性和分布式优势。
Kubernetes基于扁平地址空间,非NAT的网络结构,无需在主机和容器之间映射端口。此网络模型的主要特点是消除了在主机和容器之间映射端口的需求。我们先看下其总体架构拓扑模型:
在容器网络中主要涉及以下几个地址:
容器网络流量模型
1、POD内容器间通信
Pod中的容器可以通过“localhost”来互相通信,他们使用同一个网络命名空间,对容器自身来说,hostname就是其Pod的名称。Pod中的所有容器共享同一个IP地址和端口空间,你需要为每个需要接收连接的容器分配不同的端口。也就是说,Pod中的应用需要自己协调端口的使用。
内部实现机制:同Pod内的容器实际共享同一个Namespace,因此使用相同的Ip和Port空间,该Namespace 是由一个叫Pause的小容器来实现,每当一个Pod被创建,那么首先创建一个pause容器,之后这个Pod里面的其他容器通过共享这个pause容器的网络栈,实现外部Pod进行通信,因此对于同Pod里面的所有容器来说,他们看到的网络视图是一样的,我们在容器中看的地址,也就是Pod地址实际是Pause容器的IP地址。总体模型如下:
2、同主机POD间通信
每个节点上的每个Pod都有自己的Namespace,同主机上的Pod之间怎么通信呢?我们可以在两个Pod之间建立Vet Pair进行通信,但如果有多个容器,两两建立Veth 就会非常麻烦,假如有N 个Pod ,那么我们需要创建n(n-1)/2个Veth Pair,扩展性非常差,如果我们可以将这些Veth Pair 连接到一个集中的转发点,由它来统一转发就就会非常便捷,这个集中转发点就是我们常说的Bridge,如下所示
3、跨主机POD间通信
对于网络上两个端点之间的互通目前主要有两种方案:一种是基于Underlay 直接互通,此模式需要双方有彼此的路由信息并且该路由信息在underlay的路径上存在。一种是基于Overlay 方案,通过隧道实现互通。Underlay 层面保证主机可达即可,代表网络方案有 Calico(Direct模式)和Macvlan,后者有Overlay,OVS,Flannel和Weave。本篇仅针对Flannel 和Calico 插件进行简要介绍。
Flannel插件
Flannel是由CoreOS开发的项目,是容器编排系统中最成熟的网络结构示例之一,旨在实现更好的容器间和主机间网络。
与其他方案相比,Flannel相对容易安装和配置。它被打包为单个二进制文件Flanneld,许多常见的Kubernetes集群部署工具和许多Kubernetes发行版都可以默认安装Flannel。Flannel可以使用Kubernetes集群的现有Etcd集群来使用API存储其状态信息,因此不需要专用的数据存储。其工作流程图如下:
基本流程为:
1、地址分配
Flanneld 第一次启动时,从 etcd 获取配置的 Pod 网段信息,为本节点分配一个未使用的地址段,然后创建 flannedl.1 网络接口(也可能是其它名称,如 flannel1 等),flannel 将分配给自己的 Pod 网段信息写入 /run/flannel/docker 文件(不同k8s版本文件名存在差异),docker 后续使用这个文件中的环境变量设置 docker0 网桥,从而使这个地址段为本节点的所有。
2、路由下发
每台主机上,Flannel 运行一个Daemon 进程叫flanneld,它可以在内核中创建路由表。
3、数据面封装
Flannel 知道外层封装地址后,对报文进行封装,源采用自己的物理Ip 地址,目的采用对端的,Vxlan 外层的Udp Port 8472(如果是UDP封装使用8285作为默认目的端口,下文会提到),对端只需监控Port 即可,当改端口收到报文后将报文送到Flannedld 进程,进程将报文送到Flanned 接口接封装,然后查询本地路由表获取目的地址。
Flannel功能内部支持三种不同后端实现,分别是:
Calico插件
Calico支持3种路由模式:
本文主要介绍Direct模式,采用软路由建立BGP 宣告容器网段,使得全网所有的Node和网络设备都有到彼此的路由的信息,然后直接通过underlay 转发。Calico实现的总体结构如下:
数据通信的流程为:数据包先从veth设备对另一口发出,到达宿主机上的Cali开头的虚拟网卡上,到达这一头也就到达了宿主机上的网络协议栈,然后查询路由表转发;因为本机通过Bird 和RR 建立Bgp 邻居关系,会将本地的容器地址发送到RR 从而反射到网络其它节点,同样,其它节点的网络地址也会传送到本地,然后由Felix 进程进行管理并下发到路由表中,报文匹配路由规则后正常进行转发即可。至于更为复杂的Iptables规则,因篇幅有限,本次暂不做解析。

4、集群内Service Cluster IP和外部访问
Serice 和外部通信场景实现涉及较多iptables 转发原理,简单介绍如下:
Pod与service通信:Pod间可以直接通过IP地址通信,前提是Pod知道对方的IP。在 Kubernetes集群中,Pod可能会频繁地销毁和创建,也就是说Pod的IP 不是固定的。为了解决这个问题,Service提供了访问Pod的抽象层。无论后端的Pod如何变化,Service都作为稳定的前端对外提供服务。同时,Service还提供了高可用和负载均衡功能,Service负责将请求转 给正确的Pod。
外部通信:无论是Pod的IP还是Service的Cluster IP,它们只能在Kubernetes集群中可见,对集群之外的世界,这些IP都是私有的Kubernetes提供了两种方式让外界能够与Pod通信:
NodePort:Service通过Cluster节点的静态端口对外提供服务,外部可以通过:访问Service。
LoadBalancer:Service利用Cloud Provider提供的Load Balancer对外提供服务,Cloud Provider负责将Load Balancer 的流量导向Service。
蛋糕怎么做最好吃可以在温波炉里烤吗
用微波炉做海绵蛋糕所需材料:低筋面粉 ... 150g细白糖 ... 100g鸡蛋 ... 3个发粉 ... 1大匙鲜奶 ... 1/3杯沙拉油 ... 4大匙作法步骤:取三个三蛋糕模型,内面抹油,薄撒面粉备用。 将鸡蛋打成蛋液后,慢慢加入细白糖,充分搅打至发泡。 面粉过筛后,连同发粉、鲜奶、沙拉油慢慢倒入蛋液中,以橡皮刀轻轻搅拌均匀,分置三个模型中,如有气泡则轻敲模型。 每个蛋糕以强微波烘烤3分钟即成。 备注:1.海绵蛋糕烘烤好后,应立即取出,并以垂直方向轻摔模型,如此蛋糕才不会塌陷且较容易取出。 2.食用时,可依各人喜好淋上少许蜂蜜或果酱。 大理石蛋糕4个份 低筋面粉-- 20g 砂糖--- 2大匙 蛋-- 1个 香草精-- 少许 可可粉、水--各1大匙 1.面粉、砂糖和可可粉分别过筛。 2.将砂糖、蛋和香草精倒入碗里,隔水加热到摸起来微温后用电动蛋器打到2分发。 接著移开热水继续搅拌到材料完全冷却为止。 *如果是用手动的打蛋器隔水加热搅拌,空气会跑进蛋内,很快就会冒出气泡,等颜色转白后即可移开热水,继续以下的步骤。 3.面粉过筛(A),再用打蛋器将之拌匀(B)。 4.可可粉和水倒进另一个碗内,搅拌均匀。 5.将3的一半材料倒入4的碗里拌匀(C)。 6.将双色面糊倒入四个做杯子蛋糕用的铝箔杯中(D),轻轻混拌一下。 7.沿微波炉(600瓦)的旋转架排成一圈,中间不要放,然后盖上烤盘纸加热1分钟。 过30秒后再取出。 如果是500瓦的微波炉,可多加热20秒。 用微波炉做蛋糕!(不需要蛋糕粉) 材料:面粉 100克 干酵粉5克 砂糖30克 黄油45克 牛奶1大勺 奶油香精数滴 1:首先 把鸡蛋和砂糖混合 用打蛋器用力打出泡沫 觉得有厚重感了就可以了 2:将面粉,发酵粉 黄油(事先用微波炉加热融化) 牛奶和奶油香精 一起放进蛋液 用力搅拌均匀 3:把搅拌好的面糊 倒入容器(事先请用黄油擦一遍 才不会沾底) 表面 抹平 然后轻轻的用保鲜膜盖住 放入微波炉加热 期间不时的用竹签刺入 直至竹签上不再沾有液体 就表明已经烤成功了 4:取出烤好的蛋糕 按自己的喜好用鲜奶油 和水果装饰 就可以了 我按照这种方法作了两次,还不错,不过我换了一下,把面粉和干酵母粉换成了自发粉,用水而不是用牛奶。 而且没有盖保鲜膜,我觉得保鲜膜的温度过高不好。 注意蛋糕熟了以后体积膨胀很大,容器要留有比较大空间。 可以在面糊中加上葡萄干或者枣泥等等。 用微波炉做蛋糕 [color=Red]材料:面粉 100克 干酵粉5克 砂糖30克 黄油45克 牛奶1大勺 奶油香精数滴 1:首先 把鸡蛋和砂糖混合 用打蛋器用力打出泡沫 觉得有厚重感了就可以了 2:将面粉,发酵粉 黄油(事先用微波炉加热融化) 牛奶和奶油香精 一起放进蛋液 用力搅拌均匀 3:把搅拌好的面糊 倒入容器(事先请用黄油擦一遍 才不会沾底) 表面 抹平 然后轻轻的用保鲜膜盖住 放入微波炉加热 期间不时的用竹签刺入 直至竹签上不再沾有液体 就表明已经烤成功了 4:取出烤好的蛋糕 按自己的喜好用鲜奶油 和水果装饰 就可以了 也许不如烤箱烤出来的那样松 不过也柔软可口 但是够方便 如果 用鲜奶油和水果装饰了 应该过得去啦! 最重要是心意 微波炉做蛋糕5分钟搞定!
香蕉做什么甜点最好吃?
香蕉蛋糕需要的原料有:香蕉一根(我每次都是两根,hoho),核桃适量,鸡蛋两个,糖100g,牛奶1/4杯,植物油(色拉油,橄榄油)1/4杯,低粉140g,泡打粉1又1/4匙。 香蕉先用刀切成小片,切的越薄越好。 然后用叉子或者调羹初步压碎,接着搅拌成浆状,就好像婴儿食品的感觉。 鸡蛋先初步打散,分三次加入100g糖,打到蛋体发白,略微蓬松就可以了。 粉类过筛,烤箱预热150度。 将香蕉泥,油,牛奶加入鸡蛋内,混合均匀。 将过筛后的粉类加入湿料中,用橡皮刀(或者木头勺子)混合均匀即可。 烤摸内刷上butter,然后铺上烤盘纸。 不过我有点懒了,有时候直接铺纸头,呵呵。 本贴包含图片附件:最后的混合料倒入烤模后,铺上核桃。 我有时候会把切碎的核桃先混合一些到料里,这取决泥喜欢不喜欢吃核桃了,我超级喜欢,呵呵。 150度30分钟,然后调至180度10分钟。 用竹签试过无粘粘的物体,就证明好了。
绿豆沙怎么做啊?
先将绿豆洗净 用开水煮大概20-30分钟左右,这个时候皮就煮开了,然后将豆子倒入凉水中用手搓,去皮后的绿豆煮出来的绿豆沙更好吃哦, 不一定要把所有的皮都去掉,只是皮越少,吃起来越好吃。去皮后 ,就可以用谁继续煮了 ,加入适量的冰糖哦,是冰糖哦,煮到你觉得适合自己的粘稠度就可以了,一般大火10分钟小火煮20分钟左右就差不多了,可以加点莲子进去,也不错哦!
发表评论