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

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

前言

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


Service概念及使用场景

Ingress概念及使用场景

本文主要介绍


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

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

一、Kubernetes诞生背景

1.云原生的概念

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


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

image.png


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


2.云原生架构

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

image.png


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


微服务架构的好处就是按function切了之后,服务解耦,内聚更强,变更更易;另一个划分服务的技巧据说是依据DDD来搞。


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


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


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


3.Kubernetes(k8s)

Kubernetes(k8s)是云原生架构体系中不可缺少的一环,是一个全新的基于容器技术的分布式架构领先方案。Kubernetes(k8s)是Google开源的容器集群管理系统(谷歌内部:Borg)。在Docker技术的基础上,为容器化的应用提供部署运行、资源调度、服务发现和动态伸缩等一系列完整功能,提高了大规模容器集群管理的便捷性。


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


二、Kubernetes基本网络模型剖析

1.概念厘清

1.1 二层桥接 VS 三层路由

image.png


1.2 Underlay VS Overlay

image.png


1.3 物理网络 VS 虚拟网络

image.png

1.4 传统网络 VS SDN网络

image.png


1.5 Docker网络 VS K8S网络

1.5.1 Docker网络

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 的网络进行说明。

image.png


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


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

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

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

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

1.5.2 K8S网络

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


集群内:


容器与容器之间的通信

Pod和Pod之间的通信

Pod和服务之间的通信

集群外:


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

image.png


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

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


节点上的容器POD可以与集群内任意节点上的容器POD无需NAT实现互访

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

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


主机网络模式的容器POD可以与集群内任意节点上的容器POD无需NAT互访

image.png

3.K8S网络模型

3.1 Overlay组网模型

3.1.1 模型特征

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

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

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

3.1.2 优势

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

3.1.3 劣势

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

3.1.4 典型实现

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

image.png

3.2 二层组网模型

3.2.1 组网特点

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

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

3.2.2 优势

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

3.2.3 劣势

规模扩展受子网限制

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

桥接模式转发性能较差

3.2.4 典型方案

Azure CNI, Rancher扁平网络,CCEUnderlay L2

image.png

3.3 三层组网模型

3.3.1 组网特点

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

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

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

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

3.3.2 优势

无隧道开销,互通性好

规模扩展性高

3.3.3 劣势

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

3.3.4 典型方案

Calico Native, CCE VPC路由

image.png

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

1.IPTables

1.1 方案说明

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

1.2 优势

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

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

1.3 劣势

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

大规模规则刷新较慢

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

image.png

image.png



2.IPVS

2.1 方案说明

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

2.2 优势

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

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

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

2.3 劣势

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

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

image.png

image.png




3.eBPF

3.1 方案说明

基于高内核版本eBPF机制

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

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

3.2 优势

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

3.3 劣势

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

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

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

3.4 典型方案

Cilium,Calico

image.png



四、华为云CCE Yangtse网络模型

1.VPC 路由模式

1.1 方案说明

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

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

1.2 优势

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

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

1.3 劣势

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

互通性受限:

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

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

image.png



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 极简组网,运维更简单image.png

