【云驻共创】华为云云原生之Kubernetes网络架构原理深度剖析(上)

网友投稿 864 2022-05-30

前言

kubernetes网络和服务的概念与使用场景主要有以下两点:

Service概念及使用场景

Ingress概念及使用场景

本文主要介绍

Kubernetes工作负载POD之间的互通、负载均衡等网络功能是如何实现的

kubernetes容器网络模型,Service负载均衡机制、CNI接口的实现原理以及若干实践案例

一、Kubernetes诞生背景

1.云原生的概念

云原生是基于分布式部署和统一运维管理的分布式云,以容器、微服务、DevOps等技术为基础建立的一套云技术产品体系。是一种新型技术体系,是云计算未来的发展方向。

云原生应用也就是面向“云”而设计的应用,在使用云原生技术后,开发者无需考虑底层的技术实现,可以充分发挥云平台的弹性和分布式优势,实现快速部署、按需伸缩、不停机交付等。

云原生(CloudNative)是一个组合词,Cloud+Native。Cloud表示应用程序位于云中,而不是传统的数据中心;Native表示应用程序从设计之初即考虑到云的环境,原生既为云而设计,在云上以最佳姿势运行,充分利用和发挥云平台的弹性+分布式优势。

2.云原生架构

云原生架构归纳为模块化、可观察、可部署、可测试、可替换、可处理6特质;而Pivotal最新官网对云原生概括为4个要点:DevOps+持续交付+微服务+容器。

微服务: 几乎每个云原生的定义都包含微服务,跟微服务相对的是单体应用,微服务有理论基础,那就是康威定律,指导服务怎么切分,很玄乎,凡是能称为理论定律的都简单,但明白不了,不然就太没逼格,大概意思是组织架构决定产品形态。

微服务架构的好处就是按功能划分之后,形成服务,服务之间解耦,内聚更强,变更更易;另一个划分服务的技巧是依据DDD来划分。

容器化: Docker是应用最为广泛的容器引擎,在思科谷歌等公司的基础设施中大量使用,是基于LXC技术搞的,容器化为微服务提供实施保障,起到应用隔离作用,K8S是容器编排系统,用于容器管理,容器间的负载均衡,谷歌搞的,Docker和K8S都采用Go编写,都是不错的技术。

DevOps: 这是个组合词,Dev+Ops,就是开发和运维合体,不像开发和产品,经常刀刃相见,实际上DevOps应该还包括测试,DevOps是一个敏捷思维,是一个沟通文化,也是组织形式,为云原生提供持续交付能力。

持续交付: 持续交付是不误时开发,不停机更新,小步快跑,反传统瀑布式开发模型,这要求开发版本和稳定版本并存,其实需要很多流程和工具支撑。

3.Kubernetes(k8s)

Kubernetes(k8s)是云原生架构体系中不可缺少的一环,是一个全新的基于容器技术的分布式架构领先方案。

Kubernetes(k8s)是Google开源的容器集群管理系统。在Docker技术的基础上,为容器化的应用提供部署运行、资源调度、服务发现和动态伸缩等一系列完整功能,提高了大规模容器集群管理的便捷性。

Kubernetes(k8s)是一个完备的分布式系统支撑平台,具有完备的集群管理能力,多扩展多层次的安全防护和准入机制、多租户应用支撑能力、透明的服务注册和发现机制、內建智能负载均衡器、强大的故障发现和自我修复能力、服务滚动升级和在线扩容能力、可扩展的资源自动调度机制以及多粒度的资源配额管理能力。同时Kubernetes(k8s)提供完善的管理工具,涵盖了包括开发、部署测试、运维监控在内的各个环节。

二、Kubernetes基本网络模型剖析

1.概念理清

1.1 二层桥接 VS 三层路由

1.2 Underlay VS Overlay

1.3 物理网络 VS 虚拟网络

1.4 传统网络 VS SDN网络

1.5 Docker网络 VS K8S网络

