[Github] Actions Runner Controller(ARC)로 Self Hosted Runner 구성하기 (in k8s)
Github Action을 Self Hosted Runner로 띄우려면, 2가지 선택지가 있다.
- 단일 바이너리로 즉시 실행하는 것
- 쿠버네티스로 설치해서 실행하는 것 (ARC)
1번이 플랫폼 호환성도 좋고 편리하긴 한데, 관리 부분에서 불편한 점도 있다. runner를 병렬로 구성하는 것도 번거롭고, 자동 재실행 같은걸 보장하는 것도 직접 다 해야 하기 때문이다.
Github에서 근래에 출시한 ARC는 이런 불편한 지점들을 자동으로 관리해주는 시스템이다.
쿠버 기반이라서 수평으로 하드웨어를 확장하는 것도 쉽다.
기본 구조
ARC는 2가지의 요소로 구성된다.
최상위 컨트롤러인 ARC와, 그 아래에서 실질적인 실행을 담당하는 gha-runner-scale-set이 있다.
ARC는 딱 scale-set의 관리만을 담당한다. 얘는 Github 인증정보도 필요없고, 클러스터에 하나만 있으면 된다.
gha-runner-scale-set은 클러스터당 여러개 구성할 수 있고, 이걸 통해서 runner가 실행된다. 인증정보도 여기에 다 넣는다.
사전 조건
쿠버네티스와 helm에 대한 사전 지식 필요.
당연히 쿠버네티스가 설치되어있어야 한다.
플랫폼은 중요하지 않다. Linux면 좋겠지만 Mac이나 Windows라면 minikube 같은걸 깔면 된다.

그리고 Github Action을 사용하기 위한 인증 수단이 필요하다.
계정 인증으로 사용할거라면 그냥 PAT만 따오면 되고, 조직 단위에서 쓸거라면 Github App을 따서 pem을 받아오면 된다. 조직에서는 후자를 권장하는 편이다.
권한은 이렇게 넣어주면 된다. Action, Admin, Checks

Self Hosted Runner 권한도

Github App으로 쓴다면 pem 키를 받고.
Github App ID와 Install ID를 꺼내서 준비해야 한다.
Install ID는 페이지 URL에서 찾을 수 있다.
ARC 설치하기
ARC는 상위 관제시스템이다.
helm을 쓰면 간단하게 설치할 수 있다.
NAMESPACE="arc-systems"
helm install arc \
--namespace "${NAMESPACE}" \
--create-namespace \
oci://ghcr.io/actions/actions-runner-controller-charts/gha-runner-scale-set-controller

그리고 이렇게 잘 뜨면 잘 깔린 것이다.

Runner Scale Set 설치하기
이것도 helm을 통해서 설치할 수 있다.
이건 인증을 어떤 형태로 가져왔는지에 따라서 넘겨줄 값이 다르다.
개인계정으로 연결할 경우에는 이렇게 PAT만 넘기면 되고
INSTALLATION_NAME="arc-runner-set"
NAMESPACE="arc-runners"
GITHUB_CONFIG_URL="https://github.com/조직명"
GITHUB_PAT="토큰"
helm install "${INSTALLATION_NAME}" \
--namespace "${NAMESPACE}" \
--create-namespace \
--set githubConfigUrl="${GITHUB_CONFIG_URL}" \
--set githubConfigSecret.github_token="${GITHUB_PAT}" \
oci://ghcr.io/actions/actions-runner-controller-charts/gha-runner-scale-set
Github App으로 설치한다면 이렇게 이것저것 넣어주면 된다.
INSTALLATION_NAME="arc-runner-set"
NAMESPACE="arc-runners"
GITHUB_CONFIG_URL="https://github.com/조직명"
GITHUB_PEM="PEM키"
APP_ID="GITHUB APP ID"
INSTALL_ID="Githu APP 설치 ID"
helm install "${INSTALLATION_NAME}" \
--namespace "${NAMESPACE}" \
--create-namespace \
--set githubConfigUrl="${GITHUB_CONFIG_URL}" \
--set githubConfigSecret.github_app_private_key="${GITHUB_PEM}" \
--set githubConfigSecret.github_app_id="${APP_ID}" \
--set githubConfigSecret.github_app_installation_id="${INSTALL_ID}" \
oci://ghcr.io/actions/actions-runner-controller-charts/gha-runner-scale-set
아무튼 나는 Github App으로 설정했다.

날려서 오류 없이 이렇게 뜨면 잘 된 것이다.
그리고 연동이 문제 없이 되었다면
이렇게 Runner 목록에 runner scale set이 추가될 것이다.
그대로 갖다쓰면 된다.
Runner 사용하기
기존의 Self Hosted Runner 사용법과 다를 것은 없다. 그냥 Runner 관리만 자동으로 해주는 것이기 때문이다.
runs-on으로 지정해주고
쏘면 된다.
참고로 이건 쿠버 기반이라서, 반드시 컨테이너 내에 샌드박싱된 채로 실행된다.
그리고 개별 run이 하나의 job pod로 실행되었다가 끝나면 제거되기 때문에, 디스크 재사용이 단순하게는 되지 않는다.
디스크 캐시를 활용하기 위해서는 별도의 캐시 매커니즘이나 볼륨 설정이 필요하다.
Runner 개수 조정
ARC의 편리한 점 중 하나는, Runner의 개수를 조정하고 분산하는 것이 쉽다는 것이다.
ARC Runner의 최대 갯수는 autoscailingrunnerset이라는 리소스로 관리되는데,

따로 설정하지 않았다면 기본값은 5다.
Runner의 최대 실행 개수 제한을 15로 늘리고 싶다면 이렇게 명령을 날리면 된다.
kubectl patch autoscalingrunnerset -n arc-runners arc-runner-set \
--type=merge \
-p '{"spec":{"maxRunners":15}}'

helm을 통해 변경한다면 이렇게 할 수 있다. 이걸 더 권장한다.
helm upgrade arc-runner-set oci://ghcr.io/actions/actions-runner-controller-charts/gha-runner-scale-set \
-n arc-runners \
--reuse-values \
--set maxRunners=20

최소 개수도 지정한다면, 미사용시에도 runner가 pool 개념으로 떠있도록 구성할 수 있다.

그러면 이런 식으로 runner도 여러개로 확장된다.
베이스 이미지 변경
ARC는 Runner를 실행할때 다음과 같은 우분투 베이스 이미지를 사용한다.
ghcr.io/actions/actions-runner:latest
하지만 원한다면 베이스 이미지를 직접 말아서 넣는 것도 가능하다.
적당히 잘 말아서
scale set의 values.yaml에 넣고 밀어넣으면 된다.
template:
spec:
containers:
- name: runner
image: your-registry/custom-runner:latest # 커스텀 이미지
command:
- /home/runner/run.sh참조
https://docs.github.com/ko/actions/tutorials/use-actions-runner-controller/get-started
https://docs.github.com/ko/actions/concepts/runners/support-for-arc