Skip to main content
开放网络的先行者与推动者—星融元
加入我们技术支持(Support)  TEL:(+86)4000989811

标签: 技术实现

一文揭秘AI智算中心网络流量 – 大模型训练篇


关注星融元


前言:自2017年起,AI模型的规模每半年翻一番,从初代Transformer的6500万增长到GPT-4的1.76万亿,预计下一代大语言模型将达到10万亿规模。另一方面,用于模型训练的数据量持续增长,如C4数据集,原始数据量累计超过9.5PB,每月新增200-300TB,目前经过清洗加工后的数据集大小约38.5 TB,训练样本数364.6M。进一步,随着多模态大模型的兴起,训练数据从单一的文本过渡到图像和视频乃至3D点云,数据规模将是文本数据的1万倍以上。

AI模型的规模巨大并持续快速增长,不仅将带来数据中心流量的指数型增长,独特的流量特征也将为数据中心网络带来崭新的需求。

深入分析AI大模型在训练、推理和数据存储流量将帮助数据中心建设者有的放矢,用更低的成本,更快的速度、更健壮的网络为用户提供更好的服务。

本篇我们将聚焦于介绍AI大模型训练场景下的网络流量,AI推理和数据存储场景会在接下来的文章中呈现,敬请关注。

AI model

AI训练程序首先将模型参数加载到GPU内存中,之后将经历多个epoch(即使用所有训练集对模型进行一次完整训练),每个epoch的处理过程可以简单描述为4步:

  1. 加载训练数据,在每个epoch中,根据batch size将整个数据集分为若干个mini-batch,分批次加载训练数据,直到遍历整个训练数据集。
  2. 训练,包括前向传播、计算损失、反向传播和参数/梯度更新,每个mini-batch都进行上述步骤。
  3. 评估,使用评估数据集对模型的指标进行评估。这一步是可选的,可以在整个训练完成后单独进行,也可以间隔若干个epoch进行一次。
  4. 保存checkpoint,包括模型状态、优化器状态和训练指标等。为了减少存储需求,通常经过多个epoch后保存一次。

在大模型出现之前,整个过程在可在一台AI服务器内部完成,训练程序从服务器本地磁盘读取AI模型和训练集,加载到内存中,完成训练、评估,然后将结果存储回本地磁盘。虽然为了加速训练,也会采用多块GPU同时训练,但所有的I/O均发生在一台AI服务器内部,并不需要网络I/O。

AI大模型训练的网络流量有哪些?

进入大模型时代,AI训练的流量路径和其网络需求发生了巨大变革。

首先是模型的参数规模超出了单个GPU的内存,采用GPU集群协同计算,则需要相互之间通信以交换信息,这类信息包括参数/梯度、中间激活值等。

庞大的数据集被所有GPU共享,需要集中存放到远端的存储服务器中通过网络调用,分批加载到GPU服务器上。此外,定期保存的参数和优化器状态也需要通过存储服务器共享,在每个训练epoch中,都要通过网络读写数据。

由此,AI大模型训练的网络流量可分为以下两类:

  • 第一类是GPU之间同步梯度和中间激活的网络流量,它发生在所有GPU之间,是一种广播式流量,逻辑上需要所有GPU全连接。
  • 第二类是GPU和存储服务器之间的流量,它仅仅发生在GPU和存储服务器之间,是一种单播流量,逻辑上仅需要以存储服务器为中心的星型连接。

并行训练技术

其中,GPU之间的网络流量与传统数据中心内部流量迥然不同,这与AI大模型的训练方法息息相关——并行训练技术。

并行训练:AI智算中心的主要流量来源

当前广泛应用于AI训练并行计算模式主要有以下三类:

数据并行将不同的样本数据分配给不同的GPU,以加快训练速度;用在主机之间
张量并行将模型的参数矩阵划分为子矩阵,并分配到不同的GPU上,以解决内存限制并加速计算。一般用在主机内部。
流水线并行将模型分为多个阶段,每个阶段分配给不同的GPU,以改善内存利用率和资源效率。一般用在主机之间

并行训练

常见的集合通信流量模式(如下图)

Collective communication

1.数据并行(Data Parallelism)

在数据并行时,主要的网络流量来源于梯度同步,它发生在每次mini-batch处理之后,由一个all-reduce操作计算平均值。理想情况下,所有GPU全连接,每个GPU给其它G-1个GPU单独发送数据,共需发送G x(G-1)份数据。

FSDP(完全分片数据并行)是一种改进的数据并行技术,旨在优化内存使用和通信效率。它通过将模型参数和梯度在多个GPU之间分片(shard)存储,实现更高效的内存利用和通信。

在FSDP时,网络流量来自前向传播的参数收集以及反向传播中的梯度同步。

前向传播的参数收集由all-gather操作完成,all-gather的通信复杂度与all-reduce相同。

后向传播的梯度同步由all-reduce操作完成,由于每个GPU的参数只有原来的1/G,一个epoch中总的网络流量只有普通数据并行的1/G。

2.张量并行(Tensor Parallelism)

在张量并行时,模型参数分布到G个GPU上,每个GPU只存储1/G参数。网络流量主要来自前向传播过程的中间激活值的传递以及反向传播过程中的梯度同步。

前向传播中,各个GPU计算出的中间激活值需要合并,由一次all-reduce操作进行求和。对于每个Token,在模型的每个layer的中均进行2次合并,共2xTxL次通信。

反向传播中,梯度需要在GPU之间同步,这种在每一层的处理中发生2次,由all-reduce操作将各个GPU上梯度求和。这种同步发生在每个mini-batch的每个layer的处理过程中。共2×N×L次通信。

3.流水线并行(Pipeline Parallelism)

在流水线并行时,网络流量主要来自前向和反向传播过程的中间激活值的传递。与张量并行不同,这些流量的传递发生在模型的前后两个阶段之间,使用Point-to-point通信而非all-reduce操作,并且频率也大大减小了。

综上,在三种并行方式中,张量并行的网络流量最大、频率最高,流水线并行的流量最低,数据并行的通信频率最低。如下表所示,P为模型参数,T为token数,L为模型层数,H为隐藏状态大小,G为GPU数量,N为mini-batch的数量,采用BFLOAT16数据格式,每个参数占2个字节。在每个epoch过程中:

 流量模式后向传播总网络流量反向传播同步次数前向过程总网络流量前向过程传递次数
数据并行all-reduce2 × N × P × G × (G-1)100
FSDPall-gather + all-reduce2 × N × P × (G-1)L2 × N × P × (G-1)L
张量并行all-reduce4 × N × P × L × (G-1)2 × L4 × L × T × H × (G-1) × G2 × L × T
流水线并行Point-to-point2 × T × H × (G-1)G-12 × T × H × (G-1)G-1

以具有80层(L)的Llama3 70B(P)模型和C4数据集为示例计算:采用BFLOAT16数据格式,每个参数占2个字节,隐藏层维度设为8192(H),使用8个GPU(G)进行数据并行。C4数据集token(T)总数约156B,样本数364.6 millions;batch size为2048,则每个epoch包含约178,000个mini-batch(N)

计算可得每个epoch过程中:

 反向传播总网络流量(PB)反向传播同步次数前向过程总网络流量(PB)前向过程总网络流量
数据并行1396 PB100
FSDP1758017580
张量并行2662216021840160*156*10^9
流水线并行17.9717.97

3D并行技术下的网络流量

数据并行、张量并行和流水线并行三个技术通常会组合起来使用,可进一步提高训练大模型时的效率和可扩展性。这时候,GPU也就按照这三个维度组成了GPU集群。

3D并行技术

假设共有G(tp)×G(pp)×G(dp) 个GPU组成的3D并行阵列,全部P个参数将分割为G(tp)×G(pp)份,每一份大小为P/G(tp)/G(pp)。在模型并行、流水线并行和数据并行三个维度上都存在网络流量。接下来我们将深入到每个epoch的训练过程,分别计算不同阶段的网络流量组成和规模。

3D并行技术

1.反向传播中的网络流量

在每个mini-batch中,反向传播时的梯度同步分为:

  1. 张量维度上的梯度同步,在模型的每一层和数据维度的每一组中进行,总共 LxG(dp) 次,每次包含2个all-reduce操作。
  2. 数据维度上的梯度同步,在流水线维度的每个阶段和张量维度的每一组中进行,总共 G(tp)xG(pp) 次,每次包含1个all-reduce操作。

如下图所示:

反向传播中的网络流量

这样,在一个epoch中,梯度同步的总网络流量为:

4xNxP/Gtp/GppxGtpx(Gtp-1)xLxGdp+2xNxP/Gtp/GppxGdpx(Gdp-1)xGtpxGpp=2xNxPxGdpx[2xLx(Gtp-1)/Gpp+(Gdp-1)]

3.流水线并行维度的中间激活梯度传播,流量为:

2xTxHx(Gpp-1)

因此,在一个epoch中,整个反向传播的总流量为:

2xNxPxGdpx[2xLx(Gtp-1)/Gpp+(Gdp-1)]+2xTxHx(Gpp-1)

2.前向传播中的网络流量

前向传播时,中间激活的传递依次在张量并行、流水线并行维度上交替进行,其中张量并行的激活传递每次包含2个all-reduce操作。

如下图,以一个Token的前向传播所示:

Token的前向传播

因此,在一个epoch中,前向传播总网络流量为:

4xTxHxLxPxGtpx(Gtp-1)+2xTxHx(Gpp-1)

即:

