본문 바로가기

devops

GitLab-Runner Helm Installation

반응형

Intro

GitLab 서버 자체는 VM서버 위에 docker-compose로 구성하였음. 

GitLab-Runner는 쿠버 안에다가 설치를 진행하여 GitLab main 서버와 연동해보겠음.

왜 둘다 쿠버에 안올리냐구??.. GitLab을 처음에 네이버클라우드 NKS위에 올려서 사용했는데...

네이버 쪽에서 DNS 장애가 난적이 있어서... 개발자들이 아예 푸쉬를 못하는 상황이 발생한 적이 있음...

당시 네이버도 따로 통보를 안해줬고.. 우리들은 당연히 쿠버에 설치된 GitLab이 오류난 줄 알고 GitLab 로그를 잔뜩보고 쿠버 로그를 보고 있었지... GitLab Helmchart가 워낙 복잡하게 yaml 코드가 복잡해서.. 이걸 쿠버에 운영하는 것이 과연 맞을까....

비지니스 로직만 쿠버에 올리고 나머지는 다 VM Docker로 하는 것이 유지보수하는데에 더 베스트하다고 판단하여

GitLab은 쿠버가 아닌 VM위에 Docker로 설치하여 실행함.

경험으로 가장 좋은 건 그냥 사서써라 GitLab이든 GitHub든.. self-installation은 피하는 것이 가장 좋다....

이번 PoC가 지나면 그냥 사서 쓰고싶다... 소스코드가 밖에있나.. 사내에있나... 요즘 시대에 뭔 상관인지...

 

아무튼 GitLab-Runner는 쿠버에 띄워보겠다. 얘는 그냥 Job 실행하고 CI/CD 처리하고 그냥 죽어버리는 일시적인 Job이기 때문에 쿠버에 적용하는 것이 더 좋을 것 같다는 판단이 들어서 runner는 k8s, gitlab 자체는 docker on vm.

 

GitLab-Runner Helm Chart Installation

helm Repository add and update

현재 kubctl, helm은 설치되어있고 쿠버네티스 클러스터에 접근이 가능한 상태라고 생각하고 설치를 진행한다.

 

helm gitlab repository 추가 및 repository 최신 업데이트 반영

helm repo add gitlab https://charts.gitlab.io/
helm repo update

 

helm 검색

helm chart를 바로 스크립트 한 문장으로 한방에 설치하는 고수들도 있지만.. 개인적으로 helm chart를 먼저 검색하는 습관이 정신건강에 좋다ㅎㅎ 

helm search repo gitlab

gitlab repository 안에는 여러 helmchart들을 조회할 수 있으며, 현재 gitlab-runner 헬름차트의 최신버전은 0.54.0이다.

helm chart 다운로드

또 말하지만.. 차트를 받지도 않고 바로 helm install로 하는 고수들이 있는데.. 개인적으로 pull하는 것이 좋더라...

cd ~/Desktop/
helm pull gitlab/gitlab-runner

크~ 이름도 예쁘게 헬름차트를 다운로드 받았다.

클릭해서 압축을 푼다.

디렉토리명이 gitlab-runner로 풀려지는데.. .tgz와 동일하게 이름을 변경해준다.

디렉토리 안에 values.yaml 이게 핵심이다. helm chart의 구조나 사용법을 모르면... 다른데가서 찾아보길바람.

values.yaml을 열어보면 정말 많은 내용이 있는데... 모두 알 필요는 없다.

개인적으로 values.yaml을 그대로 수정하지 않고 복사하여 사용한다. 이게 정신건강에 좋더라..

복사하여 my-values.yaml 로 네이밍을 지정하였다.

 

my-values.yaml 수정사항

CI/CD를 어찌 구성하느냐 환경에 따라 다르겠지만 내가 수정한 내용은 다음과 같다.

my-values.yaml을 수정 부분을 하나씩 보자!!

 

gitlabUrl 부분

이건 필수다. gitlab 메인서버의 host 주소를 작성해야 gitlab-runner와 통신할 수 있다.

## The GitLab Server URL (with protocol) that want to register the runner against
## ref: https://docs.gitlab.com/runner/commands/index.html#gitlab-runner-register
##
gitlabUrl: http://10.140.1.7/
 

 

runnerToken 부분

runnerRegistrationToken은 현재 버전에서는 Deprecated되었다. 구글링해보면 거의 대부분 runnerRegistrationToken을 사용하고 있는데.. 이제는 사용할 수가 없다. 대신 runnerToken을 사용해야한다.

runnerToken은 gitlab 현재 최신버전에서 생성할 수 있다.

 

