Infrastructure/Kubernetes

[NCP] NKS로 개발환경 구성하기 Chapter 8. NKS에 GitLab, GitLab-SSH, GitLab-Runner 설치하기

MingyuKim 2025. 3. 4.

서론

소스코드 저장소 호스팅의 대표주자는 GitLab, GitHub가 있으며 기본 기능은 source의 버전 관리를 해준다는 것으로 같지만 차이가 확실합니다. 깃헙과 깃랩의 가장 큰 차이점은 데브옵스에 있는데, 깃헙은 사용자가 직접 CI/CD 도구 혹은 서드파티 툴들을 선택하여 연동하는 방향으로 CI/CD를 구축하지만, GitLab은 자체적인 CI/CD 워크플로우가 내장되어 있다는 점입니다.

 

저는 깃랩을 사용하기로 결정하였고, kubernetes에 gitlab을 helm으로 설치하는 과정을 간단하게 포스팅하도록 하겠습니다.

 

[이전글]

 

[NCP] NKS로 개발환경 구성하기 Chapter 7. gitops와 argocd 도입을 위한 argocd 설치하기

서론지금까지는 Naver Cloud Platform(이하 NCP)에서 제공해 주는 Source Series(Commit, Build,Deploy, PipeLine)을 사용하여 CI/CD를 진행했다면, 쿠버네티스의 장점을 고루 살린 GitOps와 ArgoCd를 사용하여 CI/CD를 마

min-nine.tistory.com


본론

gitlab.io에서는 gitlab을 효율적으로 k8s에 설치할 수 있도록 공식 helm charts를 지원합니다.

 

GitLab Helm Charts

GitLab Helm Charts This repository collects GitLab’s official Helm charts from their individual repos and automatically publish them to our Helm repo, located at charts.gitlab.io. Helm is a package manager for Kubernetes, making it easier to deploy, upgr

charts.gitlab.io

 


 

1. GitLab Helm Repository  추가

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

 


 

2. helm temlate을 이용한 rendered.yaml 확인

helm 명령어중 template 키워드를 사용하면 helm install시 설치되는 모든 항목을 yaml 파일로 만들어서 볼 수 있습니다. 기본 values.yaml 파일을 가지고 helm 설치를 할 경우 어떤 내용들이 default로 생성되는지 custom_values.yaml 로 만들어 확인합니다.

helm template gitlab gitlab/gitalb --values values.yaml -n gitlab > ./custom_values.yaml

 


 

3. custom_values 작성

저는 gitlab , shell, runner만 커스텀하였습니다. NKS의 대부분의 K8S Objecte들은 AWS의 오브젝트를 그대로 지원합니다. 때문에 alb나 s3 같은 aws 서비스들의 공식 문서를 참고하면 쉽게 설정이 가능합니다.

# AWS Load Balancer Controller using ALB Ingress
# minimal settings needed to run gitlab on ALB
# Note that when using an ALB ingress controller we need to use a separate NLB for gitlab-shell (ssh) connections.

# Disable nginx-ingress
nginx-ingress:
  enabled: false
