麦斯科技 · 2022年01月15日

使用GitHub操作和基于Arm的Kubernetes群集自动扩展CI/CD部署

https://community.arm.com/arm-community-blogs/b/infrastructure-solutions-blog/posts/github-action-runners-on-arm-based-kubernetes-clusters
Pranay Bakre 2022年1月6日

GitHub是最流行的基于Git的源代码管理和DevOps工具之一。GitHub拥有超过7300万开发人员社区(1),在2020年创建了超过1.7亿个pull请求和6100多万个新存储库。它是一个代码托管平台,允许开发人员在项目中协同工作。GitHub Actions(一组帮助自动化软件开发任务的命令)为其SCM系统添加了CI/CD功能。现在,开发人员可以在他们的存储库中构建和测试他们的代码。

运行程序是安装了GitHub Actions runner应用程序的服务器。您可以使用GitHub托管的运行程序,也可以托管自己的运行程序。运行程序侦听可用作业,一次运行一个作业,并向GitHub报告进度、日志和结果。CI/CD(持续集成、持续交付)是DevOps成功实践的关键。通过GitHub操作,开发人员可以运行CI并构建、测试和部署应用程序。

GitHub引入了对基于Arm Neoverse的自托管GitHub操作运行程序的支持,使开发人员能够以本机方式将基于AWS Graviton2的Amazon EC2实例添加到其CI/CD工作流中。

AWS Graviton处理器由Amazon Web Services定制,使用64位Arm Neoverse内核,为运行在Amazon EC2中的云工作负载提供最佳性价比。它们为Amazon EC2通用(M6g、M6gd、T4g)、计算优化(C6g、C6gd、C6gn)和内存优化(R6g、R6gd、X2gd)实例提供了动力,这些实例与当前基于x86的同类实例相比,为各种工作负载提供了高达40%的性价比。其中包括应用服务器、微服务、高性能计算、基于CPU的机器学习推理、视频编码、电子设计自动化、游戏、开源数据库和内存缓存。

GitHub操作允许您在自托管运行程序的帮助下执行和自动化其CI/CD工作流。开发人员可以在基于Arm的GitHub操作运行程序上设置代码管道和构建/测试应用程序。这使开发人员能够使用多拱形管道,但是,当跑步者不在使用且处于闲置状态时,他们会产生巨大的成本。使用基于Arm的AWS Graviton2实例,客户可以从比基于x86的同类实例低20%的成本中获益。当运行程序通过代码管道的执行进行动态管理时,节省的资源将大大增加。

用例:使用GitHub操作和基于Arm的Kubernetes集群自动扩展CI/CD部署

在下图中,我们展示了开发人员如何在AWS Gravion2实例上利用基于Arm的GitHub Action Runner(GHA)扩展他们的CI/CD实践:

  • GHA运行程序在代码提交时自动部署,执行作业,并在管道完成时销毁
  • 这种自主的流程消除了保持基于云的静态跑步者的需要,从而降低了成本
  • GitHub存储库承载Wordpress应用程序的源代码。当代码更改提交到存储库时,GHA运行程序将自动部署并拾取构建作业
  • 运行程序执行代码,构建容器映像,将其推送到AmazonECR注册表,并在基于Arm的AmazonEKS集群中部署容器
  • 该集群在基于Arm Neoverse的Amazon EC2 M6g实例上运行

pastedimage1640027638001v1.png

请看以下视频,其中显示了此用例的DevOps工作流:

使用GitHub操作和基于Arm的Kubernetes群集自动扩展CI/CD部署_哔哩哔哩_bilibili

https://www.bilibili.com/video/BV1BL411c75r/

配置

先决条件

  • Amazon EKS群集和基于AWS Graviton2的工作节点
  • 已配置AWS CLI
  • 创建Lambda函数的IAM角色
  • 已创建GitHub帐户访问和回购

按照以下步骤创建操作运行程序的映像:

导航到基于Arm的EC2实例(M6g.large)的主目录。它通常是以下目录-

/home/ec2-user

使用以下命令安装expect和jq:

sudo yum update -y
sudo yum install jq, expect -y

安装docker并为ec2用户提供所需的权限。

使用以下命令创建runner文件夹并将当前目录更改为该文件夹。

mkdir actions-runner; cd actions-runner

使用以下命令下载新的runner软件包:

curl -O -L https://github.com/actions/runner/releases/download/v2.273.2/actions-runner-linux-arm64-2.280.1.tar.gz

将运行程序的二进制文件解压缩到使用下一个命令创建的文件夹:

tar xzf ./actions-runner-linux-arm64-2.280.1.tar.gz

导航到/home/ec2用户/actions运行程序。使用文本编辑器创建文件脚本。exp并粘贴此文件的内容。使用cat命令验证内容:

GHA1.png

编辑并添加脚本和二进制文件后,退出ssh连接并导航回EC2 Dashboard。创建EC2实例的AMI。此时将创建跑步者图像。我们将其与Lambda函数一起使用,如下所述

