
해당 글을 쓰는 이유는 현재 학교 프라이빗망 내의 Infra에서 CICD를 구축하고자 하였다.
하지만 깃허브와 같은SCM(Source Code Management)에서 프라이빗망 내의 인프라로 CI나 CD가 안될거 같았다.
다음과 같은 구조다.
- SCM : GitHub -> [Webhook : Trigger] ->
| 프라이빗 망 : Jenkins -> ArgoCD |학교 네트워크 관리실에서 우리 포트나 DNS를 외부로 오픈하지 않는 한, 아마 프라이빗망 내의 클러스터로 웹훅을 줄 수 없을 것이라 판단하였다.
프라이빗 망내의 GitLab을 구축하기로 하였다.해당 우려 사항은 다음과 같다.
GitLab은 설치 시Cert-Manager를 설치하려고한다. 그래서 이미Cert-Manager는 기본적으로 설치가 되어있어서 리소스 충돌 / 시크릿 충돌 등 여러 상황을 우려하여 설치하고자 하였다.지금 쓰는 글은 내가 실질적으로 올린 것은 아니지만, 그냥 로컬리하게 테스팅하고 올려보고 다른 사람들도 쓸 수 있도록 기술하고자 한다.
설치 이유
간단하게 그냥 GitHub가 주도권이 실제 GitHub 회사에 있어서 SCM에 대한 WebHook 등 주도권이 GitHub 서버의 IP가 가지고 있다면 우리가 GitLab을 설치해서 해당 주도권을 우리가 갖고자 하는 것이다.
한창 Cert-Manager에 대해 공부하고 있었던 상황이라 더 눈에 들어왔다.
GitLab은 Kubernetes 환경에 설치될 경우:
- Ingress
- TLS
- 내부 컴포넌트 인증
을 위해 Cert-Manager를 기본 전제로 가정하는 설치 방식이 많습니다.하지만 이미 클러스터에 Cert-Manager가 설치되어 있는 경우:
- CRD 충돌
- Issuer / ClusterIssuer 중복
- Secret 네이밍 충돌
등이 발생할 수 있어, “무작정 설치하기 전에 구조를 이해하는 것”이 중요합니다.
GitLab은 소스 코드 관리(SCM) 를 중심으로
CI(Continuous Integration) 와 CD(Continuous Delivery/Deployment) 기능까지 하나의 플랫폼으로 제공하는 통합 DevOps 도구.
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
networking:
disableDefaultCNI: false
kubeProxyMode: "iptables"
nodes:
- role: control-plane
image: kindest/node:v1.25.3
extraPortMappings:
- containerPort: 80
hostPort: 8080
protocol: TCP
- containerPort: 443
hostPort: 8443
protocol: TCP
- role: worker
image: kindest/node:v1.25.3
- role: worker
image: kindest/node:v1.25.3
- role: worker
image: kindest/node:v1.25.3
kind create cluster --config kind-config.yaml
보통 Cert-Manager와 IngressController는 사용중일 수 있기 때문에 우선은 설치된 환경을 구현하고자한다. 실제로 내 Private 망 서버에도 설치가 되어있었다.
kubectl create ns gitlab
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.14.5/cert-manager.yaml
미리 gitlab tls 인증서를 만들어놓아도 괜찮다. 만드는 방법은 다음과 같다.
# selfsigned-clusterissuer.yaml
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: selfsign
namespace: cert-manager
spec:
selfSigned: {}
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: root-ca
namespace: cert-manager
spec:
renewBefore: 360h
duration: 87600h
isCA: true
commonName: "*.localhost"
secretName: root-secret
privateKey:
algorithm: ECDSA
size: 256
issuerRef:
name: selfsign
kind: ClusterIssuer
group: cert-manager.io
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: root-ca
namespace: cert-manager
spec:
renewBefore: 360h
duration: 87600h
isCA: true
commonName: "*.localhost"
secretName: root-secret
privateKey:
algorithm: ECDSA
size: 256
issuerRef:
name: selfsign
kind: ClusterIssuer
group: cert-manager.io
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: gitlab-cert
namespace: gitlab # GitLab이 설치된 네임스페이스
spec:
secretName: gitlab-tls # 이 Secret 이름이 GitLab Ingress에서 참조됨
issuerRef:
name: self-ca # 이미 존재하는 ClusterIssuer
kind: ClusterIssuer
duration: 8760h # 90일
renewBefore: 360h # 15일 전에 갱신
dnsNames:
- gitlab.localhost
- registry.localhost
- minio.localhost
- kas.localhost
kubectl apply -f selfsign.yaml
kubectl apply -f slef-ca-certificate.yaml
kubectl apply -f slef-ca.yaml
kubectl apply -f gitlab-tls.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/kind/deploy.yaml
curl -fsSL https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
helm version
helm repo add gitlab https://charts.gitlab.io/
helm repo list
helm repo update
helm pull gitlab/gitlab --untar
=> 해당 과정을 거치면 GitLab Chart를 가져올 수 있다.

