作者:Kasar 2020-09-23 14:20:07
云计算 通过我们对各种容器网络模型的实现原理已经有了基本的认识,然而真正将容器技术发扬光大的是Kubernetes容器编排平台。Kubernetes通过整合规模庞大的容器实例形成集群,这些容器实例可能运行在异构的底层网络环境中,如何保证这些容器间的互通是实际生产环境中首要考虑的问题之一。
创新互联是一家专业提供秭归企业网站建设,专注与网站设计制作、网站设计、HTML5建站、小程序制作等业务。10年已为秭归众多企业、政府机构等服务。创新互联专业的建站公司优惠进行中。
通过我们对各种容器网络模型的实现原理已经有了基本的认识,然而真正将容器技术发扬光大的是Kubernetes容器编排平台。Kubernetes通过整合规模庞大的容器实例形成集群,这些容器实例可能运行在异构的底层网络环境中,如何保证这些容器间的互通是实际生产环境中首要考虑的问题之一。
Kubernetes网络基本要求
Kubernetes对容器技术做了更多的抽象,其中最重要的一点是提出pod的概念,pod是Kubernetes资源调度的基本单元,我们可以简单地认为pod是容器的一种延伸扩展,从网络的角度来看,pod必须满足以下条件:
基于这样的基本要求,我们可以知道:
事实上,Kubernetes进一步确定了对一个合格集群网络的基本要求:
也就是说,必须同时满足以上三点的网络模型才能适用于kubernetes,事实上,在早期的Kubernetes中,并没有什么网络标准,只是提出了以上基本要求,只有满足这些要求的网络才可以部署Kubernetes,基于这样的底层网络假设,Kubernetes设计了pod-deployment-service的经典三层服务访问机制。直到1.1发布,Kubernetes才开始采用全新的CNI(Container Network Interface)网络标准。
CNI
其实,我们在前面介绍容器网络的时候,就提到了CNI网络规范,CNI相对于CNM(Container Network Model)对开发者的约束更少,更开放,不依赖于Docker。事实上,CNI规范确实非常简单,详见:https://github.com/containernetworking/cni/blob/master/SPEC.md
实现一个CNI网络插件只需要一个配置文件和一个可执行的文件:
Kubernetes使用CNI网络插件的基本工作流程:
如果不清楚什么是pause容器,它在pod中处于什么样的位置,请查看之前的笔记:https://morven.life/notes/from-container-to-pod/
pod网络模型
要了解kubernetes网络模型的实现原理,我们就要从单个pod入手,事实上,一旦熟悉了单个pod的网络模型,就会发现kubernetes网络模型基本遵循和容器网络模型一样的原理。
通过前面的笔记从docker容器到pod,我们知道pod启动的时候先创建pause容器生成对应的netns网络命名空间,然后其他容器共享pause容器创建的网络命名空间。而对于单个容器的网络模型我们之前也介绍过,主要就是通过docker0网桥设备与veth设备对连接不同的容器网络命名空间,由此,我们可以得到如下图所示的单个pod网络模型的创建过程:
可以看到,同一个pod里面的其他容器共享pause容器创建的网络命名空间,也就是说,所有的容器共享相同的网络设备,路由表设置,服务端口等信息,仿佛是在同一台机器上运行的不同进程,所以这些容器之间可以直接通过localhost与对应的端口通信;对于集群外部的请求,则通过docker0网桥设备充当的网关,同时通过iptables做地址转换。我们会发现,这其实就是对当个容器的bridge网络模型的扩展。
主流kubernetes网络方案
上一小节我们知道单个pod的网络模型是容器网络模型的扩展,但是pod与pod之间的是怎么相互通信的呢?这其实与容器之间相互通信非常类似,也分为同一个主机上的pod之间与跨主机的pod之间两种。
如容器网络模型一样,对于统一主机上的pod之间,通过docker0网桥设备直接二层(数据链路层)网络上通过MAC地址直接通信:
而跨主机的pod之间的相互通信也主要有以下两个思路:
修改主机路由:把容器网络加到主机路由表中,把主机网络设备当作容器网关,通过路由规则转发到指定的主机,实现容器的三层互通。目前通过路由技术实现容器跨主机通信的网络如Flannel host-gw、Calico等;
下面简单介绍几种主流的方案:
下表是几种主流Kubernetes网络方案的对比:
- | A | Overlay-Network | Host-RouteTable | NetworkPolicy Support | Decentralized IP Allocation | | – | — | — | — | — | | Flannel | UDP/VXLAN | Host-GW | N | N | | Weave | UDP/VXLAN | N/A | Y | Y | | Calico | IPIP | BGP | Y | N |
策略控制(Network Policy)
Network Policy)是Kubernetes提供的基于策略的网络控制,用于隔离应用并提高安全性。它使用Kubernetes中常用的标签选择器模拟传统的分段网络,并通过策略控制它们之间的东西流量以及与外部交流的南北流量。
下面的例子是配置一个典型的Network Policy的实例:
- apiVersion: networking.k8s.io/v1
- kind: NetworkPolicy
- metadata:
- name: test-network-policy
- namespace: default
- spec:
- podSelector:
- matchLabels:
- role: db
- policyTypes:
- - Ingress - Egress ingress:
- - from:
- - ipBlock:
- cidr: 172.17.0.0/16
- except:
- - 172.17.1.0/24
- - namespaceSelector:
- matchLabels:
- project: myproject
- - podSelector:
- matchLabels:
- role: frontend
- ports:
- - protocol: TCP
- port: 6379
- egress:
- - to:
- - ipBlock:
- cidr: 10.0.0.0/24
- ports:
- - protocol: TCP
- port: 5978
它使用标签选择器namespaceSelector与posSelector控制pod之间的流量,流量的行为模式主要由以下三个对象决定:
通过使用Network Policy可以实现对进出流的精确控制,它采用各种选择器(标签或namespace),找到一组满足条件的pod,或者找到相当于通信的两端,然后通过流量的特征描述来决定它们之间是不是可以连通,可以理解为一个白名单的机制。
本文名称:浅析Kubernetes网络模型
当前URL:http://www.csdahua.cn/qtweb/news45/506345.html
网站建设、网络推广公司-快上网,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 快上网