Docker 采用插件化的网络模式,默认提供bridge、host、none、overlay、maclan和Network plugins这几种网络模式,运行容器时可以通过--net参数设置具体使用那一种模式。

bridge: 这是Docker默认的网络驱动,此模式会为每一个容器分配Network Namespace和设置IP等,并将容器连接到一个虚拟网桥上。如果未指定网络驱动,则默认使用此驱动。

host: 此网络驱动直接使用宿主机的网络。

none: 此驱动不构造网络环境。采用了none网络驱动,那么就只能使用loopback网络设备,容器只能使用127.0.0.1的本机网络。

overlay: 此网络驱动可以使多个Docker daemons连接在一起,并能够使用swarm服务之间进行通讯。也可以使用overlay网络进行swarm服务和容器之间的通讯。

macvlan: 此网络允许为容器指定一个MAC地址,允许容器作为网络中的物理设备,这样Docker daemon就可以通过MAC地址进行访问的路由。对于希望直接连接网络的应用,这种网络驱动有时可能是最好的选择。

Network plugins: 可以安装和使用第三方的网络插件。可以在Docker Store或第三方供应商处获取这些插件。

在默认情况,Docker使用bridge网络模式,bridge网络驱动的示意图如下,此文以bridge模式对Docker的网络进行说明。

实际上Docker是采用NAT的方式,将容器内部的服务监听端口与宿主机的某一个端口port进行绑定,使得宿主机外部可以将网络报文发送至容器。

1)通过-p参数,将容器的端口映射到宿主机的随机端口:

2)通过-d参数,以守护进程方式运行:

2)通过–net参数,指定网络:

docker run -d -p {hostPort}:{containerPort} {images} --net={network}

K8S网络与Docker网络有些不同。K8S网络需要解决下面的4个问题:

集群内:

容器与容器之间的通信

Pod和Pod之间的通信

Pod和服务之间的通信

集群外:

外部应用与服务之间的通信

2.K8S网络模型对互通性的要求

节点node网络互通性的要求:

节点上的容器POD可以与集群内任意节点上的容器POD进行通信,无需NAT,就能实现互相访问

节点上的代理agent(比如:系统后台进程、kubelet)可以与同节点上的容器POD互相访问

对于支持容器POD的主机网络模式运行的平台(如:Linux)互通性的要求:

主机网络模式的容器POD可以与集群内任意节点上的容器POD进行通信,无需NAT,就能实现互相访问

3.K8S网络模型

3.1 Overlay组网模型

同节点内POD二、三层直接互通

跨节点POD互通通过隧道(VXLAN/IPIP)

POD访问宿主节点地址或集群外地址需SNAT

与底层网络解耦,节点IP互通

隧道封装解封装开销大,小包带宽损耗可达30%+,互通性差,地址需SNAT

Flannel/VXLAN,Calico/IPIP,CCE隧道网络

3.2 二层组网模型

容器和宿主节点属于同一子网

宿主节点间要求二层互通(物理网络)

扁平网络,容器与节点具有同等互通能力

规模扩展受子网限制

要求节点网络二层广播域开放

桥接模式转发性能较差

Azure CNI,Rancher扁平网络,CCEUnderlay L2

3.3 三层组网模型

【云驻共创】华为云云原生之Kubernetes网络架构原理深度剖析(上)

按节点掩码长度,给每个节点分配容器子网

同节点内POD二、三层直接互通

跨节点POD互通通过本地路由表及节点网络路由转发

POD访问宿主节点地址无需SNAT

无隧道开销,互通性好

规模扩展性高

需要对接节点网络,支持BGP协议或路由配置接口

Calico Native,CCE VPC路由

三、K8S Service负载均衡机制实现原理

1.IPTables

1.1 方案说明

利用linux内核原生Netfilter/IPTable的HOOK/Chain及Conntrack连接状态机制,实现NAT和负载均衡

1.2 优势

内核原生能力,经历了长期的考验,稳定性好(k8s1.2开始作为default方案)

易于与不同容器网络模型集成

1.3 劣势

