在K8s上运行GitHub Actions的自托管运行器

news2024/11/27 12:40:08

1:添加Actions Runner Controller的Helm仓库

helm repo add actions-runner-controller https://actions-runner-controller.github.io/actions-runner-controller
helm repo update

2:创建GitHub Personal Access Token (PAT)

  1. 登录到你的GitHub账户。
  2. 访问设置页面,找到“Developer settings”部分。
  3. 在“Personal access tokens”中生成一个新的访问令牌,赋予它repo和admin:org的权限。

3:创建Kubernetes Secret

使用你的GitHub PAT创建一个Kubernetes Secret,以便Actions Runner Controller可以访问GitHub API。

# 创建命名空间
kubectl create namespace actions-runner-system
kubectl create secret generic actions-runner-controller-manager   -n actions-runner-system   --from-literal=github_token=<YOUR_GITHUB_TOKEN>
kubectl create secret generic controller-manager \
  -n actions-runner-system \
  --from-literal=github_token=<YOUR_GITHUB_TOKEN> # <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>

4:配置Helm values

下载Actions Runner Controller的默认配置文件,并根据需要进行修改,特别是添加Docker Pull Secret。

helm show values actions-runner-controller/actions-runner-controller --version 0.23.7 > values.yaml
# 目前只查看了下不知道配啥

5:安装Actions Runner Controller

使用Helm安装Actions Runner Controller到你的Kubernetes集群。

helm upgrade -i actions-runner-controller actions-runner-controller/actions-runner-controller \
  --version 0.23.7 \
  -n actions-runner-system

输出:

Release "actions-runner-controller" does not exist. Installing it now.
NAME: actions-runner-controller
LAST DEPLOYED: Mon Aug 26 16:14:06 2024
NAMESPACE: actions-runner-system
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
1. Get the application URL by running these commands:
  export POD_NAME=$(kubectl get pods --namespace actions-runner-system -l "app.kubernetes.io/name=actions-runner-controller,app.kubernetes.io/instance=actions-runner-controller" -o jsonpath="{.items[0].metadata.name}")
  export CONTAINER_PORT=$(kubectl get pod --namespace actions-runner-system $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}")
  echo "Visit http://127.0.0.1:8080 to use your application"
  kubectl --namespace actions-runner-system port-forward $POD_NAME 8080:$CONTAINER_PORT

(X) 6:创建 Runner(不推荐)

不推荐原因:使用下面这种方式创建的runner,一次作业后就会销毁。我在Rancher中发现deploy-web-dev-runner的状态是notReady并找了很久的原因,因此最好不要用这种方式创建Runner。需要创建可以去看看步骤8
Rancher deploy-web-dev-runner截图
执行下面的命令,创建一个名为 deploy-web-dev-runner 的 Runner CR。

kubectl apply -f - <<EOF                 
apiVersion: actions.summerwind.dev/v1alpha1
kind: Runner
metadata:
  name: deploy-web-dev-runner
  namespace: actions-runner-system
spec:
  repository: mingchangge/deployWeb
  env: []
EOF

查看Runner

kubectl get runner -n actions-runner-system deploy-web-dev-runner

输出:

NAME                    ENTERPRISE   ORGANIZATION   REPOSITORY              GROUP   LABELS   STATUS    MESSAGE   WF REPO   WF RUN   AGE
deploy-web-dev-runner                               mingchangge/deployWeb                    Running                                15s

在项目仓库的 Settings/Actions/Runners 中可以看到同名的 Runner,处于 idle 状态。
github项目Runner截图

deploy-web-dev-runner没有指定namespace,则Runner建立在默认命名空间即default。
删除建立在默认命名空间资源的命令: kubectl delete runner deploy-web-dev-runner

7:项目推送

在你的GitHub Actions workflow中,将 runs-on 指定为 [self-hosted, linux, X64]后推送项目,Runner运行。
runs-on修改截图
最后runner运行成功
只是作业运行结果结果失败,报错如下:(Runner执行的机器中缺少node所以不识别npm命令,整个docker私有镜像安装node或许可以解决,目前不想直接在服务器中安装node。这个问题我目前一脑门子浆糊,往后稍稍。)