해당 디렉토리 위치를 vscode 로 열어서 커스텀 해야한다. 커스텀하는 파일은 다음과 같다.
gitlab chart 버전마다 조금씩 기술된 위치가 다를 수 있다.
values.yaml - global:edition: ce
hosts:
domain: localhost
해당 칸은 사용 중인 도메인을 사용하면 된다. 해당 도메인을 사용하면 Helm Chart가 총 네가지의 도메인을 만들어준다.
gitlab.example.com : GitLab Web UI (Main 서비스)registry.example.com : GitLab Container Registryminio.example.com : GitLab 내부 Object Storage (MinIO)kas.example.com : GitLab Kubernetes Agent Server (KAS)+물론 나는 외부 DNS 를 사용하지만, localhost를 로컬에서 DNS처럼 사용하고 싶으면 해당 파일에 DNS 를 등록해주어야 사용가능하다.
C:\Windows\System32\drivers\etc\hosts
# Copyright (c) 1993-2009 Microsoft Corp. # # This is a sample HOSTS file used by Microsoft TCP/IP for Windows. # ... 127.0.0.1 testing.127.0.0.1.nip.io 127.0.0.1 gitlab.localhost # 등록한 부분 127.0.0.1 registry.localhost # 등록한 부분 127.0.0.1 minio.localhost # 등록한 부분 127.0.0.1 kas.localhost # 등록한 부분 127.0.0.1 jenkins.localhost # Added by Docker Desktop 172.16.11.247 host.docker.internal 172.16.11.247 gateway.docker.internal # To allow the same kube context to work on the host and the container: 127.0.0.1 kubernetes.docker.internal # End of section외부 DNS를 사용한다면 서브 Domain 을 외부 DNS에서 등록해주면 된다.
## https://docs.gitlab.com/charts/charts/globals#configure-ingress-settings
ingress:
apiVersion: ""
configureCertmanager: false # cert-manager를 Gitlab이 덮어쓰지 않도록
# useNewIngressForCerts: false
provider: nginx
class: nginx # 우리는 현재 설치된 nginx-Ingress를 사용할 것이다.
annotations: {}
enabled: true
tls:
enabled: true
secretName: gitlab-tls # 이전에 만들었던 secret이다.
path: /
pathType: Prefix
installCertmanager: false
...
certmanager:
installCRDs: false # => 현재 존재하기때문에 false
nginx-ingress:
enabled: false # nginxingress controller도 수동으로 설치하였기에 false로 설정한다.
prometheus:
install: false # proetheus가 당장 필요하지는 않음.
gitlab-runner:
install: false # gitlab-runner 대신 추후에 Jenkins를 쓰고자 함.
helm install gitlab gitlab/gitlab \
-n gitlab \
-f values.yaml
kubectl port-forward \
-n ingress-nginx \
svc/ingress-nginx-controller \
--address 0.0.0.0 \
8180:80 \
9443:443
설치된 프록시 서버인 nginx-ingress-controller를 포워딩해주면 생성돤 ingress에 따라 접속이 가능해질 것이다.
이후, 다음과 같이 gitlab.localhost:9443 을 접속할 수 있을 것이다.

ROOTkubectl get secret gitlab-gitlab-initial-root-password \
-n gitlab \
-o jsonpath="{.data.password}" | base64 --decode
ex : B2N8oUaxyMXWbUhnxoUL41PEerN4UujGzJ4FBHt45fi7xIuGYbEJKKBuM2gOkpvB

다음과 같이 로그인이 가능하다.
ps. gitlab-tls
Jenkins 나 로컬과 같은 곳에서 gitlab에 대해 https(jenkins의 multipipeline / local의 gitclone)과 같은요청을 한다면?
아마 인증서 관련 에러가 뜰 것이다.
그럴 때는 gitlab-tls(우리가 만들었던 Certificate(Secret) 리소스) 에서 인증서 부분을 추출하여OS 신뢰저장소orjava Keystore등에 추가하면 된다.
해당 인증서를 추가하는 방법은 다음과 같다.
- 인증서 추출 방법
kubectl get secret gitlab-tls -n gitlab \ -o jsonpath="{.data.tls\.crt}" | base64 -d > gitlab.crt=> gitlab.crt가 파일로 생성된다.
- OS 신뢰저장소 기준 (Linux 계열)
sudo cp gitlab.crt /usr/local/share/ca-certificates/gitlab.crt sudo update-ca-certificates
- Window 계열
- 구글에 Windows 사설 인증서 설치하는 방법에 관한 레퍼런스가 너무 잘나와있다.
- KeyStore 기준 (jenkins : jnlp sidecar container 기준)
keytool -importcert \ -alias gitlab-ca \ -file gitlab.crt \ -keystore $JAVA_HOME/lib/security/cacerts