线性遍历查表机制,造成大规模规则场景下,新建连接开销大

大规模规则刷新较慢

负载均衡算法相对少,均衡效果较差

2.IPVS

2.1 方案说明

基于内核负载均衡模块IPVS,实现NAT和负载均衡。

2.2 优势

专用负载均衡方案,基于IPSet/Hash查表机制,性能高(k8s1.11GA,由华为云原生容器团队贡献给K8S社区)

负载均衡算法丰富,均衡性好(round-robin,min connection etc)

规模扩展性好,规则数对匹配性能影响小和刷新规则快

2.3 劣势

原始设计针对南北向边界负载均衡,对于分布式东西向某些特殊访问场景存在限制

仍然依赖IPTables+Conntrack实现MASQUADE(SNAT)

3.eBPF

3.1 方案说明

基于高内核版本eBPF机制

东西向采用Socket Layer LB机制实现,支持会话保持

南北向采用XDP/TCBPF实现负载均衡/NAT和状态表

3.2 优势

适合容器场景,转发路径短,最大开销下降可达80%

3.3 劣势

内核版本要求社区内核5.7+

缺乏大规模的商用检验,处于快速迭代过程,社区不断有新patch合入

负载均衡算法待增强和丰富

3.4 典型方案

Cilium,Calico

四、华为云CCE Yangtse网络模型

1.VPC 路由模式

1.1 方案说明

按照创建集群时设定的节点长度为节点分配容器子网

将每个节点的容器子网路由配置到VPC路由表

1.2 优势

无隧道开销,转发性能与主机网络持平

VPC内节点与容器互通无SNAT,支持源地址保持

1.3 劣势

集群规模受限于VPC路由表规格,比如:200

互通性受限:

需要通过nodeport对接ELB后端,存在多跳损耗,负载均衡性差

访问OBS或外网等服务需要SNAT为节点地址

2.ENI/TrunkPort

2.1 方案说明

容器网络与VPC网络一体化融合方案,充分利用VPC网络的软硬协同和分布式架构为容器提供云原生的规模扩展、极致弹性、负载均衡和安全隔离能力。

每个容器POD具有独立的VPC子网地址,统一IPAM(节点容器、服务子网统一管理)

BMS节点支持128个VF直通网口到容器POD

虚机节点Trunkport模式ENI,最多支持创建256个VLAN子接口直通容器POD

每个POD具有独立的安全组,支持容器粒度的网络隔离

POD间互访不经过节点root namespace,直通模式转发0损耗

不再依赖节点内核,IPVS/IPTables实现Service负载均衡,不再需要kube-proxy组件,service负载均衡卸载到VPC分布式ELB

裸机容器支持POD级网络QoS极简组网,运维更简单

总结

在微服务化情况下,容器数量会非常多,不利于管理和编排。kubernetes诞生得益于kubernetes网络架构设计,使得管理容器,持续集成和容器编排问题都能很好解决。

本文介绍的内容主要有:云原生、K8S容器网络模型原理、K8SService负载均衡实现原理、华为CCEYangtse容器网络模型和原理。通过以上讲解相信大家对Kubernetes网络架构有所理解,对华为云CCE Yangtse网络模型也有初步的认识,这是上半部部分,别忘了还有下半部分,还请大家多多支持。

华为云官网链接:

https://support.huaweicloud.com/usermanual-cce/cce_01_0249.html

https://support.huaweicloud.com/usermanual-cce/cce_01_0094.html

Kubernetes官方文档:

https://kubernetes.io/docs/concepts/services-networking/servicel

https://kubernetes.io/docs/concepts/services-networking/ingress

本文整理自华为云社区【内容共创】活动第13期。

查看活动详情:https://bbs.huaweicloud.com/blogs/330939

相关任务详情:任务23.华为云云原生钻石课程06:Kubernetes网络架构原理深度剖析(上)

Kubernetes 云原生 容器 网络

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:【NumPy】常用姿势积累
下一篇:【SpringCloud-Alibaba系列教程】8.一文学会使用sentinel
相关文章