...
Run echo "npm install"
npm install
/runner/_work/_temp/aadcc564-e286-4996-8f54-5e0824cc9863.sh: line 3: npm: command not found
Error: Process completed with exit code 127.

7.1:排错

runner运行完2天后再次修改前端项目,推送github后,忽然发现作业找不到机器执行,github settings/Actions的Runner列表也没有之前部署的Runner了,截图如下:
Runner执行作业:
Runner执行作业
github项目settings/Actions/runners:
github项目settings/Actions
查看pod状态
kubectl get pods -n actions-runner-system
输出:

NAME                                         READY   STATUS     RESTARTS   AGE
actions-runner-controller-5c996cd9c7-gqm5g   2/2     Running    0          2d19h
deploy-web-dev-runner                        1/2     NotReady   0          2d1h

kubectl describe pod deploy-web-dev-runner -n actions-runner-system
kubectl logs deploy-web-dev-runner -n actions-runner-system
kubectl get pods deploy-web-dev-runner -n actions-runner-system -o jsonpath='{.status.containerStatuses[*].ready}'
get pods deploy-web-dev-runner -n actions-runner-system -o jsonpath='{.status.containerStatuses[*].name}'
kubectl get pods deploy-web-dev-runner -n actions-runner-system -o yaml
以上命令均没有输出什么有价值的错误信息导致的Runner notReady,再根据 kubectl describe pod 命令的输出,deploy-web-dev-runner Pod 中的 runner 容器已经终止,状态为 Terminated,并且其退出状态是 Completed 退出码为 0。这表明容器已经成功执行并正常退出。但是,由于容器已经终止,它不会对 Ready 探针做出响应,因此 Kubernetes 报告该容器状态为 NotReady。从执行上来看runner 容器是个一次性任务执行器,NotReady 状态可能不是一个问题,而只是容器生命周期的一个正常部分。

8:创建可重用 Runner

根据网上的参考资料进行下一步创建可重用 Runner

kubectl apply -f - <<EOF
apiVersion: actions.summerwind.dev/v1alpha1
kind: RunnerDeployment
metadata:
  name: deploy-web-dev-runner
  namespace: actions-runner-system
spec:
  template:
    spec:
      repository: mingchangge/deployWeb
      env: []
EOF

参考文章有言在先,怪我自己没有耐心看完。

actions-runner-controller 提供了三种 CRD:

  • Runner:可以理解为 Pod,该 Runner 只能执行一次作业。
  • RunnerDeployments:可以理解为Deployment,可以设置要创建的 Runner 数量。Runner 在执行完作业后会销毁,然后 Controller 会创建新的Runner 等待作业调度。
  • RunnerSets:可以理解为 StatefulSet,也是基于 StatefulSet 来创建 Pod(即Runner),提供 StatefulSet 的特性。
    更多用法,可以参考 actions-runner-controller 官方文档。

创建完可重用Runner,推送项目,发现创建的runner比之前多了一些后缀。
可重用Runner
之前的推送处理完成后,本次推送才开始进行处理。
runner运行情况
多个请求推送去 Actions 列表会发现,只有一个作业在运行,其他都是 queued 的等待状态。只有等前面的作业执行完成后,后一个作业才会被执行。
Actions 作业列表
由上图可知执行多个任务时,任务需要排队等候不支持并发。但是actions-runner-controller 在 3 个 Runner 的 CRD 之外,还提供了类似 HPA(水平 pod 自动扩缩容) 的 CRD HorizontalRunnerAutoscaler,简称 HRA。
HRA 可以根据指标 PercentageRunnersBusy 或者 TotalNumberOfQueuedAndInProgressWorkflowRuns 来对 runner 进行扩缩容,或者基于 GitHub Events(webhook)来进行扩缩容。这两种都各有优缺点,前者指标是通过 GitHub API 轮训等待的作业数,实现简单,但时效性差;后者基于事件触发时效性更佳,但是实现复杂,需要对外暴露访问端点接收 GitHub Event。
下面的参考的文章是使用前一项的,所以我准备试试Webhook 驱动扩展,成不成功的先做个记录。

