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

この記事は約8分で読めます。

初めに

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

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

構築

環境

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

導入されていない方は、以下のワンライナーでインストール可能なのでインストールしてから先に進んでください。

curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
  • Kubernetesのバージョン
bash: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.. Ubuntu 22.04.4 LTS 5.15.0-119-generic containerd://1.7.12
k8sw1 Ready 31d v1.30.5 192.168.. Ubuntu 22.04.4 LTS 5.15.0-119-generic containerd://1.7.22
k8sw2 Ready 31d v1.30.5 192.168.. Ubuntu 22.04.4 LTS 5.15.0-1061-raspi containerd://1.7.22
  • CNIのバージョン
bash: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のバージョン
bash: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

2. GithubのPersonal access tokensが必要になるため用意
Githubで自身のアイコンをクリック > Settings > developer settings > Personal accesss tokens > Tokens (classic) > generate new token

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

3. GithubActionsを行いたいリポジトリとGithubのPATを変数に登録しておく

GITHUB_CONFIG_URL="https://github.com/<username>/<repo_name>"
GITHUB_PAT="<PAT>"

3. 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

--set containerMode.type="dind"を指定しないと、Workiflow内でDockerビルド時に「Dockerデーモンが起動していない」とエラーが出ました。それでもビルドに失敗する場合は、KubernetesのWorkerノードにDockerをインストールしてください(筆者はこの流れで問題を解決できました)。

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

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

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

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

画像のようにRunnerが表示されるまで1番のコマンドを実行してから少し待つ必要があります。焦らず、待っているとじきに表示されます(恐らく、arc-listenerのPodが立つと表示されるはず)。

使用方法

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

github/workflows/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

docker/build-push-action@v5では、contextを使うことで、カレントディレクトリを変更できるみたいですが、fileで使うDockerfileを指定する際は、contextが適用されていないため、上記のような記述をすることが必要みたいです。

最後に

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

参考文献

本記事を作成するにあたって参考にさせていただいたサイトです。ありがとうございました。

コメント