♨️

【GithubActions】self-hosted runnerをKubernetesクラスタで動かす

2024/10/17に公開

初めに

GithubActionsではCIをGithub上ではなく、自身の管理するマシン上で動かすself-hosted runnerという仕組みがあります。今回は、CIを回すとき(必要なとき)のみにRunnerがあれば良いと思ったため、スケールインアウトがしやすいKubernetesクラスタ上に構築することにします。
 下の画像は環境構築に成功した例になります。GithubのWorkflowが実行されるときにPodが作成され、終了後はPodが自動的に削除されます。

図1: KubernetesクラスタにRunnerのPodが立っている様子

構築

環境

今回はGitHub Actions Runner Controller (ARC)を、Helmを使用して導入します。

  • Kubernetesのバージョン
kubectl get no -owide
NAME    STATUS   ROLES           AGE   VERSION   INTERNAL-IP       EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION       CONTAINER-RUNTIME
k8sc1   Ready    control-plane   31d   v1.30.5   192.168.*.*   <none>        Ubuntu 22.04.4 LTS   5.15.0-119-generic   containerd://1.7.12
k8sw1   Ready    <none>          31d   v1.30.5   192.168.*.*   <none>        Ubuntu 22.04.4 LTS   5.15.0-119-generic   containerd://1.7.22
k8sw2   Ready    <none>          31d   v1.30.5   192.168.*.*   <none>        Ubuntu 22.04.4 LTS   5.15.0-1061-raspi    containerd://1.7.22
  • CNIのバージョン
cilium version
cilium-cli: v0.16.15 compiled with go1.22.5 on linux/amd64
cilium image (default): v1.16.0
cilium image (stable): v1.16.2
cilium image (running): 1.16.2
  • Helmのバージョン
helm version
version.BuildInfo{Version:"v3.16.1", GitCommit:"5a5449dc42be07001fd5771d56429132984ab3ab", GitTreeState:"clean", GoVersion:"go1.22.7"}

手順

  1. arc-controllerの導入
helm install arc \
  --namespace arc-systems \
  --create-namespace \
  oci://ghcr.io/actions/actions-runner-controller-charts/gha-runner-scale-set-controller
  1. GithubのPersonal access tokensが必要になるため用意

Githubで自身のアイコンをクリック > Settings > developer settings > Personal accesss tokens > Tokens (classic) > generate new token

図2: 付与する必要のある権限一覧

  1. GithubActionsを行いたいリポジトリとGithubのPATを変数に登録しておく
GITHUB_CONFIG_URL="https://github.com/<username>/<repo_name>"
GITHUB_PAT="<PAT>"
  1. arc-runnersの導入
helm install arc-runner-set \
    --namespace arc-runners \
    --create-namespace \
    --set githubConfigUrl="${GITHUB_CONFIG_URL}" \
    --set githubConfigSecret.github_token="${GITHUB_PAT}" \
    --set containerMode.type="dind"
    oci://ghcr.io/actions/actions-runner-controller-charts/gha-runner-scale-set

ここまで来ると、arc-systemsのネームスペースには以下のPodが作成されます。

  • arc-gha-rs-controller
  • arc-listener

そして、arc-runnersのネームスペースにはCIが動いていない時は何もPodが立ち上がっていません。一方で、以下のようにGithubのActionsタブからself-hosted runnerが登録されていることが確認できます。

図3: Runnersとして登録されている様子

使用方法

DockerfileからDockerイメージを作成して、ghcr.ioにPushするWorkflowを想定する。

使うファイル
.github/workiflows/build.yml
name: Docker Build and Push

on:
  push:
    branches:
      - main

env:
  REGISTRY: ghcr.io
  USER: tochiman
  IMAGE_NAME: nginx-image

jobs:
  nginx-build-and-push:
    runs-on: <図3のavailable runnerに表示されている名前>
    permissions:
      contents: read
      packages: write
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Login to Github Container Registry
        uses: docker/login-action@v3
        with:
          registry: ${{ env.REGISTRY }}
          username: ${{ env.USER }}
          password: ${{ secrets.GITHUB_TOKEN }}

      - name: Set up buildx
        uses: docker/setup-buildx-action@v3

      - name: Build and push images
        uses: docker/build-push-action@v5
        with:
          context: ./nginx
          file: ./nginx/Dockerfile
          target: ${{ env.REPOSITORY }}
          push: true
          tags: ${{ env.REGISTRY }}/${{ github.repository }}/${{ env.IMAGE_NAME_NGINX }}:${{ github.ref_name }} 
nginx/Dockerfile
FROM nginx:1.25.2

COPY nginx.conf /etc/nginx/conf.d/default.conf

EXPOSE 80

最後に

今回は構築してから実際にWrokflowを実行するまでに、手こずったところなどを踏まえながらこの記事を作成しました。個人的に、ホストマシンのリソースが潤沢にあるわけではないので、JobごとにPodが作成されて、workflowが終了する際はPodを片付けてくれるのにとても気に入りました。

参考文献

本記事を作成するにあたって参考にさせていただいたサイトです。ありがとうございました。
https://developer.mamezou-tech.com/blogs/2023/05/14/github-actions-runner-controller/
https://github.com/docker/build-push-action/issues/97

Discussion