(X)9:Webhook 驱动扩展

失败原因:转来转去又回到了原点,我的服务器连接不了外网,webhook timeout。目前两种解决方式可行:一、使用内网穿透工具如Ngrok,将内网的服务暴露到公网上,从而允许外部访问,不太好的方案;二、开个ssh隧道连接,但又一时找不到可用的服务器,此操作搁置。暂时不扩容了已经卡了很久很久,还是继续往下进行吧。

使用自定义 Kubernetes 入口控制器:

在actions-runner-system命名空间上创建一个新的部署和一个用于接收 Github Webhooks 的服务

helm upgrade --install --namespace actions-runner-system --create-namespace \
             --wait actions-runner-controller actions-runner-controller/actions-runner-controller \
             --set "githubWebhookServer.enabled=true"

输出:

Release "actions-runner-controller" has been upgraded. Happy Helming!
NAME: actions-runner-controller
LAST DEPLOYED: Fri Aug 30 10:48:23 2024
NAMESPACE: actions-runner-system
STATUS: deployed
REVISION: 2
TEST SUITE: None
NOTES:
1. Get the application URL by running these commands:
  export POD_NAME=$(kubectl get pods --namespace actions-runner-system -l "app.kubernetes.io/name=actions-runner-controller,app.kubernetes.io/instance=actions-runner-controller" -o jsonpath="{.items[0].metadata.name}")
  export CONTAINER_PORT=$(kubectl get pod --namespace actions-runner-system $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}")
  echo "Visit http://127.0.0.1:8080 to use your application"
  kubectl --namespace actions-runner-system port-forward $POD_NAME 8080:$CONTAINER_PORT

创建名为arc-webhook-server.yaml的Ingress 文件

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: actions-runner-controller-github-webhook-server
  namespace: actions-runner-system
  annotations:
    nginx.ingress.kubernetes.io/backend-protocol: "HTTP"
spec:
  ingressClassName: nginx # 使用这个字段来指定Ingress控制器
  tls:
  - hosts:
    - rancher.lxq.com
    secretName: tls-rancher-ingress
  rules:
    - http:
        paths:
          - path: /actions-runner-controller-github-webhook-server
            pathType: Prefix
            backend:
              service:
                name: actions-runner-controller-github-webhook-server
                port:
                  number: 8090
kubectl apply -n actions-runner-system -f arc-webhook-server.yaml

GitHub新增webhook

  1. 配置 GitHub 开始向您发送 webhook,请转到您的存储库或组织的设置(Settings)页面,单击Webhooks后单击Add webhook。
  2. 使用您刚刚创建的 webhook URL 设置“Payload URL”字段,如果您遵循上面的示例,则 URL :
    https://${您自己的域名}/actions-runner-controller-github-webhook-server
  3. 点击“内容类型”并选择application/json。
  4. 点击“让我选择单个事件”并选择Workflow Jobs(我还选了几个其他的)。
  5. 点击Add Webhook。
    GitHub新增webhook
    创建完成后发现webhooke不能正常工作
    webhooke
    无效尝试
    创建一个针对节点端口的外部负载均衡器,该service一直是Pending状态。
  • vi webhook-service.yaml
    apiVersion: v1
    kind: Service
    metadata:
      name: webhook-service
      namespace: actions-runner-system # 或者是你的命名空间
    spec:
      type: LoadBalancer
      externalIPs:
    	- 192.168.XX.XXX
      selector:
         app.kubernetes.io/instance: actions-runner-controller-github-webhook-server
         app.kubernetes.io/name: actions-runner-controller
         pod-template-hash: 6b4f5cf858
      ports:
        - appProtocol: http
          name: http
          nodePort: 30080
          port: 8090
          protocol: TCP
          targetPort: http
    
  • kubectl apply -f webhook-service.yaml
    kubectl get service webhook-service -n actions-runner-system
    # 输出:
    NAME              TYPE           CLUSTER-IP     EXTERNAL-IP      PORT(S)          AGE
    webhook-service   LoadBalancer   10.96.127.64   <pending>   8090:30080/TCP   95m
    

