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实例上运行
请看以下视频,其中显示了此用例的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命令验证内容:
编辑并添加脚本和二进制文件后,退出ssh连接并导航回EC2 Dashboard。创建EC2实例的AMI。此时将创建跑步者图像。我们将其与Lambda函数一起使用,如下所述
为GitHub操作运行程序创建AWS Lambda函数
在AWS控制台中,导航至AWS Lambda,并在仪表板上选择创建功能。为函数提供名称,选择Python 2.7 runtime并选择IAM角色
在功能中,向下滚动至基本设置并选择编辑。将处理程序设置为“lambda_function.lambda_to_ec2”并保存它。
在功能代码中,请添加此脚本并使用相关环境详细信息进行更新。
向上滚动并保存更改。
在同一屏幕上,向下滚动至触发器。选择添加触发器。
选择API网关。创建一个基于HTTP API类型、安全类型和默认部署阶段的API。
创建触发器后,我们应该能够在Designer部分中看到详细信息。在这里,我们可以找到API端点。
现在,让我们创建一个GitHub Webhook来触发Lambda函数。
在我们的GitHub repo中,导航到设置,然后选择Webhooks
选择AddWebhook并将API网关端点添加到有效负载URL部分。创建webhook之后,每次推送到存储库时都会触发lambda函数。
Kubernetes工作流
在image builder实例上,通过安装docker、awscli和kubectl确保满足先决条件。
使用您选择的文本编辑器编辑脚本。通过添加一个Pod runner标记来扩展文件。
在image builder VM上,请导航到actions runner文件夹。
现在使用文本编辑器创建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
使用同一页面将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中。
要启动工作流,请通过添加新文件向存储库提交更改。提交更改后,导航到GitHub存储库页面的Actions选项卡。
我们将首先看到主构建作业运行,然后runnerbuild作业正在等待runner容器。部署runner容器后,runnerbuild作业将启动。
我们还可以在GitHub页面的跑步者列表中看到新部署的pod跑步者。两个作业完成后,pod runner将自动从GitHub中移除。
结论
如上所示,我们可以使用自托管GitHub Actions runner在基于AWS Gravion2的EC2实例上构建CI/CD系统。它可以帮助将构建组件的总体成本降低20%。通过向现有CI/CD基础架构中添加自动扩展和按需功能,我们可以减少配置静态运行程序的需要,从而产生额外的成本。如果您对GitHub Actions runner on Arm有任何其他意见、问题或担忧,请随时联系我们。