【GithubActions】self-hosted runnerをKubernetesクラスタで動かす
初めに
GithubActionsではCIをGithub上ではなく、自身の管理するマシン上で動かすself-hosted runner
という仕組みがあります。今回は、CIを回すとき(必要なとき)のみにRunnerがあれば良いと思ったため、スケールインアウトがしやすいKubernetesクラスタ上に構築することにします。
下の画像は環境構築に成功した例になります。GithubのWorkflowが実行されるときにPodが作成され、終了後はPodが自動的に削除されます。
図1: KubernetesクラスタにRunnerのPodが立っている様子
構築
環境
今回はGitHub Actions Runner Controller (ARC)
を、Helmを使用して導入します。
- Kubernetesのバージョン
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-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のバージョン
version.BuildInfo{Version:"v3.16.1", GitCommit:"5a5449dc42be07001fd5771d56429132984ab3ab", GitTreeState:"clean", GoVersion:"go1.22.7"}
手順
- arc-controllerの導入
helm install arc \
--namespace arc-systems \
--create-namespace \
oci://ghcr.io/actions/actions-runner-controller-charts/gha-runner-scale-set-controller
- Githubの
Personal access tokens
が必要になるため用意
Githubで自身のアイコンをクリック
> Settings
> developer settings
> Personal accesss tokens
> Tokens (classic)
> generate new token
図2: 付与する必要のある権限一覧
- GithubActionsを行いたいリポジトリとGithubのPATを変数に登録しておく
GITHUB_CONFIG_URL="https://github.com/<username>/<repo_name>"
GITHUB_PAT="<PAT>"
- 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を想定する。
使うファイル
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 }}
FROM nginx:1.25.2
COPY nginx.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
最後に
今回は構築してから実際にWrokflowを実行するまでに、手こずったところなどを踏まえながらこの記事を作成しました。個人的に、ホストマシンのリソースが潤沢にあるわけではないので、JobごとにPodが作成されて、workflowが終了する際はPodを片付けてくれるのにとても気に入りました。
参考文献
本記事を作成するにあたって参考にさせていただいたサイトです。ありがとうございました。
Discussion