서론
소스코드 저장소 호스팅의 대표주자는 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가 깨져서 나오는 현상때문에 시간을 허비하며 삽질을 하였지만, 아직까지 이유를 찾지 못하였습니다. 혹시 이유를 아시는 분이 계신다면 댓글로 알려주시길 바랍니다.
댓글