参考

在 Kubernetes 上运行 GitHub Actions Self-hosted Runner
在 Kubernetes 上执行 GitHub Actions 流水线作业
automatically-scaling-runners.md

补充内容:

k8s小白使用命令记录:

查看 ingress配置

kubectl describe ingress -n cattle-system

查看secret

kubectl get secret tls-rancher-ingress -n cattle-system -o yaml

查看使用`kubectl apply -f 命令创建Kubernetes资源的命名空间

当你使用kubectl apply -f命令创建Kubernetes资源时,资源的命名空间通常在YAML文件中指定。要查看或确认通过这种方式创建的资源的命名空间,你可以:

  1. 直接查看YAML文件:
    在YAML文件中查找metadata部分,看是否有namespace字段。例如:

    metadata:
      name: my-resource
      namespace: my-namespace
    

    如果namespace字段存在,那么资源就被创建在了这个命名空间内。如果namespace字段不存在,那么资源将被创建在当前的kubectl上下文中所设置的命名空间内,通常这会是default命名空间。

  2. 使用kubectl get命令:
    你也可以使用kubectl get命令并指定-A--all-namespaces参数来查看所有命名空间中的资源。例如,要查看所有命名空间中的所有资源,可以运行:

    kubectl get all --all-namespaces
    

    从输出中,你可以找到你创建的资源,并看到它所在的命名空间。

  3. 使用kubectl config命令:
    如果你想要知道当前kubectl上下文的命名空间,可以使用:

    kubectl config current-context
    

    然后查看你的.kube/config文件中当前上下文的namespace字段。但是,这方法只能确认当前默认的命名空间,对于直接在YAML文件中指定的命名空间,还是需要查看YAML文件。

删除使用`kubectl apply -f 命令创建Kubernetes资源

使用kubectl apply -f命令创建的Kubernetes资源,可以通过kubectl delete命令或者再次使用apply命令来删除。下面是两种删除资源的方法:

1. 使用kubectl delete

如果已知资源类型和名称,可以直接使用delete命令:

kubectl delete <resource-type> <resource-name> --namespace=<namespace>

这里,你需要将<resource-type>替换为资源的类型(如deployment, service, pod等),<resource-name>替换为资源的名称,<namespace>替换为资源所在的命名空间。如果资源在默认命名空间中,可以省略--namespace=<namespace>部分。

例如,删除名为my-service的服务:

kubectl delete service my-service

如果删除的是由YAML文件创建的资源,而你不知道资源的确切类型或名称,可以通过YAML文件来删除:

kubectl delete -f <path-to-file>

<path-to-file>替换为YAML文件的路径。

2. 使用kubectl apply--delete-collection

如果你使用的是kubectl apply,并且你的YAML文件中包含多个资源定义,你可以通过添加--delete-collection标志来删除由该文件创建的所有资源。但要注意,这通常用于清理整个资源集合,并且可能不保留状态数据,所以在生产环境中使用时要格外小心。

kubectl apply -f <path-to-file> --delete-collection --force

这里,--delete-collection选项告诉kubectl删除与YAML文件匹配的所有资源,--force则确保即使有运行中的Pod也会被强制删除。

--delete-collection并不是kubectl apply的标准行为,它用于清理不再存在的资源。如果你的YAML文件只定义了一个资源,或者你只是想要删除一个特定的资源,使用kubectl delete会更直接和安全。

示例

假设你有一个名为deployment.yaml的文件,其中定义了一个名为web的deployment和一个名为web-service的服务。

要删除由这个文件创建的所有资源,可以使用:

kubectl delete -f deployment.yaml

或者,如果你想使用apply来删除:

kubectl apply -f deployment.yaml --delete-collection --force

但请注意,--delete-collection--force的使用要谨慎,确保你理解其行为和可能的后果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2100071.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SQL语句(数据更新、查询操作)

