본문 바로가기

Develop/DevOps

[Kubernetes] Github Action Controller 설치 및 사용

반응형

 

Action Runner Controller 를 사용하게되면 Github Action Runner를 Kubernetes 환경에서 띄우고 관리 할 수 있음.

https://github.com/actions/actions-runner-controller/tree/master

 

GitHub - actions/actions-runner-controller: Kubernetes controller for GitHub Actions self-hosted runners

Kubernetes controller for GitHub Actions self-hosted runners - actions/actions-runner-controller

github.com

 

 

또한, 호스트의 스펙만큼 한개의 노드에서 여러개의 Runner를 띄울수가 있음. 사용에 대한 Metrics을 제공하여 Prometheus와 연결하여 시각화 또한 가능함.

 

아래는 Terraform을 이용하여 Action Runner Controller를 설치하는 방법을 서술함.

  • action-runner-scale-set-controller : action runner controller에 대한 환경 설정 helm chart
  • action-runner-scale-set : 실제로 사용이 되는 action runner 설정 helm chart
    • containerMode.type은 dind, kubernetes를 지정할수있는데, 현 시점에서의 kubernetes는 대부분 container runtime을 docker를 사용안하기 때문에 kubernetes로 지정이 필요함. 또한, kubernetes mode를 지정하면 kubernetesModeWorkVolumeClaim을 무조건 지정해야함.
    • 여기서 지정한 이름은 실제로 github 에서 사용할 runner의 이름을 지정함

resource "kubernetes_namespace_v1" "arc_systems" {
  metadata {
    name = "arc-systems"
  }
}

resource "helm_release" "gha_runner_scale_set_controller" {
  name = "gha-runner-scale-set-controller"

  repository = "oci://ghcr.io/actions/actions-runner-controller-charts"
  chart      = "gha-runner-scale-set-controller"
  version    = "0.11.0"
  namespace  = kubernetes_namespace_v1.arc_systems.metadata[0].name
}

resource "helm_release" "gha_runner_scale_set" {
  name = "gha-runner-scale-set"

  repository = "oci://ghcr.io/actions/actions-runner-controller-charts"
  chart      = "gha-runner-scale-set"
  version    = "0.11.0"
  namespace  = kubernetes_namespace_v1.arc_systems.metadata[0].name
  values = [jsonencode({
    githubConfigUrl = ""
    githubConfigSecret = {
      github_token = # fine-grained token 기입 필요
    }
    containerMode = {
      type = "kubernetes"
      kubernetesModeWorkVolumeClaim = {
        accessModes      = ["ReadWriteOnce"]
        storageClassName = "" # 사용하고있는 StorageClass 정보 기입
        resources = {
          requests = {
            storage = "100Gi" # Runner가 띄워질때 사용되는 용량 설정
          }
        }
      }
    }
    template = {
      spec = {
        securityContext = {
          fsGroup = 1001 # Runner내부의 권한 이슈로 인한 설정
        }
      }
    }
  })]
  depends_on = [helm_release.gha_runner_scale_set_controller]
}

 

위와같이 Action Runner Controller 를 생성하고, 실제로 해당 runner를 사용하기 위해서는 아래와같이 workflow 예시처럼 작성이 필요함

  • container를 지정안하면 기본적으로 action runner의 이미지가 사용됨 (ghcr.io/actions/actions-runner:latest)
  • 아래와같이 container를 지정하게되면 workflow파일은 지정한 이미지 내에서 동작하게됨
    • 작동방식은 처음에 action-runner:latest 이미지를 사용하는 컨테이너가 떠서 github 과 연결을 한 이후, container로 지정한 이미지 컨테이너가 떠서 workflow를 수행하게됨. 
    • 또한, 들어오는 job에 따라서 유동적으로 runner를 생성하여 workflow를 수행함.
      • helm-chart의 MaxJob 변수를 설정함으로서 제어가 가능함
jobs:
  test-arc:
    runs-on: gha-runner-scale-set
    container:
      image: ubuntu:24.04 # 실행하고싶은 Job의 환경 이미지
    steps:
      ...

 

 

참고로 위에 설치 방식과 다른 방법도 존재하는데, action-runner-controller라는 helm chart를 이용하여 설치하는 방식도 존재함. 해당 방식은 깊게 알아보진 못했지만 아래와같이 설치 이후 생성되는 RunnerDeployment CR를 활용하여 runner 개수를 지정하여 별도로 리소스를 생성해야하는걸로 이해함. 하지만 지금 대부분은 위에 서술한 방식으로 설치를 하고있는것같다.

https://github.com/actions/actions-runner-controller/blob/master/docs/deploying-arc-runners.md

 

actions-runner-controller/docs/deploying-arc-runners.md at master · actions/actions-runner-controller

Kubernetes controller for GitHub Actions self-hosted runners - actions/actions-runner-controller

github.com

# runnerdeployment.yaml
apiVersion: actions.summerwind.dev/v1alpha1
kind: RunnerDeployment
metadata:
  name: example-runnerdeploy
spec:
  # This will deploy 2 runners now
  replicas: 2
  template:
    spec:
      repository: mumoshu/actions-runner-controller-ci
반응형