# Common settings for AWS Load Balancer Controller
global:
  externalUrl: "https://gitlab.mingyu.co.kr/"
  hosts:
    domain: mingyu.co.kr
    # we need a different dns endpoint for webservice and ssh
    ssh: gitlab-sh.mingyu.co.kr
  ingress:    
    # Common annotations used by kas, registry, and webservice
    annotations:
      alb.ingress.kubernetes.io/backend-protocol: HTTP
      alb.ingress.kubernetes.io/ssl-certificate-no: "${YOUR CN}"
      alb.ingress.kubernetes.io/ssl-redirect: "443"
      alb.ingress.kubernetes.io/group.name: gitlab
      alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80, "TargetPort": 8080},{"HTTPS":443}]'
      alb.ingress.kubernetes.io/scheme: internet-facing
      alb.ingress.kubernetes.io/target-type: ip
      nginx.ingress.kubernetes.io/connection-proxy-header: "keep-alive"
    class: none
    configureCertmanager: false
    enabled: true
    path: /*
    pathType: Prefix
    backend:
      service:
        name: gitlab-webservice-default
        port:
          number: 8080
    tls:
      enabled: false
    spec:
      ingressClassName: alb
    storageClass: nks-block-storage
gitlab:
  kas:
    enabled: true
    ingress:
      # Specific annotations needed for kas service to support websockets
      annotations:
        alb.ingress.kubernetes.io/healthcheck-path: /liveness
        alb.ingress.kubernetes.io/healthcheck-port: "8151"
        alb.ingress.kubernetes.io/healthcheck-protocol: HTTP
        alb.ingress.kubernetes.io/load-balancer-attributes: idle_timeout.timeout_seconds=4000,routing.http2.enabled=false
        alb.ingress.kubernetes.io/target-group-attributes: stickiness.enabled=true,stickiness.lb_cookie.duration_seconds=86400
        alb.ingress.kubernetes.io/target-type: ip
        kubernetes.io/tls-acme: "true"
        nginx.ingress.kubernetes.io/connection-proxy-header: "keep-alive"
        nginx.ingress.kubernetes.io/x-forwarded-prefix: "/path"
    # k8s services exposed via an ingress rule to an ELB need to be of type NodePort
    service:
      type: NodePort
  webservice:
    enabled: true
    service:
      type: NodePort
  # gitlab-shell (ssh) needs an NLB
  gitlab-shell:
    enabled: true
    service:
      annotations:
        external-dns.alpha.kubernetes.io/hostname: "gitlab-sh.mingyu.co.kr"
        service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: "ip"
        service.beta.kubernetes.io/aws-load-balancer-scheme: "internet-facing"
        service.beta.kubernetes.io/aws-load-balancer-type: "external"
      type: LoadBalancer
  gitaly:
    persistence:
      size: 200Gi
  time_zone: Asia/Seoul

## Installation & configuration of gitlab/gitlab-runner
## See requirements.yaml for current version
gitlab-runner:
  install: true
  rbac:
    create: true
  gitlabUrl: "http://gitlab-webservice-default.gitlab.svc.cluster.local:8080/"
  securityContext:
      privileged: true
      allowPrivilegeEscalation: true
  runners:
    privileged: true
    locked: null
    secret: "nonempty"
    env:
      - name: CI_SERVER_URL
        value: "http://gitlab-webservice-default.gitlab.svc.cluster.local:8080/"
      - name: NCP_ACCESS_KEY_ID
        valueFrom:
          secretKeyRef:
            name: ncp-s3-secret
            key: accesskey
      - name: NCP_SECRET_ACCESS_KEY
        valueFrom:
          secretKeyRef:
            name: ncp-s3-secret
            key: secretkey
      - name: DOCKER_TLS_CERTDIR
        value: ""
      - name: DOCKER_HOST
        value: "unix:///var/run/docker.sock"
      
    config: |
      [[runners]]
        url = "http://gitlab-webservice-default.gitlab.svc.cluster.local:8080/"
        [runners.kubernetes]
          image = "ubuntu:22.04"
          privileged = true
          [runners.kubernetes.volumes]
            [[runners.kubernetes.volumes.host_path]]
              name = "docker-socket"
              mount_path = "/var/run/docker.sock"
              host_path = "/var/run/docker.sock"
        [runners.cache]
          Type = "s3"
          Path = "gitlab-runner"
          Shared = true
          [runners.cache.s3]
            ServerAddress = "kr.object.ncloudstorage.com"
            BucketName = "runner-cache"
            BucketLocation = "kr-standard"
            Insecure = false
            AccessKey = "${ACCESS_KEY_ID}"
            SecretKey = "${SECRET_ACCESS_KEY}"
  podAnnotations:
    gitlab.com/prometheus_scrape: "true"
    gitlab.com/prometheus_port: 9252
  podSecurityContext:
    seccompProfile:
      type: "RuntimeDefault"
  volumes:
    - name: docker-socket
      hostPath:
        path: /var/run/docker.sock
  volumeMounts:
    - name: docker-socket
      mountPath: /var/run/docker.sock
  
registry:
  enabled: true
  service:
    type: NodePort

traefik:
  install: false
  ports:
    gitlab-shell:
      expose: true
      port: 2222
      exposedPort: 22

 


 

4. helm install

위에서 작성한 values 파일을 기준으로 gitlab을 k8s에 설치합니다.

helm install gitlab gitlab/gitlab \
  -n gitlab \
  --values custom-values.yaml

 


 

5. 깃랩 접속 및 확인

service 이름이 "gitlab-webservice-default" 인 NodePort type의 service를 포트포워딩 하거나 DNS Ingress LB 설정을 통하여 서비스에 접근합니다.

kn-mgt port-forward svc/gitlab-webservice-default -n gitlab 8080:8080

저의 경우, 해당 포트포워딩 후 localhost:8080으로 접속하면 gitlab의 css가 깨져서 보이는 현상이 발생하는데, DNS의 ALB 맵핑으로 접속하면 css가 안깨지고 정상적으로 실행됩니다. 아마 내부적으로 설정한 external Url을 endpoint 삼아 통신하는 무엇인가 있는 것 같은데, 좀 더 디테일한 분석이 필요할 것 같습니다.


결론

gitlab을 k8s에 설치하면서 css가 깨져서 나오는 현상때문에 시간을 허비하며 삽질을 하였지만, 아직까지 이유를 찾지 못하였습니다. 혹시 이유를 아시는 분이 계신다면 댓글로 알려주시길 바랍니다.

댓글