数据库表操作 创建数据库语法格式 create table 表名(字段名1 类型 约束&#xff0c;字段名2 类型 约束&#xff0c;..... ..... )创建学生表&#xff0c;字段要求如下&#xff1a; 姓名&#xff08;长度为10&#xff09;、年龄、身高&#xff08;保留2位小数&#xff09; cre…

安卓shiply热更新入门

目录 一。我的开发环境 二。集成shiply热更新sdk 三。编写代码 1。创建一个CustomRFixLog类 2。创建一个MyApplication类 3。配置AndroidManifest.xml 4。创建一个新的Activity继承AbsRFixDevActivity 用于测试 四。登录shiply后台配置 1。创建项目 五。制作补丁 1。在app…

Ae关键帧动画基础练习-街道汽车超车

目录 1.让背景向左移动 2.让小红车匀速移动 3.实现小黄车的超车 完成街道汽车超车的一个简单动画&#xff0c;背景向左移动看起来就如同画面向右移动了一般&#xff0c;根据这个原理&#xff0c;可以完成这个动画。 导入素材时&#xff0c;要选择不同的图层&#xff0c;这样…

微软AD替代方案统一管理Windows和信创电脑的登录认证与网络准入认证

自国资委79号文明确了2027年底前信息系统全面国产化的目标后&#xff0c;金融单位、央国企集团及各子公司纷纷加大国产化改造力度。不少子、孙公司表示&#xff0c;集团要求到2024年底或2025年底国外的关键IT基础设施要停止使用&#xff0c;如微软AD、云桌面等。 信创国产化是大…

Mybatis链路分析:JDK动态代理和责任链模式的应用

背景 此前写过关于代理模式的文章&#xff0c;参考&#xff1a;代理模式 动态代理功能&#xff1a;生成一个Proxy代理类&#xff0c;Proxy代理类实现了业务接口&#xff0c;而通过调用Proxy代理类实现的业务接口&#xff0c;实际上会触发代理类的invoke增强处理方法。 责任链功…

艾体宝洞察丨透过语义缓存,实现更快、更智能的LLM应用程序

传统的缓存只存储数据而不考虑上下文&#xff0c;语义缓存则不同&#xff0c;它能理解用户查询背后的含义。它使数据访问更快&#xff0c;系统响应更智能&#xff0c;对 GenAI 应用程序至关重要。 什么是语义缓存&#xff1f; 语义缓存解释并存储用户查询的语义&#xff0c;使…

功率谱密度估计(Power Spectral Density Estimation, PSD)介绍,轴承磨损检测

介绍 功率谱密度估计&#xff08;Power Spectral Density Estimation, PSD&#xff09;是信号处理中的一项重要技术&#xff0c;用于描述信号在频率域中的能量分布。PSD提供了信号的功率随频率变化的情况&#xff0c;是分析随机信号和确定信号频率特性的常用工具。 功率谱密度…

美团代付支持多模板全开源多种支付通道 多模版三合一源码附教程

美团代付 支持多模板全开源多种支付通道 多模版三合一源码附教程 美团代付源码&#xff0c;支持多模板&#xff0c;全开源&#xff0c;多种支付通道&#xff0c;其它的就没什么好介绍的了&#xff0c;有兴趣的自行去体验吧。

驱动(RK3588S)第五课时:字符设备驱动编程

目录 一、操作系统的框架二、设备的类型三、什么是设备四、杂项字符设备的 API五、代码实现1、底层实现&#xff08;内核&#xff09;2、应用层代码3、交叉编译环境4、结果展示 一、操作系统的框架 二、设备的类型 硬件设备其实是分类型的&#xff1a; 字符设备&#xff1a;所…

TCP/IP 报文传输过程

目录 1. 概念理解2. 传输过程 原文回到 TCP/IP 强烈推荐下面博客&#xff0c;详细阐述了TCP/IP协议概念和传输过程 TCP协议详解 (史上最全) 1. 概念理解 2. 传输过程 以一个具体例子为例&#xff0c;如下图所示&#xff0c;由A 给 F 发送一个数据包整个过程是怎样的

Windows 安装 MySQL8

目录 前言 下载 安装 配置 连接 前言 一般数据库都是部署在 Linux 服务器上&#xff0c;在 Windows 上开发&#xff0c;通过数据库连接工具来连接数据库。在工作中&#xff0c;如果条件允许&#xff0c;会有单独的开发库给开发人员使用&#xff0c;否则开发人员就只能连接…

U盘损坏深度解析与高效数据恢复指南

一、U盘损坏现象初探 在数字化时代&#xff0c;U盘作为便捷的数据存储与传输工具&#xff0c;几乎成为了我们日常生活与工作中的必需品。然而&#xff0c;不少用户都曾遭遇过U盘损坏的困境&#xff0c;面对无法读取、文件丢失或系统提示错误等问题&#xff0c;往往感到束手无策…

【概率与统计 动态规划】 808. 分汤

本文涉及知识点 C动态规划 数学 概率与统计 LeetCode 808. 分汤 有 A 和 B 两种类型 的汤。一开始每种类型的汤有 n 毫升。有四种分配操作&#xff1a; 提供 100ml 的 汤A 和 0ml 的 汤B 。 提供 75ml 的 汤A 和 25ml 的 汤B 。 提供 50ml 的 汤A 和 50ml 的 汤B 。 提供 25…

Chapter 10 async函数 await关键字

欢迎大家订阅【Vue2Vue3】入门到实践 专栏&#xff0c;开启你的 Vue 学习之旅&#xff01; 文章目录 前言一、async 函数二、await 关键字 前言 在现代 JavaScript 开发中&#xff0c;异步编程是一个重要的概念。随着 ES2017 的引入&#xff0c;async 函数和 await 关键字为处…

一文读懂Mysql连接数的基本知识

目录 前言1. 基本知识2. 常用命令 前言 原先写过一篇SQL Server的知识点&#xff0c;推荐阅读&#xff1a;Sql Server缓冲池、连接池等基本知识&#xff08;附Demo&#xff09; 其余知识点推荐阅读&#xff1a; java框架 零基础从入门到精通的学习路线 附开源项目面经等&…

Windows10上Nginx如何通过自签名证书方式发布Https服务(上)

背景 在Android开发中使用平板设备进行调试,Android版本是13。在调试中遇到一个这样的报错信息:“java.io.IOException: Cleartext HTTP traffic to 192.168.137.1 not permitted”,然后查了下报错原因是:应用正在尝试通过不安全的HTTP协议进行网络通信,而你的应用运行的环…

计时计费收银软件如何控制设备 佳易王电玩城PS5机计时定时提醒管理系统操作教程

一、前言 计时计费收银软件如何控制设备 佳易王电玩城PS5机计时定时提醒管理系统操作教程 【特别说明&#xff1a;下载的文件为压缩包文件&#xff0c;右键 解压到当前文件夹&#xff0c;将解压后 的文件夹复制到电脑的D盘或E盘&#xff0c;打开该文件夹&#xff0c;将程序图…

竞品分析文档——word版

今天和大家免费分享产品必备文档模板——竞品分析文档&#xff08;word&#xff09;&#xff0c;包括一下部分内容&#xff1a; 1、竞品概述——基本信息、竞品目的、发展历程、产品定位、商业模式 2、市场分析——发展背景、发展现状、流量分析 3、用户分析——用户画像、用…

如何使用Windows自带的软件进行扫描

我们在使用电脑办公的时候&#xff0c;可能会需要进行文件的扫描。有的小伙伴在扫描的过程中可能会出现一些问题&#xff0c;明明扫描仪已经安装了&#xff0c;但是又不知道Windows扫描仪程序在哪里怎么启动&#xff1b;那么今天就跟大家分享一下Windows扫描仪程序在哪里&#…

uniapp插槽用法

目录 什么是插槽? 基本概念 默认插槽 命名插槽 作用域插槽 场景一:子插槽向父组件传递一个字符串 场景二:子插槽向父组件传递对象 什么是插槽? 在 UniApp 中&#xff0c;插槽&#xff08;Slot&#xff09;是一种允许父组件向子组件特定位置插入HTML内容的方式。这种方式使得组…