2xTxHx(2xLxGtpx(Gtp-1)+(Gpp-1)

由此,我们以Llama3-70B模型为例,采用8路张量并行 x 8路流水线并行 x 16路数据并行的模式,在共1024个GPU上进行训练,一个epoch产生的总流量约为85EB。如此庞大的流量规模,如果用1个交换容量为51.2T的交换机,24小时满负荷运行,需要约20天才能传输完毕。

考虑到一次预训练通常包含100个左右epoch,如果需要在100天完成训练,至少需要20台51.2T交换机来传输训练过程产生的数据。

AI训练对智算中心网络的要求

通过以上分析和计算,我们可以得出一个典型的AI智算中心对计算网的核心需求。

  • 超高带宽:一个epoch就会产生85EB的数据量,相当于整个互联网2.5天的流量。
  • 超低时延:一个训练样本的处理,就会产生100GB以上的数据,并需要在小于1毫秒的时间传输完毕。相当于1000个800G接口的传输速度。
  • 集合通信:GPU服务器之间的All-reduce, All-gather操作带来广播式流量,在上万个GPU之间,也就是上亿个GPU-GPU对之间同步。
  • 零容忍丢包:基于木桶原理,在集体通信过程中,仅仅是一对GPU之间流量的丢包和重传,也会造成整个集体通信的延迟,进而造成大量GPU进入空闲等待时间。
  • 严格时间同步:同样基于木桶原理,如果GPU的时钟不同步,将造成同样的计算量花费不同的时间,计算快的GPU不得不等待计算慢的GPU。

星融元CX-N系列交换机正是为智算中心AI训练场景而生的超低时延以太网交换机——在保持极致性能的同时,实现可编程、可升级的能力,与计算设备形成协同,共同打造10万级别的计算节点互联,将数据中心重构为可与超级计算机媲美的AI超级工厂。

  • 最大支持64个800G以太网接口,共51.2T交换容量。
    超低时延,在800G端口上实现业界最强的560ns cut-through时延。
  • 全端口标配支持RoCEv2,支持Rail-only,全连接Clos以及200G/400G混合组网,灵活适应不同的算力中心建设方案
  • 200+ MB大容量高速片上包缓存,显著减小集体通信时RoCE流量的存储转发时延。
  • Intel至强CPU + 大容量可扩展内存,运行持续进化的企业级SONiC——AsterNOS网络操作系统,并通过DMA直接访问包缓存,对网络流量进行实时加工。
  • INNOFLEX可编程转发引擎,可以根据业务需求和网络状态实时调整转发流程,最大程度避免网络拥塞和故障而造成的丢包。
  • FLASHLIGHT精细化流量分析引擎,实时测量每个包的延迟和往返时间等,经过CPU的智能分析,实现自适应路由和拥塞控制。
  • 10纳秒级别的PTP/SyncE时间同步,保证所有GPU同步计算。
  • 开放API,通过REST API开放全部功能给AI数据中心管理系统,与计算设备相互协同,实现GPU集群的自动化部署。

Easy RoCE:在SONiC交换机上一键启用无损以太网


关注星融元


RDMA(远程直接内存访问)技术是一种绕过 CPU 或操作系统,在计算机之间直接传输内存数据的技术。它释放了内存带宽和 CPU,使节点之间的通信具有更低的延迟和更高的吞吐量。目前,RDMA 技术已广泛应用于高性能计算、人工智能工作负载、存储和许多其他场景。

1、RoCEv2对网络的需求和挑战

RoCEv1 基于以太网链路层实现,通过交换机上的流量控制技术确保物理层的可靠传输。RoCEv2 在 UDP 层之上实现,弥补了 InfiniBand 的一些局限性,支持更广泛的 RDMA 应用。

与 TCP 协议相比,UDP 速度更快,消耗的资源更少,但没有TCP的滑动窗口和确认响应等机制来确保可靠传输。在 RoCEv2 网络中,如果出现数据包丢失,网卡将丢弃所有收到的数据包,而发送方需要重新传输所有后续数据包,导致网络传输性能大幅下降。因此,我们通常使用 PFC(优先级流量控制)和 ECN(显式拥塞通知)等功能来保证可靠性。

在以太网交换机上配置上述功能需要熟悉 QoS 机制、配置逻辑和相关命令行。对于长期为客户配置 RoCEv2 网络的工程师来说,这可能并不困难。但对于大部分从事高性能计算和存储领域的技术人员,他们通常专注于服务器侧的相关技术,这种相对复杂的,但又必须调通的网络配置给他们带来了很多麻烦,甚至以往运维过IB网络的工程师也需要花时间学习相关知识。

2、在SONiC交换机上用常规步骤配置无损以太网

现在让我们快速回顾一下如何在SONiC交换机上按常规方法配置 RoCEv2 无损以太网。这里使用的是星融元CX-N系列超低时延交换机,搭载SONiC企业级发行版AsterNOS3.1 R0405P01版本,但没有使用其上的 EasyRoCE 功能。

在部署 RoCEv2 网络时,务必首先确认网络硬件条件:低延迟网络交换机需要能支持 PFC 和 ECN 等功能,服务器侧的网卡也需要支持 RoCEv2 。常规步骤下:

  1. 启用和取消需要分别配置 PFC 和 ECN。
  2. 故障排除或状态检查通常需要进入不同的命令行视图并多次执行 “show “命令,以确定当前队列映射、缓冲区、启用的队列、阈值、队列吞吐量、暂停和 CNP 触发器。

第一步,确保服务器网卡工作在 RoCEv2 模式下,为业务流量配置 PCP 或 DSCP,并启用 ECN。


#设置网卡RDMA CM的工作模式
[root@server ~]# cma_roce_mode -d mlx5_0 -p 1 -m

#设置网卡的优先级类型为DSCP
[root@server ~]# mlnx_qos -i enp1s0f0 –trust=dscp
DCBX mode: OS controlled
Priority trust state: dscp

#在队列3上开启PFC
[root@server ~]# mlnx_qos -i enp1s0f0 -f 0,0,0,1,0,0,0,0

#在队列3上开启DCQCN
[root@server ~]# echo 1 > /sys/class/net/enp1s0f0/ecn/roce_np/enable/3
[root@server ~]# echo 1 > /sys/class/net/enp1s0f0/ecn/roce_rp/enable/3

#设置CNP DSCP
[root@server ~]# echo 48 >


然后,在交换机端口配置以启用 PFC 和 ECN 功能并指定队列。您需要在以太网交换机的指定队列(需与服务器上的队列匹配)上启用 PFC 和 ECN,并调整缓冲区和阈值。


# 设置PFC门限值
sonic(config)# buffer-profile pg_lossless_100000_100m_profile
sonic(config-buffer-profile-pg_lossless_100000_100m_profile)# mode lossless dynamic -2 size 1518 xon 0 xoff 46496 xon-offset 13440
sonic(config-buffer-profile-pg_lossless_100000_100m_profile)# exit

# 在3、4队列开启PFC功能(AsterNOS的PFC功能默认使能3、4队列,无需配置)
sonic(config)# priority-flow-control enable 3
sonic(config)# priority-flow-control enable 4
sonic(config)# exit

# 设置ECN门限值
sonic(config)# wred roce-ecn
sonic(config-wred-roce-ecn)# mode ecn gmin 15360 gmax 750000 gprobability 10
sonic(config-wred-roce-ecn)# exit

# 配置Diffserv map
sonic(config)# diffserv-map type ip-dscp roce-dmap
sonic(config-diffservmap-roce-dmap)# ip-dscp 48 cos 6

# 配置Class map
sonic(config)# class-map roce-cmap
sonic(config-cmap-roce-cmap)# match cos 3 4
sonic(config-cmap-roce-cmap)# exit

# 配置Policy map
sonic(config)# policy-map roce-pmap
sonic(config-pmap-roce-pmap )# class roce-cmap
sonic(config-pmap-c)# wred roce-ecn
sonic(config-pmap-c)# priority-group-buffer pg_lossless_100000_100m_profile
sonic(config-pmap-c)# exit
sonic(config-pmap-roce-pmap )# set cos dscp diffserv roce-dmap
sonic(config-pmap-roce-pmap )# exit

# 进入以太网接口视图,绑定策略,将RoCE网络配置在接口上使能
sonic(config)# interface ethernet 0/0
sonic(config-if-0/120)# service-policy roce-pmap


3、使用AsterNOS上的Easy RoCE快捷配置无损以太网

星融元在 AsterNOS 上推出了 “EasyRoCE” 功能,该功能将无损以太网相关的配置命令行进行了封装和模板化,大大简化了RoCEv2网络配置和部署流程。请注意,以下命令行仅简单展示交换机上与该功能相关的部分关键配置,完整的验证演示流程请参考文末视频

一键启用无损以太网

一键RoCE

故障排除或状态检查

AsterNOS 的 Easy RoCE 功能支持 show roce 命令行,用于一站式查看全局或接口视图的RoCE 配置和计数,以及清除所有配置和计数。

# 检查RoCE配置
sonic# show qos roce

故障排除

# 查看特定接口的计数
sonic# show counters qos roce interface 0/0 queue 3
# 清除全部计数
sonic# clear counters qos roce

状态检查

自动化配置和网络可见性

上述命令可帮助您快速配置无损以太网,如果您需要微调参数,Easy RoCE也支持自定义更改设备提供的默认模板,该模板也可通过上层管理平台向设备下发。

基于 AsterNOS 的开放式架构,我们还开发了一个容器化部署的 roce_exporter,用于提取设备 RoCE 相关信息,并与 Prometheus 无缝对接以提高网络可见性。

自动化配置

相关文章

实战演练:一文教你将交换机纳入K8s,对容器进行纳管


关注星融元


随着云计算的发展和云原生应用的兴起,容器技术成为一种流行的应用部署和管理方式。容器化应用程序具有轻量、可移植和可扩展的特点,能够快速部署和运行在不同的环境中。Kubernetes作为一个容器编排平台,为云原生应用的部署、管理和自动化提供了强大的支持,因此得到了广泛的关注和采用。

AsterNOS由于其系统的开放性,能够提供计算资源给用户以部署容器化服务。在客户拥有K8s管理集群的条件下,可以通过K8s纳管AsterNOS设备,将第三方应用部署在AsterNOS上,从而简化应用程序的管理和运维过程。通过使用K8s进行容器编排和自动化管理,便能实现应用的自动伸缩、自动恢复和自动升级,减少了人工干预和操作的工作量。可以提高运维效率,降低运维成本,并提供更好的应用程序可用性和稳定性。

流程图

配置K8s之前,先给读者们讲个故事:

在K8s诞生时,CNCF(云原生计算基金会——主导了K8s项目)便致力于推行一个标准的容器对接方案CRI,符合该容器标准的容器技术能够被K8s纳管,但是docker当时已经作为市场主流方案被接受,因此不符合该标准。出于市场原因K8s最开始在内部运行了名为docker-shim的垫片程序作为与docker的临时对接方案,在1.24版本后,K8s便放弃了与docker的兼容工作,将该垫片剥离出去。这方面工作就由Mirantis公司(docker母公司)接手,开发出名为cri-dockerd的垫片程序进行兼容工作。自此,如果想使用K8s管理docker,便需要使用一个名为cri-dockerd的容器运行时作为中间垫片。


因此,方案整体采用docker + cri-dockerd + K8s 的架构进行部署验证。

方案主体

可以通过两种方式将CX-N作为K8s集群中的工作节点:

  • CX-N作为普通node节点纳入集群,在此方案中K8s中的kube-proxy以及kubelet作为必要组件会运行在工作节点中。该方案所占资源更多但是更加通用,能够实现K8s所有的功能。
  • 将CX-N作为边缘设备纳入集群,该方案使用kubeedge组件,在主节点启用cloudcore,边缘节点启动edgecore加入主节点。此方案所占用性能更低,但是如果将该节点当作普通node来使用可能会出现兼容性以及功能方面的缺失问题。

组网拓扑

1、IP规划

名称IP
K8s-master10.230.1.26/24
CX532P-N10.230.1.10/24
CX308P-N10.230.1.21/24
Pod-cidr10.244.0.0/16
Service-cidr10.96.0.0/12

2、kubeedge方式部署

kubeedge方式部署

(1)软件环境

机器名称版本
K8s-masterLinuxUbuntu 20.04.6 LTS
dockerdocker ce:26.0.0
containerd:1.6.28
cri-dockerv0.3.11
keadmv1.16.1
kubeedgev1.16.1
kubeadm、kubelet、kubecliv.1.27.6
flannelv0.24.4
CX532P-Ndockerdocker ce:26.0.0
containerd:1.6.28
cri-dockerv0.3.11
keadmv1.16.1
kubeedgev1.16.1
cni-pluginv1.4.1

(2)最终效果

在主节点上显示节点信息:

节点信息
节点信息

显示容器信息:

master节点容器信息
master节点容器信息

在CX-N设备上显示容器信息:

node节点容器信息
node节点容器信息

3、node方式部署

(1)软件环境

机器名称版本
K8s-masterLinuxUbuntu 20.04.6 LTS
dockerdocker ce:26.0.0
containerd:1.6.28
cri-dockerv0.3.11
kubeadm、kubelet、kubecliv.1.27.6
flannelv0.24.4
CX532P-Ndocker
docker ce:26.0.0
containerd:1.6.28
cri-dockerv0.3.11
kubeadm、kubelet、kubecliv.1.27.6
flannelv0.24.4

(2)最终效果

master节点容器信息
master节点容器信息

node节点容器信息
node节点容器信息

4、结论

两种方案对比:

 kubeedge节点普通K8s node节点
功能边缘计算能力,能在边缘设备上运行容器化应用和进行边缘计算完整的容器编排和管理能力,适用于云端和数据中心环境
生态支持生态对比普通Kubernetes有所不足成熟的生态系统和广泛的社区支持
设备边缘设备和边缘计算基础设施的支持普通计算节点
网络要求离线工作支持,能在无网络连接的情况下继续工作需要高速稳定的网络连接和可靠的云端基础设施
性能占用边缘设备的资源限制可能影响应用程序的性能和可扩展性性能占用略高,不适合特定于边缘计算场景的要求
部署管理部署和管理边缘节点更复杂部署管理较为简单
资源控制node资源控制能力不足完善的pod,namespace以及node资源控制管理能力

总的来说,kubeedge是专属于为边缘计算场景设计:

  1. 边缘计算环境:能够在边缘设备上运行容器化应用和进行边缘计算。因此,KubeEdge 特别适用于需要在边缘设备上进行实时数据处理、低延迟计算或离线工作的场景。
  2. 边缘数据处理:要求边缘设备具有本地数据处理能力,可以减少数据传输到云端的延迟和带宽消耗。这使得 KubeEdge 适用于需要实时数据处理、减少云端数据传输、保护数据隐私等场景,如物联网应用、视频监控、智能交通等。
  3. 离线工作支持:即使在边缘设备失去网络连接的情况下,仍然能够继续工作,适用于偏远地区或断网环境下的场景。

而普通的K8s节点更适用于如下场景:

  1. 云端和数据中心环境:节点具备完整的容器编排和管理能力,适用于在云端和数据中心部署和管理大规模的容器化应用。
  2. 易于扩展和管理的场景:普通 Kubernetes 节点在扩展性和管理性方面具有优势,可以轻松地扩展和管理大规模的集群,适用于需要高度可扩展性和灵活性的场景。
  3. 依赖云端资源的场景:普通 Kubernetes 节点通常依赖于云端的弹性和资源来处理工作负载,适用于需要利用云端资源来处理应用程序的场景。
  4. 广泛的生态系统和社区支持:普通 Kubernetes 在生态系统和社区支持方面非常强大,有着广泛的工具、插件和文档资源,适用于需要成熟的生态系统和广泛的社区支持的场景。

通过以上两种方式,星融元AsterNOS设备上能够运行K8s容器,想要自行配置体验?方案获取:解决方案-基于Kubernetes的AsterNOS资源管理方案

相关文章

大型语言模型(LLMs)是怎样“学习”的?一封给网络工程师的大模型指南


关注星融元


数字时代,人工智能(AI)及其相关技术正日益成为许多领域的热门话题。其中,生成式人工智能(Gen AI)和大型语言模型(LLMs)引起了广泛的兴趣和讨论。然而,尽管这些术语在科技界和专业领域中频繁出现,网络工程师对其的理解却不多。

什么是生成式人工智能和大型语言模型?本文将为大家介绍大型语言模型和生成式人工智能的基本概念、应用领域及大语言模型的运行原理,阅读本文后您将更全面地了解这些领域的前沿技术,我们一同踏上这段探索新领域的科普之旅吧!

什么是生成式人工智能和大型语言模型?

“生成式人工智能(Generative AI,一般简称为Gen AI)”是一种人工智能技术,专注于创造或生成新的内容,例如图像、文本或音乐。这些内容不是直接复制或派生自现有的示例,而是由计算机自己创造的。生成式AI的一个重要应用是生成文本,比如自动写作、诗歌创作或对话生成。

“大型语言模型(Large Language Models,LLMs)”是一类生成式AI,它们通过深度学习算法在大量自然语言数据上进行训练。这些模型学习人类语言的模式和结构,并能够对各种书面输入或提示生成类似人类的回应。最近的LLMs表现出了接近人类的水平,例如GPT-3.5,它能够产生几乎完美的文本回应。

这些近乎完美的类人化回应,包括来自chatGPT和其他最近的LLMs,得益于模型架构的进步。这些模型采用高效的具有数十亿个参数的深度神经网络(DNNs)经过大规模数据集的训练得出,其中大部分参数被用于训练和推理的矩阵权重。而训练这些模型的浮点运算次数(FLOP)几乎与参数数量和训练集大小成线性关系。这一系列运算是在专门用于矩阵运算的处理器上执行的,例如图形处理单元(GPUs)、张量处理单元(TPUs)和其他专用的AI芯片等。GPU、TPU、AI加速器以及它们之间的通信互联技术的进步让庞大模型训练成为现实。

LLMs有哪些应用?

大型语言模型(LLMs)具有许多用例,几乎每个行业都可以从中受益。不同的组织可以根据自身的特定需求和领域对模型进行微调。微调是指在特定数据集上对预先存在的语言模型进行训练,使其更专业化并适应特定任务。通过微调,组织可以在利用这些训练模型预先存在能力的同时,将其调整得能够满足自己得独特需求,这让模型能够获取领域特定的知识,从而提高其生成组织用例所需输出的能力。通过微调的模型,组织可以在多个用例中使用LLMs。

例如,根据公司文档进行微调的LLMs可用于客户支持。LLMs可以通过创建代码或支持他们创建部分代码来帮助软件工程师。当与组织的专有代码库进行微调时,LLMs有可能生成类似于并符合现有代码库的软件。

LLMs的众多用例包括用于评估客户反馈的情绪分析、将技术文档翻译成其他语言、总结会议和客户电话以及生成工程和营销内容。

pictures

随着这些LLMs的规模持续呈指数级增长,对计算和互连资源的需求也显着增加。只有当模型的训练和微调以及推理有足够成本效益时,LLMs才会被广泛采用。

LLMs如何使用深度学习算法进行训练?

为了使用自然语言文本训练LLM,通常需要收集大量数据,包括网络抓取(爬取网页)、维基百科、GitHub、Stack Exchange、ArXiv等。大多数模型通常使用开放数据集进行训练。这些数据集中的大量文本首先会进行标记化,通常使用字节对编码等方法。标记化将来自互联网的原始文本转换为整数序列(标记,tokens)。一个标记(唯一整数)可以表示一个字符或一个单词,甚至可以是单词的一部分。例如,单词“unhappy”可能会被分成两个标记——一个表示子词“un”,另一个表示子词“happy”。

编码

比如这段文本先被标记化,再被编码化

根据数据集的不同,可能会有成千上万个唯一标记,数据集本身可能映射到数千亿个标记。序列长度是模型在训练过程中预测下一个标记时要考虑的连续标记的数量。GPT-3和LLaMA(Meta的LLM)的序列长度约为2000。一些模型使用的序列长度甚至达到10万。表1比较了GPT-3和LLaMA模型的训练参数。

为了训练模型,标记被分成大小为batch_size(B)x序列长度的数组,然后将这些批次馈送给大型神经网络模型。训练通常需要几周,甚至几个月,并且需要大量的GPU集群。

模型参数 GPT-3 LargeLLaMA
词汇量大小 50,25732,000
序列长度 2,0482,048
最大训练模型参数 1750亿650亿
训练数据集中的标记数3000亿1到1.3万亿
GPU数量10,000 x V100 GPUs2,048 x A100 GPUs
训练时间一个月21天

一旦基础模型训练完成,通常会进行监督微调(Fine-Tuning,SFT)。这是一个可以让LLMs扮演助手角色,回答人们提示问题的重要步骤。在有监督微调中,人们会创建一个精心策划的数据集(数量较少但质量很高的数据集),其中包含提示和响应的形式,然后使用这个数据集重新训练基础模型。经过训练的SFT模型会成为一个能对用户提示作出类似人类回应的助手。

以上是对LLMs的简单解释,接下来将直接讲述LLMs的模型计算过程。(敲黑板,上强度了!)

模型计算

一个具有1750亿参数的模型通常需要超过1TB的内存来存储参数和计算过程中的中间状态。它还需要存储检查点的训练状态(以防在训练迭代过程中遇到硬件错误)。一万亿个标记通常需要4TB的存储空间。像Nvidia的H100这样的高端GPU具有80GB的集成HBM内存(如果想用H100装下一个一万亿标记的模型,需要4TB➗80GB=51.2张卡)。一个GPU的内存是无法容纳模型参数和训练集的。

根据维基百科的说法,大型语言模型(LLM)通常每个参数和标记需要进行六次浮点运算(FLOP)。这相当于对GPT-3模型进行训练需要进行3.15 x 10^23次浮点运算,其中GPT-3模型的训练耗时为三周。因此,在这三周的时间内,它需要5.8 x 10^16次每秒的浮点运算能力(FLOPs)。

pictures

一卡难求的H100长这样?

然而,尽管Nvidia的最高性能H100 GPU在FP32模式下可以达到约67 TeraFLOPS(每秒万亿次),但在许多训练工作负载中,由于内存和网络瓶颈,GPU的利用率通常只能维持在30%左右。因此,为了满足训练需求,我们需要三倍数量的GPU,大约是6,000个H100 GPU。原始的LLM模型(表1)是使用较旧版本的GPU进行训练的,因此需要10,000个GPU。

由于有成千上万个GPU,模型和训练数据集需要在这些GPU之间进行分区,以实现并行运行。并行性可以在多个维度上发生。

数据并行性

数据并行性(Data Parallelism)涉及将训练数据分割到多个GPU上,并在每个GPU上训练模型的副本。典型流程包含数据分布、数据复制、梯度计算、梯度聚合、模式更新和重复等。

  1. 数据分布:训练数据被划分为小批量,并在多个GPU之间分布。每个GPU获得一个独特的小批量训练集。
  2. 模型复制:模型的副本被放置在每个GPU上(也称为工作节点)。
  3. 梯度计算:每个GPU执行一次模型训练迭代,使用其小批量数据进行前向传播以进行预测,并进行反向传播以计算梯度(这些梯度指示模型参数在下一次迭代之前应如何调整)。
  4. 梯度聚合:来自所有GPU的梯度被汇总在一起。通常通过计算梯度的平均值来完成此步骤。
  5. 模型更新:汇总的梯度被广播到所有GPU。各个GPU更新其本地模型参数并进行同步。
  6. 重复:此过程重复多次,直到模型完全训练完成。

数据并行性可以在使用大型数据集时显著加快训练速度。然而,它可能会导致大量的GPU间通信,因为每个GPU都必须与训练中涉及的其他GPU通信。这种全对全的通信(All-to-All)可能会在每次训练迭代中在网络中产生大量的流量。

ALL-to-ALLALL-to-ALL

训练大型语言模型(LLMs)时,我们使用了一些方案,例如环形全局归约(Ring All-Reduce),将梯度以环形模式从一个GPU发送到另一个GPU。在这个过程中,每个GPU将其从前一个GPU接收到的梯度与本地计算的梯度进行聚合,然后将其发送到下一个GPU。然而,这个过程非常缓慢,因为梯度聚合分布在多个GPU之间,最终结果需要在环形拓扑中传播回所有GPU。如果网络拥塞,GPU之间的流量会因等待聚合梯度而停滞。

ALL-REDUCE

ALL-REDUCE

此外,具有数十亿参数的LLMs无法适应单个GPU。因此,仅靠数据并行性无法满足LLM模型的需求。

模型并行性

模型并行性(Model Parallelism)旨在解决模型无法适应单个GPU的情况,通过将模型参数(和计算)分布到多个GPU上。典型的流程包含模型分区、前向传播、反向传播、参数更新、重复等。

  1. 模型分区:将模型划分为若干个分区,每个分区分配给不同的GPU。由于深度神经网络通常包含一系列垂直层,因此按层次划分大型模型是合乎逻辑的,其中一个或一组层可能分配给不同的GPU。
  2. 前向传播:在前向传播过程中,每个GPU使用“整个”训练集计算其模型部分的输出。一个GPU的输出作为下一个GPU的输入传递。下一个GPU在接收到前一个GPU的更新之前无法开始处理。
  3. 反向传播:在反向传播过程中,一个GPU的梯度传递给序列中的前一个GPU。在接收到输入后,每个GPU计算其模型部分的梯度。与前向传播类似,这在GPU之间创建了顺序依赖关系。
  4. 参数更新:每个GPU在其反向传播结束时更新其模型部分的参数。需要注意的是,这些参数不需要广播到其他GPU。
  5. 重复:此过程重复多次,直到模型在所有数据上训练完成。

流水线并行性

流水线并行性(Pipeline Parallelism)将数据并行性和模型并行性相结合,其中训练数据集的每个小批量进一步分成几个微批量。在上面的模型并行性示例中,一个GPU使用第一个微批量计算输出,并将该数据传递给序列中的下一个GPU。与在反向传播中等待从该GPU获取输入不同,它开始处理训练数据集的第二个微批量,依此类推。这增加了GPU之间的通信,因为每个微批量都需要在序列中相邻的GPU之间进行前向传播和反向传播的通信。

张量并行性

张量并行性(Tensor Parallelism)是一种用于加速深度学习模型训练的技术。与模型并行和流水线并行技术不同,张量并行性在操作级别(或“张量”级别)上划分模型,而不是在层级别上划分。这种方法允许更精细的并行处理,对某些模型来说更高效。

具体来说,张量并行性的步骤如下:

  1. 模型分区:将模型划分为多个操作(或“张量”),每个操作分配给不同的GPU。这样,每个GPU只负责计算部分操作的输出。
  2. 前向传播:在前向传播过程中,每个GPU使用整个训练集计算其操作部分的输出。一个GPU的输出作为下一个GPU的输入传递。这样,模型的计算被分散到多个GPU上。
  3. 反向传播:在反向传播过程中,梯度从一个GPU传递到序列中的前一个GPU。每个GPU计算其操作部分的梯度。与前向传播类似,这也创建了GPU之间的顺序依赖关系。
  4. 参数更新:每个GPU在其反向传播结束时更新其操作部分的参数。这些参数不需要广播到其他GPU。

数据并行性、模型并行性、流水并行性、张量并行性……没搞懂不同并行技术的处理逻辑?下面这个案例或许可以给你一些启发,相信作为网工的你一定能很快理解~

假设我们有2台机器(node0和node1),每台机器上有8块GPU,GPU的编号为0~15。

我们使用这16块GPU,做MP/DP/TP/PP混合并行,如下图:

MP/DP/TP/PP混合并行

MP:模型并行组(Model Parallism):

假设一个完整的模型需要布在8块GPU上,则如图所示,我们共布了2个model replica(2个MP)。MP组为:[[g0, g1, g4, g5, g8, g9, g12, g13], [g2, g3, g6, g7, g10, g11, g14, g15]]

TP:张量并行组(Tensor Parallism)

对于一个模型的每一层,我们将其参数纵向切开,分别置于不同的GPU上,则图中一共有8个TP组。TP组为:[[g0, g1], [g4, g5],[g8, g9], [g12, g13], [g2, g3], [g6, g7], [g10, g11], [g14, g15]]

PP:流水线并行组(Pipeline Parallism):

对于一个模型,我们将其每一层都放置于不同的GPU上,则图中一共有4个PP组。PP组为:[[g0, g4, g8, g12], [g1, g5, g9, g13], [g2, g6, g10, g14], [g3, g7, g11, g15]]

DP:数据并行组(Data Parallism):

经过上述切割,对维护有相同模型部分的GPU,我们就可以做数据并行,则图中共有8个DP组。DP组为[[g0, g2], [g1, g3], [g4, g6], [g5, g7], [g8, g10], [g9, g11], [g12, g14], [g13, g15]]

读完本文,相信你对训练大语言模型(LLMs)的三个步骤已经很熟悉:

  1. 通过网络抓取等方式进行数据集集成;
  2. 将源文本分割为标记;
  3. 通过模型参数并行处理的方式进行模型训练

相信你也对大数据模型的多种并行类型有了初步认识:无论使用何种并行性类型,LLM 凭借其参数和数据集的庞大规模,都会通过连接这些 GPU 的结构产生大量的 GPU 间流量。结构中的任何拥塞都可能导致训练时间过长且 GPU 利用率极低。之后将继续推出AI系列科普文,为大家介绍GPU/TPU 集群设计,以了解互连以及它们如何进行 LLM 训练。

实际应用中,训练完大语言模型(LLMs)之后,需要对模型进行微调以满足不同组织(企业)的个性化需求,该如何优化LLMs模型?后续的推文将为您解答这些疑惑。

星融元作为一家网络公司,为什么会那么关注AI、LLMs这些看似与自身业务关系不大的领域,甚至开辟专栏为网络工程师科普相关知识?主要出于技术和市场竞争方面的考虑。

1.技术方面,网络在大语言模型(LLMs)的训练过程中至关重要:

LLMs训练之初便需要通过网络抓取大量的数据集成数据集,数据集中的大量参数和数据需要通过网络传输到GPU上进行并行处理,网络连接的质量直接影响了数据传输的速度和效率。LLMs的训练会涉及到多个GPU的协同工作,连接这些GPU的网络结构会产生大量的GPU间流量,如果网络拥塞,数据传输会受到影响,导致训练时间过长且GPU利用效率降低。

因此,网络的稳定性、速度和带宽都对LLMs的训练效果至关重要。网络拥塞可能导致训练效率下降,因此需要优化网络架构,确保数据传输的高效性。

2.市场竞争方面,AI离不开LLMs训练,市场潜力无穷:

人工智能作为人们高度关注的热点话题,在许多领域拥有巨大的市场潜力。LLMs训练完毕后,大模型与用户的交互过程中(如chatGPT爆火,全球很多用户都在使用的情况),网络质量会直接影响用户对Gen AI应用的体验。拥有先进技术和工具是企业保持竞争优势的关键,星融元顺势而为,持续关注智算市场的发展,并推出HPC、AI等场景的网络解决方案,为用户提供良好的网络环境,实现用户与自身的双赢!

参考:Large Language Models – The Hardware Connection (juniper.net)
数据并行(DP)、张量模型并行(TP)、流水线并行(PP)_tp pp dp-CSDN博客

相关阅读:星融元针对LLM大模型承载网发布星智AI网络解决方案

相关文章

从零开始:搭建PXE远程批量安装服务器


关注星融元


在大规模服务器部署时,面对成百上千台服务器,通过手动插入光盘或者USE驱动器来安装操作系统无比繁琐,让大量工程师在现场挨个安装系统也不切实际,PXE的出现使得网络远程批量自动安装和配置操作系统成为现实。

什么是PXE?

PXE(Pre-boot Execution Environment,预启动执行环境)是由Intel设计的协议,它允许计算机通过网络启动。这个协议工作在Client/Server模式下,允许客户机通过网络从远程服务器下载引导镜像,并加载安装文件或整个操作系统。

相比其他工具,PXE更好地解决了以下问题:

  • 自动化:PXE允许自动安装和配置操作系统,减少了手动操作的工作量。
  • 远程实现:通过网络远程安装操作系统,无需物理介质,方便管理远程服务器。
  • 规模化:特别适用于大规模服务器部署,可以同时装配多台服务器。。

PXE工作原理和配置

工作原理

  1. PXE启动:当终端进入网卡启动时,会发送一个特殊的PXE启动请求到本地网络上的DHCP服务器。
  2. DHCP服务:DHCP服务器收到PXE启动请求后,会向计算机发送DHCP响应,DHCP响应包含了计算的网络配置信息,以及PXE引导服务器的IP地址——TFTP Server(Trivial File Transfer Protocol)。
  3. TFTP传输:计算机收到DHCP响应后,会使用TFTP从Server下载引导文件——pxelinux.0或者bootx64.efi。
  4. 加载引导文件:计算机加载并执行从TFTP下载的引导文件。引导文件通常是一个小型的Linux内核,能够连接到PXE服务器并获取操作系统镜像。
  5. 获取配置信息:引导文件连接到PXE服务器后,会通过TFTP发送请求以获取更多的配置信息。
  6. 获取操作系统镜像:PXE服务器根据计算机的请求,将系统镜像发送给计算机。
  7. 操作系统加载:一旦操作系统映像文件下载完成,计算机会加载并执行该映像文件。此时,计算机将完全从网络上运行操作系统,而无需本地硬盘上的安装。

PXE启动流程

注意:虽然PXE很好用,但启动时也需要满足以下条件

  1. 网卡支持PXE,目前新出的网卡基本都支持,同时需要完成BIOS的启动项配置。
  2. 传统启动模式(Legacy)下,PXE客户端会请求pxelinux.0;UEFI启动会请求bootx64.efi。
  3. 也可以采用nfsboot方式,该流程采用的是ISO镜像下载再安装的方式。

由于星融元交换机的开放性,PXE Server所需的组件能全部部署在CX-M上,即一台CX-M设备即可满足PXE的需求。

安装配置

安装配置

安装配置

星融元已通过PXE成功实现了大规模服务器的商业部署、自动化操作系统安装,从安装配置TFTP到准备启动文件、安装配置TFTP、配置HTTP Server、配置启动文件、配置DHCP到最后的验证,都可以在PXE配置文档中学会。

在现代IT环境中,通过PXE自动化流程部署系统可以减少人为错误,有助于提高效率、简化管理并确保一致性,亲手配置试试吧~

技术手册-PXE配置指导手册

相关文章

技术手册-Kolla-Ansible:在容器环境中部署OpenStack


关注星融元


OpenStack简介

OpenStack是一个云操作系统,它控制整个数据中心的大型计算、存储和网络资源池,所有这些资源都通过一个仪表板进行管理,该仪表板赋予管理员控制权,同时允许用户通过web界面提供资源。

它为私有云和公有云提供可扩展的弹性的云计算服务,提供实施简单、可大规模扩展、丰富、标准统一的云计算管理平台。

Kolla-Ansible简介

Kolla旨在为运行OpenStack提供生产就绪的容器和部署工具。

Kolla-Ansible是Kolla的子项目,该项目使用Ansible部署Kolla容器映像。

Kolla-Ansible是开箱即用的工具,即使你是个新手也可以快速部署OpenStack,也允许你根据需求定制化的部署。

目标

在容器中部署OpenStack最大的特点就是升级,用户基本是无感知的状态下完成。同时可以实现本地与云端一致,一次开发随处运行,通过迁移到不同的设备,快速的完成部署和升级操作。

本文将以详细操作指导的方式,给出一种在Docker容器环境中部署OpenStack的指导方法。

环境准备

两台server,一台作为controller,另一台作为compute节点,操作系统CentOS 7.6.1810 镜像CentOS-7-x86_64-DVD-1810.iso。服务器具体配置要求如下:

  • 2个千兆网口
  • 至少8G内存
  • 磁盘至少40G
  • 计算节点的BISO中开启CPU嵌套虚拟化(INTEL叫VT-x,AMD的叫AMD-V)

Kolla-Ansible部署过程

关闭SELinux 【控制节点、计算节点】

SELinux不关闭的情况下无法实现,会限制ssh免密码登录

[root@localhost  ~]#setenforce 0

[root@localhost  ~]# sed -i ‘s/SELINUX=enforcing/SELINUX=disabled/g’ /etc/sysconfig/selinux

关闭防火墙【控制节点、计算节点】

防止安装时出现各个组件的端口不能访问的问题

[root@localhost  ~]#systemctl stop firewalld && systemctl disable firewalld

禁用宿主机的 Libvirt 服务

大多数操作系统会默认启动 Libvirt,但使用 Kolla 来部署 OpenStack 的话,Libvirt 应该在容器中运行并管理虚拟机。所以宿主机的 Libvirt 需要被关闭,以免造成冲突。

[root@localhost  ~]#systemctl stop libvirtd.service
[root@localhost  ~]#systemctl disable libvirtd.service

设置主机名,hosts文件【控制节点、计算节点】

控制节点

[root@localhost  ~]#hostname controller
[root@localhost  ~]#echo “controller”> /etc/hostname

计算节点根据节点名称修改

[root@localhost  ~]#vim /etc/hosts
192.168.4.2 controller
192.168.4.150 computer1

修改网卡名称【控制节点、计算节点】

说明:网卡名字不是必须改,保持各服务器使用的网卡名称一样。

网卡1:

[root@localhost  ~]#cd /etc/sysconfig/network-scripts
[root@localhost  ~]#vim ifcfg-enp6s0f0
IPADDR=192.168.1.*
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
NAME=eno1
DEVICE=eno1

网卡2:

[root@localhost  ~]#cd /etc/sysconfig/network-scripts
[root@localhost  ~]#vim ifcfg-enp6s0f1
IPADDR=192.168.2*
NETMASK=255.255.255.0
GATEWAY=192.168.21
NAME=eno2
DEVICE=eno2

修改网卡文件名称:

[root@localhost  ~]#mv ifcfg-enp6s0f0 ifcfg-eno1
[root@localhost  ~]#mv ifcfg-enp6s0f1 ifcfg-eno2

修改net配置文件

[root@localhost  ~]#vi /etc/udev/rules.d/70-persistent-net.rules
SUBSYSTEM==”net”,ACTION==”add”,DRIVERS==”?*”,ATTR{address}==”78:24:af:85:0c:ac”,ATTR{type}==”1″, NAME=”eno1″    
SUBSYSTEM==”net”,ACTION==”add”,DRIVERS==”?*”,ATTR{address}==”78:24:af:85:0c:ad”,ATTR{type}==”1″, NAME=”eno2″

ATTR和服务器两网口MAC地址保持一致

重启服务器

[root@localhost  ~]#reboot

重启网络服务

[root@localhost  ~]#systemctl restart network

安装【控制节点、计算节点】

[root@localhost  ~]#yum install -y epel-release
[root@localhost  ~]#yum install -y python-pip
[root@localhost  ~]#pip install -U pip

安装编译环境【控制节点】

[root@controller  ~]#yum install -y python-devel libffi-devel gcc openssl-devel libselinux-python

安装ansible【控制节点】

[root@controller  ~]#pip install -U ansible

安装docker【控制节点、计算节点】

[root@localhost  ~]#tee /etc/yum.repos.d/docker.repo <<-‘EOF’
[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/7/
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg
EOF
[root@localhost  ~]#yum install -y docker-engine docker-engine-selinux

  • 问题1 安装docker失败,提示与其他安装包冲突Error: docker-engine-selinux conflicts with 2:container-selinux-2.107-3.el7.noarch

解决方法如下:

[root@compute1 ~]#rpm -qa |grep container-selinux-2.107-3.el7.noarch
[root@compute1 ~]#yum -y remove container-selinux-2.107-3.el7.noarch

设置Docker【控制节点、计算节点】

[root@localhost  ~]#mkdir /etc/systemd/system/docker.service.d
[root@localhost  ~]#tee /etc/systemd/system/docker.service.d/kolla.conf << ‘EOF’
[Service]
MountFlags=shared
EOF

重启相关服务【控制节点、计算节点】

[root@localhost  ~]#systemctl daemon-reload
[root@localhost  ~]#systemctl enable docker
[root@localhost  ~]#systemctl restart docker

安装模块【控制节点、计算节点】

[root@localhost  ~]#pip install docker

安装【控制节点】

[root@controller  ~]#yum install git

安装kolla-ansible【控制节点】

[root@controller  ~]#pip install kolla-ansible

如果报如下错误

Cannot uninstall ‘PyYAML’. It is a distutils installed project and thus we

cannot accurately determine which files belong to it which would lead to only a

partial uninstall.

[root@controller  ~]#rm -rf /usr/lib64/python2.7/site-packages/PyYAML*

拷贝配置文件【控制节点】

[root@controller  ~]#cp -r  /usr/share/kolla-ansible/etc_examples/kolla  /etc/kolla/

[root@controller  ~]#cp  /usr/share/kolla-ansible/ansible/inventory/*  /home/

配置免密登录【控制节点】

[root@controller  ~]#ssh-keygen                        #一路回车
[root@controller  ~]#ssh-copy-id controller         #回车后输入服务器密码
[root@controller  ~]#ssh-copy-id computer1          #回车后输入服务器密码

存储节点配置【计算节点】

(演示版本可以跳过此步骤)

  • 要启动cinder存储服务,需先添加一块新的硬盘,然后创建pv、vg

[root@computer1 ~]#pvcreate /dev/sdb
[root@computer1 ~]#vgcreate cinder-volumes /dev/sdb  //vg名取名为 cinder-volumes,这里主要跟 kolla配置文件里vg名一致

  • 问题1 如果出现创建不了pv

解决方法如下:

[root@compute1 ~]#pvcreate devsdb
Device /dev/sdb excluded by a filter.

解决:

[root@compute1 ~]#dd if=/dev/urandom of=/dev/sdb bs=512 count=64
64+0 records in
64+0 records out
32768 bytes (33 kB) copied, 0.00760562 s, 4.3 MB/s
[root@compute1 ~]#pvcreate /dev/sdb                            
Physical volume “/dev/sdb” successfully created.

重启服务【计算节点】

[root@compute1 ~]#systemctl restart lvm2-lvmetad.service

修改【控制节点】

[root@controller ~]#vim /home/multinode
[control]
controller
[network]
controller
[inner-compute]
[external-compute]
computer1
[compute:children]
inner-compute
external-compute
[storage]
computer1
[monitoring]
controller
[deployment]
controller

获取docker镜像【控制节点、计算节点】

  • 使用kolla官方镜像源

[root@localhost  ~]#vim /etc/kolla/globals.yml
kolla_install_type: “binary”
openstack_release: “stein”
docker_namespace: “kolla”

  • 下载镜像包

[root@controller  ~]#kolla-ansible pull -i /home/multinode

修改全局配置文件globals.yml【控制节点】

管理网口eno1,外网网口eno2

如果采用cinder磁盘存储

kolla_base_distro: “centos”

kolla_install_type: “binary”
openstack_release: “stein”
kolla_internal_vip_address: “192.168.4.2”
# Valid options are [ qemu, kvm, vmware, xenapi ]
nova_compute_virt_type: “kvm”
network_interface: “eno1”
api_interface: “{{ network_interface }}”
neutron_external_interface: “eno2”
neutron_plugin_agent: “openvswitch”
enable_cinder: “yes”
enable_cinder_backend_iscsi: “no”
enable_cinder_backend_lvm: “yes”
enable_haproxy: “yes”
enable_heat: “yes”
glance_enable_rolling_upgrade: “no”
ironic_dnsmasq_dhcp_range:
tempest_image_id:
tempest_flavor_ref_id:
tempest_public_network_id:
tempest_floating_network_name:

如果采用外部ceph存储:

kolla_base_distro: “centos”

kolla_install_type: “binary”
openstack_release: “stein”
kolla_internal_vip_address: “192.168.4.2”
# Valid options are [ qemu, kvm, vmware, xenapi ]
nova_compute_virt_type: “qemu”
nova_backend_ceph: “yes”
network_interface: “eno1”
api_interface: “{{ network_interface }}”
neutron_external_interface: “eno2”
neutron_plugin_agent: “openvswitch”
enable_ceph: “no”
enable_cinder_backup: “yes”
cinder_backup_driver: “ceph”
enable_cinder: “yes”
enable_cinder_backend_iscsi: “no”
enable_cinder_backend_lvm: “no”
enable_haproxy: “yes”
enable_heat: “yes”
enable_sahara: “yes”
enable_trove: “yes”
cinder_backend_ceph: “yes”
glance_backend_ceph: “yes”
glance_enable_rolling_upgrade: “no”
ironic_dnsmasq_dhcp_range:
tempest_image_id:
tempest_flavor_ref_id:
tempest_public_network_id:
tempest_floating_network_name:

生成密码文件passwords.yml【控制节点】

这个密码文件可以使用工具自动生成,也可以手动输入但是手动输入需要注意格式,在:后需要空一格

再输入;而且ssh_key也比较麻烦所以推荐使用工具自动生成但是直接输入

[root@controller  ~]#kolla-genpwd

修改dashboard登录密码

[root@controller  ~]#vi /etc/kolla/passwords.yml

keystone_admin_password: admin

修改部署文件multinode【控制节点】

[root@controller  ~]#vim /home/multinode
[control]
controller
[network]
controller
[inner-compute]
[external-compute]
computer1
[compute:children]
inner-compute
external-compute
[monitoring]
controller
[storage]
computer1
[deployment]
localhost       ansible_connection=local

检查配置【控制节点】

[root@controller  ~]#kolla-ansible prechecks -i /home/multinode

配置SchedNova主机基础环境【控制节点】

[root@controller  ~]#kolla-ansible -i /home/multinode bootstrap-servers

部署OpenStack【控制节点】

[root@controller  ~]#kolla-ansible deploy -i /home/multinode

验证OpenStack安装【控制节点】

[root@controller  ~]#kolla-ansible post-deploy -i /home/multinode

OpenStack更新【控制节点】

### 修改镜像版本(此处不用更新,以后想更新版本再更新)

[root@controller  ~]# vim /etc/kolla/globals.yml
openstack_release: “stein”
[root@controller  ~]# kolla-ansible upgrade -i /home/multinode

重启所有应用【控制节点】

[root@controller  ~]#kolla-ansible -i /home/multinode reconfigure

环境还原【控制节点】

#如果安装有错误,想重新安装,可以选择如下操作

##将删除所有容器和卷

[root@controller  ~]#kolla-ansible destroy –yes-i-really-really-mean-it -i /home/multinode

生成 admin-openrc.sh【控制节点】

[root@controller  ~]#kolla-ansible post-deploy

初始demo【控制节点】

执行后会自动下载cirros镜像, 创建网络, 并创建一批测试虚拟机.

[root@controller  ~]#/usr/share/kolla-ansible/init-runonce

查询登录密码【控制节点】

[root@controller  ~]#grep admin /etc/kolla/passwords.yml

安装OpenStack命令行客户端【控制节点】

[root@controller  ~]#pip install python-openstackclient

创建实例到指定计算节点

  • 查看有效区域

[root@controller  ~]#openstack availability zone list

  • 查看有效主机列表

[root@controller  ~]#openstack host list

  • 查看有效计算节点列表

[root@controller  ~]#openstack hypervisor list

  • 查询网络id

[root@controller  ~]#openstack network list

  • 查看安全组

[root@controller  ~]#openstack security group list

  • 创建flavor

[root@controller  ~]#openstack flavor create –id 0 –vcpus 1 –ram 64 –disk 1 m1.nano
[root@controller  ~]#openstack flavor create –id 1 –vcpus 1 –ram 512 –disk 1 m1.tiny
[root@controller  ~]#openstack flavor create –id 2 –vcpus 1 –ram 2048 –disk 20 m1.small
[root@controller  ~]#openstack flavor create –id 3 –vcpus 2 –ram 4096 –disk 40 m1.medium
[root@controller  ~]#openstack flavor create –id 4 –vcpus 4 –ram 8192 –disk 80 m1.large
[root@controller  ~]#openstack flavor create –id 5 –vcpus 8 –ram 16384 –disk 160 m1.xlarg

  • 创建实例

[root@controller  ~]#openstack server create –flavor m1.nano \
–image cirros  \
–nic net-id=88b84388-40d2-48d9-b4ec-ab0dfa9b244e \
–security-group 5431def1-8856-4e48-ab02-50b9d459f9b1  \
–key-name mykey  \
–availability-zone nova:computer2:computer2  instance2

–flavor 实例类型

–image 镜像

–nic 网络 net-id网络id 第4步查得

 –availability-zone nova:compute1:compute1 前三步查得

compute1为指定计算节点。

结论

从上面的安装过程我们发现Kolla-Ansible来完成OpenStack安装过程非常的简洁,不需要过多修改OpenStack的配置文件,从而可以很轻松的完成部署和升级等操作。

参考资料

  1. OpenStack官网: openstack.org
  2. Kolla-Ansible项目官网:https://wiki.openstack.org/wiki/Kolla#Kolla
  3. Kolla-Ansible官网安装:https://docs.openstack.org/kolla-ansible/latest/

相关文章

技术手册-虚拟扩展本地局域网协议VXLAN


关注星融元


VXLAN全称Virtual eXtensible Local Area Network即虚拟扩展局域网,是由IETF定义的NVO3(Network Virtualization over Layer 3)标准技术之一,是对传统VLAN协议的一种扩展。VXLAN的特点是将L2的以太帧封装到UDP报文(即L2 over L4)中,并在L3网络中传输。

VXLAN的产生背景

数据中心规模的壮大,虚拟机数量的快速增长与虚拟机迁移业务的日趋频繁,给传统的“二层+三层”数据中心网络带来了新的挑战:

 虚拟机规模受网络设备表项规格的限制

对于同网段主机的通信而言,报文通过查询MAC表进行二层转发。服务器虚拟化后,数据中心中VM的数量比原有的物理机发生了数量级的增长,伴随而来的便是虚拟机网卡MAC地址数量的空前增加。一般而言,接入侧二层设备的规格较小,MAC地址表项规模已经无法满足快速增长的VM数量。

传统网络的隔离能力有限

VLAN作为当前主流的网络隔离技术,在标准定义中只有12比特,也就是说可用的VLAN数量只有4096。对于公有云或其它大型虚拟化云计算服务这种动辄上万甚至更多租户的场景而言,VLAN的隔离能力显然已经力不从心。

虚拟机迁移范围受限

虚拟机迁移,顾名思义,就是将虚拟机从一个物理机迁移到另一个物理机,但是要求在迁移过程中业务不能中断。要做到这一点,需要保证虚拟机迁移前后,其IP地址、MAC地址等参数维持不变。这就决定了,虚拟机迁移必须发生在一个二层域中。而传统数据中心网络的二层域,将虚拟机迁移限制在了一个较小的局部范围内。值得一提的是,通过堆叠、SVF、TRILL等技术构建物理上的大二层网络,可以将虚拟机迁移的范围扩大。但是,构建物理上的大二层,难免需要对原来的网络做大的改动,并且物理大二层网络的范围依然会受到种种条件的限制。

VXLAN采用L2 over L4(MAC-in-UDP)的报文封装模式,将二层报文用三层协议进行封装,可实现二层网络在三层范围内进行扩展,同时满足数据中心大二层虚拟迁移和多租户的需求。

VXLAN的发展历程

协议最早由VMware、Arisa网络、Cisco提出,后期加入华为、博科、Red Hat、Intel等公司支持,IETF于2012年8月发布第一个RFC Internet Draft版本,最新的标准是2014年8月RFC 7348。

VXLAN的相关概念

  • NVO3(Network Virtualization Over Layer3 3层之上的网络虚拟化)

基于IP Overlay的虚拟局域网络技术统称为NVO3。

  • NVE(Network Virtrualization Edge网络虚拟边缘节点)

是实现网络虚拟化的功能实体,VM里的报文经过NVE封装后,NVE之间就可以在基于L3的网络基础上建立起L2虚拟网络。网络设备实体以及服务器实体上的VSwitch都可以作为NVE。

  • VTEP(VXLAN Tunnel Endpoints,VXLAN隧道端点)

VXLAN网络的边缘设备,是VXLAN隧道的起点和终点,VXLAN报文的相关处理均在这上面进行。VTEP既可以是一个独立的网络设备,也可以是虚拟机所在的服务器。

  • VNI(VXLAN Network Identifier,VXLAN 网络标识符)

VNI类似VLAN ID,用于区分VXLAN段,不同VXLAN段的虚拟机不能直接二层相互通信。一个VNI表示一个租户,即使多个终端用户属于同一个VNI,也表示一个租户。VNI由24比特组成,支持多达16M((2^24-1)/1024^2)的租户。

  • VXLAN隧道

“隧道”是一个逻辑上的概念,它并不新鲜,比如大家熟悉的GRE。说白了就是将原始报文“变身”下,加以“包装”,好让它可以在承载网络(比如IP网络)上传输。从主机的角度看,就好像原始报文的起点和终点之间,有一条直通的链路一样。而这个看起来直通的链路,就是“隧道”。顾名思义,“VXLAN隧道”便是用来传输经过VXLAN封装的报文的,它是建立在两个VTEP之间的一条虚拟通道。

  • BD(bridge domain),vxlan转发二层数据报文的广播域,是承载vxlan数据报文的实体。类似于传统网络中VLAN的概念,只不过在VXLAN网络中,它有另外一个名字BD。不同的VLAN是通过VLAN ID来进行区分的,那不同的BD是通过VNI来区分的。
  • VXLAN报文格式

VXLAN报文格式

图1: VXLAN报文格式

VXLAN标准报文格式

图2:VXLAN标准报文格式

VXLAN的工作原理

VXLAN网络中的通信过程

结合如下示例简要说明VXLAN网络中的通信过程:

VXLAN通信过程

图3:VXLAN通信过程

图3中 Host-A 和 Host-B 位于 VNI 10 的 VXLAN,通过 VTEP-1 和 VTEP-2 之间建立的 VXLAN 隧道通信。

数据传输过程如下:

  • Host-A 向 Host-B 发送数据时,Host-B 的 MAC 和 IP 作为数据包的目标 MAC 和 IP,Host-A 的 MAC 作为数据包的源 MAC 和 IP,然后通过 VTEP-1 将数据发送出去。
  • VTEP-1 从自己维护的映射表中找到 MAC-B 对应的 VTEP-2,然后执行 VXLAN 封装,加上 VXLAN 头,UDP 头,以及外层 IP 和 MAC 头。此时的外层 IP 头,目标地址为 VTEP-2 的 IP,源地址为 VTEP-1 的 IP。同时由于下一跳是 Router-1,所以外层 MAC 头中目标地址为 Router-1 的 MAC。
  • 数据包从 VTEP-1 发送出去后,外部网络的路由器会依据外层 IP 头进行包路由,最后到达与 VTEP-2 连接的路由器 Router-2。
  • Router-2 将数据包发送给 VTEP-2。VTEP-2 负责解封数据包,依次去掉外层 MAC 头,外层 IP 头,UDP 头 和 VXLAN 头。
  • VTEP-2 依据目标 MAC 地址将数据包发送给 Host-B。

上面的流程我们看到 VTEP 是 VXLAN 的最核心组件,负责数据的封装和解封。

隧道也是建立在 VTEP 之间的,VTEP 负责数据的传送。

VTEP节点工作机制

通过以上通信步骤的描述可以看到,VTEP节点在VXLAN网络通信中起到了至关重要的作用。在VXLAN网络通信中,VTEP节的职责主要有3项:

  • 将虚拟网络通信的数据帧添加VXLAN头部和外部UDP和IP首部。
  • 将封装好的数据包转发给正确的VTEP节点。
  • 收到其他VTEP发来的VXLAN报文时,拆除外部IP、UDP以及VXLAN首部,然后将内部数据包交付给正确的终端。

对于功能2)的实现,即VXLAN数据包的转发过程。当VTEP节点收到一个VXLAN数据包时,需要根据内部以太网帧的目的MAC地址找到与拥有该目的地址的终端直接相连的VTEP地址,因此,这里需要一个目的MAC地址和VTEP节点IP地址的映射关系,VTEP节点利用一个转发表来存储此映射关系。转发表的格式为:<VNI, Inner Dst MAC,VTEP IP>,即给定VNI和目的MAC地址后映射到一个VTEP IP地址。

需要说明的是,映射VTEP节点IP地址时,之所以需要VNI的信息,是因为当存在多租户的情况下,各个租户将会独立组网,此时,多个租户设定的MAC地址有一定的概率会出现重叠,此时我们必须保证每个租户的网络都能独立地正常通信,因此,在为每个租户配置唯一的一个VNI的情况下,给定VNI和目的MAC地址,唯一确定一个VTEP地址。

下图4是一个样例,对于下图中的网络拓扑,分别给出了两个VTEP节点的转发表:

VTEP节点工作过程

图4:VTEP节点工作过程

上图中给出了6个终端,分别属于2个租户,其中,终端T1、T2和T4属于租户1,分配VNI为1,终端T3、T5和T6属于租户2,分配VNI为2,两个VTEP节点的转发表已在图中给出。

每一个VTEP节点都必须拥有完整的转发表才可以正确地进行转发的功能,转发表的学习过程可以基于这样一种简单的策略:通过ARP报文学习,当收到终端发送的数据帧时,首先根据收到数据的端口判定数据发送方的VNI值,根据VNI和数据帧中的目的MAC查找对应的VTEP节点,如果查找成功,则转发,否则,在当前VXLAN网络中广播ARP请求报文,这样,连接目的MAC终端的VTEP节点就会发送ARP回答报文,这样就学习到了新的转发表项。

需要说明的是,在多租户的环境下,基于信息安全等因素,各个租户的流量必须实现隔离,因此在发送广播ARP请求报文时,不可以直接在多租户的环境中广播,必须保证只有当前VXLAN网络的终端可以收到广播报文,因此,和物理网络中的ARP广播请求的实现有所不同,这里需要通过IP组播机制来模拟广播。

因此,VTEP节点还需要保存对应于每个租户的VNI值的组播域,即对于每一个VNI值,存储包含当前VXLAN网络中终端的所有VTEP节点的IP,用于ARP广播时的组播操作。

 VXLAN二层网关与三层网关

  • VXLAN二层网关:用于终端接入VXLAN网络,也可用于同一VXLAN网络的子网通信。
  • VXLAN三层网关:用于VXLAN网络中跨子网通信以及访问外部网络。

VXLAN集中式网关与分布式网关

根据三层网关部署方式的不同,VXLAN三层网关又可以分为集中式网关和分布式网关。

  • VXLAN集中式网关

集中式网关是指将三层网关集中部署在一台设备上,如下图所示,所有跨子网的流量都经过这个三层网关转发,实现流量的集中管理。

5VXLAN集中式网关

部署集中式网关的优点和缺点如下:

  • 优点:对跨子网流量进行集中管理,网关的部署和管理比较简单。
  • 缺点:转发路径不是最优:同一二层网关下跨子网的数据中心三层流量都需要经过集中三层网关绕行转发(如图中橙色虚线所示)。
  • ARP表项规格瓶颈:由于采用集中三层网关,通过三层网关转发的终端的ARP表项都需要在三层网关上生成,而三层网关上的ARP表项规格有限,这不利于数据中心网络的扩展。
  • VXLAN分布式网关

VXLAN分布式网关是指在典型的“Spine-Leaf”组网结构下,将Leaf节点作为VXLAN隧道端点VTEP,每个Leaf节点都可作为VXLAN三层网关(同时也是VXLAN二层网关),Spine节点不感知VXLAN隧道,只作为VXLAN报文的转发节点。如下图所示,Server1和Server2不在同一个网段,但是都连接到一个Leaf节点。Server1和Server2通信时,流量只需要在Leaf1节点进行转发,不再需要经过Spine节点。

部署分布式网关时:

  • Spine节点:关注于高速IP转发,强调的是设备的高速转发能力。
  • Leaf节点:作为VXLAN网络中的二层网关设备,与物理服务器或VM对接,用于解决终端租户接入VXLAN虚拟网络的问题。作为VXLAN网络中的三层网关设备,进行VXLAN报文封装/解封装,实现跨子网的终端租户通信,以及外部网络的访问。

VXLAN分布式网关

图6:VXLAN分布式网关

VXLAN分布式网关具有如下特点:

同一个Leaf节点既可以做VXLAN二层网关,也可以做VXLAN三层网关,部署灵活。

Leaf节点只需要学习自身连接服务器的ARP表项,而不必像集中三层网关一样,需要学习所有服务器的ARP表项,解决了集中式三层网关带来的ARP表项瓶颈问题,网络规模扩展能力强。

VXLAN在星融元交换机上的配置实例

下面实例中星融元的两台CX306交换机通过配置BGP EVPN来实现VXLAN网络的建立。

CX306交换机通过配置BGP EVPN来实现VXLAN网络的建立

全文请注册/登录后获取:https://asterfusion.com/d-20220617/

相关文章

技术手册-防火墙IP TABLES


关注星融元


IP Tables相关名词释义

  • iptablesiptables是一个用户空间工具,系统管理员可以通过它配置Linux内核防火墙的IP数据包的过滤规则,而这些规则的具体实现是由内核空间的netfilter完成的;
  • netfilternetfilter是4.x版本Linux内核开始引入的一个子系统,它作为一个通用的、抽象的框架,提供一套完整的hook函数管理机制,实现了诸如数据包过滤、网络地址转换和基于协议类型的连接跟踪等功能;
  • hook函数:Linux内核中的有一套hook函数机制,可在不同hook点位置监控网络数据包,并执行丢弃、修改等操作,Linux内核的网络防火墙就是通过此机制实现的。

IP Tables的发展历史

目前iptables已在2.4、2.6及3.0版本的Linux内核中集成,旧版的Linux内核则使用ipchains及ipwadm来达成类似的功能,而2014年1月19日起发行的新版Linux内核(3.13+)则使用nftables取代iptables。

  • Linux内核(2+):ipwadm;
  • Linux内核(2):ipchains;
  • Linux内核(4、2.6、3.0+):iptables;
  • Linux内核(13+):nftables。

iptables虽然强大但是不可能永远适用于当前的技术发展,任何技术都有其局限性。位于用户空间的iptables,也在被抛弃,RHEL7/CentOS7中已经不再直接使用iptables,而选择firewalld作为他的前端配置工具。

iptables已在Linux内核中集成

IP Tables原理简介

管理工具iptables是与内核网络协议栈中有包过滤功能的5个hook交互来完成工作的,这些内核hook构成netfilter框架。每个进出网络的包在经过协议栈时都会触发这些hook,数据包在内核中的处理路径如下图所示。

数据包在内核中的处理路径

通过iptables下发的规则,最终都会与上图中标注的5个hook点位关联。iptables将这些规则,按照不同的作用划分到不同的表中,按照划分常用的有raw、mangle、filter、nat四张表,即为四表。而关联在5个hook点位的有优先级顺序的规则链,即为五链。这种配置管理逻辑,也就是使用iptables的人都最为熟知的“四表五链”。

下面是iptables常用的四种table类型及其具体作用:

iptables常用的四种table类型

  • Filter table是最常用的table之一,用于判断是否允许一个包通过;
  • Nat table用于实现数据包的IP地址转换;
  • Mangle table用于修改包的IP头;
  • Raw tableiptables防火墙是有状态的,raw table其唯一目的就是让数据包绕过连接跟踪机制。

表和链的组织逻辑是:不同的表可以作用在不同的链(hook点位)中,在具体链中多种表之间又有优先级顺序,具体如下图所示,红色箭头方向表示各表的优先级顺序依次从高到低排列。

具体链中多种表之间又有优先级顺序

我们通过iptables下发的规则就放置在特定table的特定chain里面,当chain被触发调用的时候,包会依次匹配chain里面的规则,每条规则都有一个匹配部分和一个动作部分。规则的匹配部分指定了一些条件,数据包必须满足这些条件才会和将要执行的动作进行关联。匹配系统非常灵活,还可以通过iptables extension扩展其功能。规则可以匹配协议类型、源目地址、源目端口、源目网段、接收或发送的网卡、协议头、连接状态等条件。这些综合起来,能够组合成非常复杂的规则来区分不同的网络流量。

总结

netfilter包过滤框架和iptables是Linux服务器上大部分防火墙解决方案的基础。其中,netfilter的内核hook与Linux内核协议栈配合得足够紧密,提供了数据包在经过系统时的强大控制能力。而iptables正是基于这些能力提供了一个灵活的、可扩展的、将策略需求转化到内核的方法。理解了这些不同部分是如何联系到一起的,就可以使用iptables创建出可靠的防火墙策略。

IP Tables的应用场景

通过上文可以清楚地了解到,iptables其实是存在于操作系统应用层,作为配置内核中安全框架netfilter的一个客户端。通过iptables可以实现常规防火墙的几乎所有的功能,包括但不限于:

  • 提供基于状态的源目IP地址、源目端口、访问时间等维度的访问控制;
  • 提供双向NAT能力,配合Linux的网络工具可以在网络出口实现链路负载均衡功能;
  • 利用iptables的limit模块,可以实现轻量的DDoS攻击防护;
  • 利用iptables的connlimit模块,可以防护CC攻击;
  • 利用iptables的string模块,对数据包中的内容进行检查,实现报文深度过滤或者数据脱敏功能;
  • 按需管理iptables的日志,可以为不同规则设置不同的日志标识,以便灵活记录数据流日志。

除了作为常规的主机/网络防火墙外,iptables也作为重要的网络组成部分,存在于Docker、K8S、OpenStack的Neutron项目以及众多成熟且应用广泛的开源项目中。

IP Tables的部署实例

首先,简单了解下iptables命令的语法格式,命令格式可分解为如下几部分。

iptables -t <table> <cmd> <pattern> <action>

其中,-t <table>或–table <table>选项用来指定要查看或修改的表(raw、mangle、nat、filter),命令行在不使用-t参数时默认为filter表。<cmd>部分可选择对规则要进行的操作,即增删改查操作,<pattern>为规则的匹配部分,<action>为安全规则的动作部分,对匹配到的数据包做指定的动作。

  1. 屏蔽指定IP地址:若发现某个恶意攻击者并确定其IP地址,此时可以使用如下命令将指定IP的数据包丢弃。

BLOCK_THIS_IP=”x.x.x.x”

iptables -A INPUT -i eth0 -p tcp -s “$BLOCK_THIS_IP” -j DROP

此命令行,<cmd>部分使用-A INPUT参数将屏蔽规则插入到filter表(默认)的INPUT链尾。

  1. 网卡流量转发:如果在某些场景下使用服务器作为网关,则可能需要两张网卡分别接内网和公网,然后需要将内网的网卡流量转发到连接到公网的网卡中,可以使用iptables实现此功能,命令行如下所示。

iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT

  1. 端口流量转发:若需要进行端口级别的流量转发,使用iptables同样可以完成,此命令会将2222端口流量转发到22。

iptables -t nat -A PREROUTING -p tcp -d 192.168.1.5 –dport 2222 -j DNAT –to 192.168.1.5:22

  1. 使用扩展模块实现WEB流量简单负载:下面将使用nth扩展模块,将80端口流量负载均衡到三台服务器。

iptables -A PREROUTING -i eth0 -p tcp –dport 80 -m state –state NEW -m statistic –mode nth –every 3 –packet 0 -j DNAT –to-destination 192.168.1.11:80

iptables -A PREROUTING -i eth0 -p tcp –dport 80 -m state –state NEW -m statistic –mode nth –every 2 –packet 0 -j DNAT –to-destination 192.168.1.12:80

iptables -A PREROUTING -i eth0 -p tcp –dport 80 -m state –state NEW -m statistic –mode nth –every 1 –packet 0 -j DNAT –to-destination 192.168.1.13:80

在上面的命令行中,采用statistic模块的nth模式来实现轮询的负载均衡效果,参数含义如下:

  • –every n表示每n个命中就会真正执行一次;
  • –packet p表示在这条规则的第几次命中时真正执行(0<=p<=n-1)。

需要注意的是,每条规则有独立的计数器,因此-m statistic –mode nth –every 3 –packet 0表示每三个包触发一次动作,在第0次命中时执行动作,在第1次和第2次命中后不触发动作,而是将数据包交给下一条规则处理。同理,第二个包的匹配规则为-m statistic –mode nth –every 2 –packet 0,第三个包的匹配规则为-m statistic –mode nth –every 1 –packet 0。

  1. 使用扩展模块实现DDoS流量清洗:下面将使用limit扩展模块,来实现简单的DDoS攻击流量清洗。

iptables -A INPUT -p tcp –dport 80 -m limit –limit 5/minute –limit-burst 100 -j ACCEPT

       关于limit限速模块,各参数的含义如下:

  • –limit n/s表示s时间段内会新签发n个令牌,时间单位有秒、分、时、天;
  •  –limit-burst m表示初始令牌数量以及令牌桶的最大容量。

IP Tables的配置总结

IP Tables的配置

相关文章

对星融元产品感兴趣?

立即联系!

返回顶部

© 星融元数据技术(苏州)有限公司 苏ICP备17070048号-2