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

网友投稿 908 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 三层组网模型

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

同节点内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 方案说明

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

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

将每个节点的容器子网路由配置到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
相关文章