Admin Area → CI/CD → Runners → New instance runner (상단 오른쪽) 클릭

Platform

쿠버를 선택해야할 거 같은데... 클릭이 안된다. 그래서 Linux를 선택했다.

Tags

생성하는 러너를 식별하기 위한거 같은데.. 그냥 k8s라고 지칭했다.

 

나머지는 따로 안건드리고 Submit을 클릭!

 

그러면 아래 캡처와 같이...

러너에 들어가서 뭐 명령어를 실행하라라고 나온다. 우리는 리눅스에 설치한 것이 아니라서 그냥 token만 카피한다.

glrt-dgcrrKWsM7vATdyCbjdx

 

다시 my-values.yaml 헬름차트로 돌아와서

해당 token을 runnerToken: 부분에 입력한다.

runnerToken: "glrt-dgcrrKWsM7vATdyCbjdx"

 

rbac 부분

rbac true로 활성화하고 주석으로 된 rbac도 모두 풀고 아래와 같이 작성한다. 추가적으로 pods/log도 주석에 없는데.. 작성한다.

## For RBAC support:
rbac:
  create: true

  ## Define list of rules to be added to the rbac role permissions.
  ## Each rule supports the keys:
  ## - apiGroups: default "" (indicates the core API group) if missing or empty.
  ## - resources: default "*" if missing or empty.
  ## - verbs: default "*" if missing or empty.
  ##
  ## Read more about the recommended rules on the following link
  ##
  ## ref: https://docs.gitlab.com/runner/executors/kubernetes.html#configuring-executor-service-account
  ##
  rules:
    - resources: ["configmaps", "pods", "pods/attach", "secrets", "services"]
      verbs: ["get", "list", "watch", "create", "patch", "update", "delete"]
    - apiGroups: [""]
      resources: ["pods/exec"]
      verbs: ["create", "patch", "delete"]
    - apiGroups: [""]
      resources: ["pods/log"]
      verbs: ["get"]
 

 

Runners 부분

## Configuration for the Pods that the runner launches for each new job
##
runners:
  # runner configuration, where the multi line strings is evaluated as
  # template so you can specify helm values inside of it.
  #
  # tpl: https://helm.sh/docs/howto/charts_tips_and_tricks/#using-the-tpl-function
  # runner configuration: https://docs.gitlab.com/runner/configuration/advanced-configuration.html
  config: |
    [[runners]]
      post_clone_script = "git config --global --add safe.directory $(pwd)"
      [runners.kubernetes]
        namespace = "{{.Release.Namespace}}"
        image = "ubuntu:16.04"
        url = "http://10.140.1.7/"
        privileged = true
        [[runners.kubernetes.volumes.host_path]]
          name = "docker"
          mount_path = "/var/run/docker.sock"
          path = "/var/run/docker.sock"
      [runners.cache]
        Type = "s3"
        Path = "cache"
        Shared = true
        [runners.cache.s3]
          ServerAddress = "kr.object.ncloudstorage.com"
          BucketName = "gitlab-runner"
          BucketLocation = "Korea"
          Insecure = false
          AuthenticationType = "access-key"
 

이 Runner 부분이 많이 중요하고 복잡한데.. CI/CD를 어떻게 구성하냐에 따라 좀 다르다..

  privileged = true

    runner 컨테이너의 privileged 권한 설정
  runners.cache

    파이프라인 단계당 하나의 컨테이너가 생성되고 죽고를 반복하는데 그 과정에서 서로 데이터를 주고 받기위한 캐시를

    네이버클라우드 s3 스토리지를 사용하도록 설정

  runners.kubernetes.volumes.host_path

    DinD (docker in docker)를 적용하기위한 설정

 

 runners 부분에 3가지 설정들이 추가되었다. 자세한 건 따로 구글링!!

 

cache 부분

  cache:
    ## S3 the name of the secret.
    # secretName: s3access
    ## Use this line for access using gcs-access-id and gcs-private-key
    # secretName: gcsaccess
    ## Use this line for access using google-application-credentials file
    # secretName: google-application-credentials
    ## Use this line for access using Azure with azure-account-name and azure-account-key
    # secretName: azureaccess
    secretName: conreg

runners 부분에서 설정한 s3 캐시를 이용할 때 인증키 시크릿을 지정하도록 설정함

 

my-values.yaml 설정이 모두 끝났다.

 

helm chart 배포

kubectl create ns gitlab-runner #ns extension를 사용하여 namespace 생성
helm install gitlab-runner -f my-values.yaml .

helm list

Runner와 GitLab이 잘 연동되었다.

 

 

새로운 러너로 파이프라인 스크립트도 잘 실행이 되었다.

 

반응형