为GitHub操作运行程序创建AWS Lambda函数

在AWS控制台中,导航至AWS Lambda,并在仪表板上选择创建功能。为函数提供名称,选择Python 2.7 runtime并选择IAM角色

在功能中,向下滚动至基本设置并选择编辑。将处理程序设置为“lambda_function.lambda_to_ec2”并保存它。

GHA2.png

在功能代码中,请添加此脚本并使用相关环境详细信息进行更新。

向上滚动并保存更改。

在同一屏幕上,向下滚动至触发器。选择添加触发器。

GHA3.png

选择API网关。创建一个基于HTTP API类型、安全类型和默认部署阶段的API。

GHA4.png

创建触发器后,我们应该能够在Designer部分中看到详细信息。在这里,我们可以找到API端点。

GHA5.png

现在,让我们创建一个GitHub Webhook来触发Lambda函数。

在我们的GitHub repo中,导航到设置,然后选择Webhooks

选择AddWebhook并将API网关端点添加到有效负载URL部分。创建webhook之后,每次推送到存储库时都会触发lambda函数。

GHA6.png

Kubernetes工作流

在image builder实例上,通过安装docker、awscli和kubectl确保满足先决条件。

使用您选择的文本编辑器编辑脚本。通过添加一个Pod runner标记来扩展文件。

在image builder VM上,请导航到actions runner文件夹。

GHA7.png

现在使用文本编辑器创建selfconfig。sh脚本。此脚本将在未来的runner容器上安装所需的工具。现在我们添加一个脚本,它是docker容器的入口点。使用您选择的文本编辑器并创建runner。sh脚本。

现在,让我们使用此内容创建docker文件并构建docker映像。标记图像,如下所示

docker build ./ -t arm-runner

为runner映像创建AWS ECR存储库。在AWS管理控制台中,导航到Elastic Container Registry页面,并为docker映像创建存储库。

创建存储库后,转到image builder实例并登录到ECR并推送docker映像。

现在,让我们创建一个优秀的跑步者。它是一款基于AWS Gravion2的actions runner,可将吊舱跑步器部署到EKS。我们可以使用Lambda函数来部署吊舱。

让我们通过使用AMI克隆现有的映像生成器机器来创建主生成器。

使用GitHub注册主运行程序,并使用以下命令添加主运行程序标记。


OKEN=$(/usr/bin/curl --user "<GitHub username>:<GitHub PAT>" -X POST -H "Accept: application/vnd.github.v3+json" https://api. github.com/repos/<username>/<repository name>/actions/runners/registration-token | /usr/bin/jq '.token' | /usr/bin/awk -F\\" '{print $2}')

echo $TOKEN > /home/ec2-user/actions-runner/token.file chmod 755 /home/ec2-user/actions-runner/token.file ./config.sh --token $TOKEN

GHA9.png

使用同一页面将Pod runner标记添加到runner占位符。

执行以下命令:

sudo ./svc.sh install

sudo ./svc.sh start

master runner 已经准备好了。现在,让我们创建Kubernetes作业清单来部署运行程序。创建job runner。包含此内容的yaml文件。

在我们的存储库中,让我们创建一个CI YAML文件wf CI.yaml:

<Repo Name>/.github/workflows/.

在这个yaml文件中,我们将工作流分为两个作业。主构建作业在主运行程序上运行,主运行程序将pod运行程序部署到EKS集群。runnerbuild作业在Pod runner上运行,因此它会一直排队,直到包含该runner的容器部署到EKS。出于演示目的,它为20sec运行一个简单的sleep命令。要使用特定工具运行某些特定任务,应将这些工具添加到runner的Dockerfile中。

GHA10.png

要启动工作流,请通过添加新文件向存储库提交更改。提交更改后,导航到GitHub存储库页面的Actions选项卡。

我们将首先看到主构建作业运行,然后runnerbuild作业正在等待runner容器。部署runner容器后,runnerbuild作业将启动。

GHA11.png

GHA12.png

我们还可以在GitHub页面的跑步者列表中看到新部署的pod跑步者。两个作业完成后,pod runner将自动从GitHub中移除。

GHA13.png

结论

如上所示,我们可以使用自托管GitHub Actions runner在基于AWS Gravion2的EC2实例上构建CI/CD系统。它可以帮助将构建组件的总体成本降低20%。通过向现有CI/CD基础架构中添加自动扩展和按需功能,我们可以减少配置静态运行程序的需要,从而产生额外的成本。如果您对GitHub Actions runner on Arm有任何其他意见、问题或担忧,请随时联系我们。

https://developer.arm.com/solutions/infrastructure?_ga=2.6830262.583686063.1642241837-1759771560.1612011439

推荐阅读
关注数
5822
内容数
525
定期发布Arm相关软件信息,微信公众号 ArmSWDevs,欢迎关注~
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息