总结

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


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

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
5天前
|
运维 Kubernetes Cloud Native
构建高效云原生运维体系:Kubernetes最佳实践
【5月更文挑战第9天】 在动态和快速演变的云计算环境中,高效的运维是确保应用稳定性与性能的关键。本文将深入探讨在Kubernetes环境下,如何通过一系列最佳实践来构建一个高效且响应灵敏的云原生运维体系。文章不仅涵盖了容器化技术的选择与优化、自动化部署、持续集成/持续交付(CI/CD)流程的整合,还讨论了监控、日志管理以及灾难恢复策略的重要性。这些实践旨在帮助运维团队有效应对微服务架构下的复杂性,确保系统可靠性及业务的连续性。
|
23小时前
|
Kubernetes Cloud Native 持续交付
构建高效稳定的云原生应用:容器编排与微服务治理实践
【5月更文挑战第14天】 随着企业数字化转型的深入,云原生技术以其弹性、敏捷和可扩展的特性成为现代应用开发的首选模式。本文将探讨如何通过容器编排工具如Kubernetes以及微服务架构的有效治理,构建和维护高效且稳定的云原生应用。我们将分析容器化技术的优势,并结合案例讨论在多云环境下实现持续集成、持续部署(CI/CD)的最佳实践,同时解决微服务带来的分布式复杂性问题。通过本文的阐述,读者将获得一套提升系统可靠性和业务连续性的策略框架。
4 0
|
1天前
|
Kubernetes 应用服务中间件 Docker
Kubernetes学习-集群搭建篇(二) 部署Node服务,启动JNI网络插件
Kubernetes学习-集群搭建篇(二) 部署Node服务,启动JNI网络插件
|
1天前
|
Kubernetes API 调度
Kubernetes学习-核心概念篇(二) 集群架构与组件
Kubernetes学习-核心概念篇(二) 集群架构与组件
|
7天前
|
Kubernetes Cloud Native 持续交付
【Docker专栏】Kubernetes与Docker:协同构建云原生应用
【5月更文挑战第7天】本文探讨了Docker和Kubernetes如何协同构建和管理云原生应用。Docker提供容器化技术,Kubernetes则负责容器的部署和管理。两者结合实现快速部署、自动扩展和高可用性。通过编写Dockerfile创建镜像,然后在Kubernetes中定义部署和服务进行应用暴露。实战部分展示了如何部署简单Web应用,包括编写Dockerfile、构建镜像、创建Kubernetes部署配置以及暴露服务。Kubernetes还具备自动扩展、滚动更新和健康检查等高级特性,为云原生应用管理提供全面支持。
【Docker专栏】Kubernetes与Docker:协同构建云原生应用
|
9天前
|
Kubernetes Cloud Native 持续交付
构建高效云原生应用:Kubernetes与微服务架构的融合
【5月更文挑战第6天】 在数字化转型的浪潮中,企业正迅速采纳云原生技术以实现敏捷性、可扩展性和弹性。本文深入探讨了如何利用Kubernetes这一领先的容器编排平台,结合微服务架构,构建和维护高效、可伸缩的云原生应用。通过分析现代软件设计原则和最佳实践,我们提出了一个综合指南,旨在帮助开发者和系统架构师优化云资源配置,提高部署流程的自动化水平,并确保系统的高可用性。
29 1
|
9天前
|
Kubernetes Cloud Native Go
Golang深入浅出之-Go语言中的云原生开发:Kubernetes与Docker
【5月更文挑战第5天】本文探讨了Go语言在云原生开发中的应用,特别是在Kubernetes和Docker中的使用。Docker利用Go语言的性能和跨平台能力编写Dockerfile和构建镜像。Kubernetes,主要由Go语言编写,提供了方便的客户端库与集群交互。文章列举了Dockerfile编写、Kubernetes资源定义和服务发现的常见问题及解决方案,并给出了Go语言构建Docker镜像和与Kubernetes交互的代码示例。通过掌握这些技巧,开发者能更高效地进行云原生应用开发。
52 1
|
1天前
|
Kubernetes 安全 API
Kubernetes学习-集群搭建篇(三) Node配置完善和API概述
Kubernetes学习-集群搭建篇(三) Node配置完善和API概述
Kubernetes学习-集群搭建篇(三) Node配置完善和API概述
|
1天前
|
存储 运维 Kubernetes
Kubernetes学习-集群搭建篇(一) 搭建Master结点
Kubernetes学习-集群搭建篇(一) 搭建Master结点
|
3天前
|
存储 运维 监控
Kubernetes 集群的持续监控与性能优化策略
【5月更文挑战第11天】在微服务架构日益普及的当下,Kubernetes 已成为容器编排的事实标准。随着其在不同规模企业的广泛采用,如何确保 Kubernetes 集群的高效稳定运行变得至关重要。本文将探讨一套系统的 Kubernetes 集群监控方法,并结合实践经验分享针对性能瓶颈的优化策略。通过实时监控、日志分析与定期审计的结合,旨在帮助运维人员快速定位问题并提出解决方案,从而提升系统的整体表现。