Agile&DevOps/CI, CD 툴 설치

GitLab image registry 설치 및 사용 환경 구성

Happy@Cloud 2019. 9. 12. 13:02

GitLab image registry를 helm chart를 이용하여 설치하는 방법을 가이드 합니다.

helm chart 버전은 8.4.1 입니다. 

ubuntu@bastion:~/install/gitlab$ helm search repo gitlab/gitlab --versions
NAME                  	CHART VERSION	APP VERSION	DESCRIPTION                                       
gitlab/gitlab         	8.4.1        	v17.4.1    	GitLab is the most comprehensive AI-powered Dev...

 

사전준비

- nfs dynamic provisioning

happycloud-lee.tistory.com/178?category=832243

 

설치하기

1) 작업 디렉토리 생성

작업할 VM에서 작업 디렉토리를 생성 합니다. 

mkdir -p ~/install/gitlab && cd ~/install/gitlab

 

2) Helm repo 추가 

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

3) 설치 values 파일 생성

domain과 SSL인증서 자동생성에 사용될 email을 등록합니다. 

gitlab 설치 후 여러개의 ingress 객체가 만들어집니다. 이때 host명의 domain이 사용됩니다.

k create ns gitlab
kubens gitlab
helm upgrade gitlab -i -f gitlab.yaml gitlab/gitlab -n gitlab


예를 들어 Web서버 Ingress 호스트는 gitlab.git.msa.edutdc.com이 됩니다. 

$ vi gitlab.yaml

global:
  hosts:
    domain: git.msa.edutdc.com

certmanager-issuer:
  # The email address to register certificates requested from Let's Encrypt.
  # Required if using Let's Encrypt.
  email: hiondal@gmail.com

 

4) 설치

namespace를 만들고 이동한 후 설치 합니다.

k create ns gitlab
kubens gitlab
helm upgrade gitlab -i -f gitlab.yaml gitlab/gitlab -n gitlab

 

5) Pod생성 완료 시까지 대기

watch kubectl get po

 

* gitlab-runner 파드가 Readiness Probe가 실패하면서 실행 안될 때

- deployment yaml을 생성하고, 내용 중 서버 명을 서비스 객체로 바꾼 후, 기존 파드를 지우고 다시 설치 합니다. 

k get deploy gitlab-gitlab-runner -o yaml > runner.yaml
$ vi runner.yaml

...

    spec:
      containers:
      - command:
        - /usr/bin/dumb-init
        - --
        - /bin/bash
        - /configmaps/entrypoint
        env:
        - name: CI_SERVER_URL
          value: http://gitlab-webservice-default:8181
          #value: http://gitlab.git.msa.edutdc.com
        - name: RUNNER_EXECUTOR
 ...
$ k delete -f runner.yaml
$ k apply -f runner.yaml

 

* 실수로 다른 네임 스페이스에 설치하여, 재설치하는 경우

ubuntu@bastion:~/install/gitlab$ helm upgrade gitlab -i -f gitlab.yaml gitlab/gitlab -n gitlab
Release "gitlab" does not exist. Installing it now.
Error: Unable to continue with install: CustomResourceDefinition "certificaterequests.cert-manager.io" in namespace "" exists and cannot be imported into the current release: invalid ownership metadata; label validation error: missing key "app.kubernetes.io/managed-by": must be set to "Helm"; annotation validation error: missing key "meta.helm.sh/release-name": must be set to "gitlab"; annotation validation error: missing key "meta.helm.sh/release-namespace": must be set to "gitlab"

CRD(Custom Resource Definition)객체들을 모두 지우고, 기존 객체 모두 지운 후, 네임스페이스까지 삭제하고 다시 설치하세요.

k get crd | grep cert-manager.io

k delete pvc --all

kubectl get pv -o json | jq -r '.items[] | select(.status.phase == "Released") | .metadata.name' | xargs kubectl delete pv

kubens default

k delete ns gitlab

다시 gitlab 네임스페이스 생성하고 이동한 후 설치 합니다.  이때, gitlab-runner파드가 설치 안되면 바로 위 방법으로 설치합니다. 

k create ns gitlab
kubens gitlab
helm upgrade gitlab -i -f gitlab.yaml gitlab/gitlab

 


k8s cluster 외부에서 접근 설정(k8s cluster 외부에서 접근 불가 시)

아래와 같이 proxying할 VM에서 haproxy를 설치하고 port forwarding을 합니다. 

iptables를 이용할 수도 있습니다. 

단, 사전에 ingress controller가 설치되어 있어야 하고 service객체는 30080과 30443으로 접근할 수 있어야 합니다.

DNS서버가 없어 backend서버를 host명으로 지정 못하면 privaet IP로  지정하면 됩니다. 

global
	log /dev/log	local0
	log /dev/log	local1 notice
	chroot /var/lib/haproxy
	stats socket /run/haproxy/admin.sock mode 660 level admin
	stats timeout 30s
	user haproxy
	group haproxy
	daemon

	# Default SSL material locations
	ca-base /etc/ssl/certs
	crt-base /etc/ssl/private

	# See: https://ssl-config.mozilla.org/#server=haproxy&server-version=2.0.3&config=intermediate
        ssl-default-bind-ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
        ssl-default-bind-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256
        ssl-default-bind-options ssl-min-ver TLSv1.2 no-tls-tickets

defaults
	log	global
	mode	http
	option	httplog
	option	dontlognull
        timeout connect 5000
        timeout client  50000
        timeout server  50000
	errorfile 400 /etc/haproxy/errors/400.http
	errorfile 403 /etc/haproxy/errors/403.http
	errorfile 408 /etc/haproxy/errors/408.http
	errorfile 500 /etc/haproxy/errors/500.http
	errorfile 502 /etc/haproxy/errors/502.http
	errorfile 503 /etc/haproxy/errors/503.http
	errorfile 504 /etc/haproxy/errors/504.http
	maxconn                 3000

listen stats
    bind :9000
    mode http
    stats enable
    stats uri /
    monitor-uri /healthz

frontend api-server
    bind *:6443
    default_backend api-server
    mode tcp
    option tcplog

backend api-server
    balance source
    mode tcp
    server controlplane controlplane.msa.edutdc.com:6443 check

frontend http-in
    bind *:80
    mode tcp
    option tcplog
    default_backend http-backend

frontend https-in
    bind *:443
    mode tcp
    option tcplog
    default_backend https-backend

backend http-backend
    mode tcp
    server worker1 worker1.msa.edutdc.com:30080
    server worker2 worker2.msa.edutdc.com:30080

backend https-backend
    mode tcp
    server worker1 worker1.msa.edutdc.com:30443
    server worker2 worker2.msa.edutdc.com:30443

로그인, root 암호변경, 테스트 사용자와 repository 추가 

1) Host 추가 

ingress 주소를 확인합니다. 

ubuntu@bastion:~/install/gitlab$ k get ing
NAME                        CLASS          HOSTS                         ADDRESS   PORTS     AGE
gitlab-kas                  gitlab-nginx   kas.git.msa.edutdc.com                  80, 443   70m
gitlab-minio                gitlab-nginx   minio.git.msa.edutdc.com                80, 443   70m
gitlab-registry             gitlab-nginx   registry.git.msa.edutdc.com             80, 443   70m
gitlab-webservice-default   gitlab-nginx   gitlab.git.msa.edutdc.com               80, 443   70m

PC의 hosts에 'gitlab.git.msa.edutdc.com'를 등록합니다. 

IP는 proxy서버를 이용하는 경우는 그 VM의 public IP를 등록하고, k8s cluster를 직접 접근하는 경우는 아무 노드의 public ip를 등록하면 됩니다. 

 

2) 로그인 화면 접속

브라우저에서 https://gitlab.git.msa.edutdc.com 으로 접근합니다. 

안전하지 않은 접근 어쩌고 하는 경고는 무시합니다. 테스트 인증서이기 때문에 나오는 경고입니다. 

3) 로그인 하기

ID는 'root'입니다. 

암호는 시크릿 'gitlab-gitlab-initial-root-password' 객체에서 아래를 참조하여 구합니다. 

$ k get secret gitlab-gitlab-initial-root-password -o yaml
apiVersion: v1
data:
  password: MFlMT3RHeUMwZUpTU3l6RUg1NWtIN1k1aEtEOFRuUXBpeW53ZG5WSmtUYjZqbUFKdW40aFNiNzNHNWgwWmpFUg==
kind: Secret
...

$ echo MFlMT3RHeUMwZUpTU3l6RUg1NWtIN1k1aEtEOFRuUXBpeW53ZG5WSmtUYjZqbUFKdW40aFNiNzNHNWgwWmpFUg== | base64 -d
0YLOtGyC0eJSSyzEH55kH7Y5hKD8TnQpiynwdnVJkTb6jmAJun4hSb73G5h0ZjERubuntu@bastion:~/install/gitlab$

 

4) 루트 암호 변경

 

 

 

5) 테스트 사용자 추가

좌측 하단의 [Admin]버튼을 누르고, Users 메뉴에서 사용자를 추가합니다. 

이때 암호는 어차피 바꿀 초기 암호이므로 실제 암호가 아닌 적절한 임시 암호로 지정합니다. 

등록된 유저로 로그인하고, 자동으로 나오는 암호 변경화면에서 암호를 변경 합니다. 

 

6) 테스트 레포지토리 추가

테스트 사용자로 로그인한 후 좌측의 'Projects'메뉴에서 레포지토리를 추가합니다 

 

7) SSH key 생성 및 등록: ssh로 pull/push할 때만 필요

Git Client인 PC와 VM에서 수행합니다. 단, ssh key는 한쪽에서 생성한 것을 이용해야 합니다. 

아래 예제에서 email은 사용자 등록 시 지정한 email과 동일해야 합니다. 

SSH key 추가: ssh로 pull/push하려면 수행 
- ssh key 만들기: Git client에서 수행
ssh-keygen -t ed25519 -C "user00@gmail.com"
cat ~/.ssh/id_ed25519.pub

- Git에 추가
GitLab에 로그인하고, 프로필 설정(Profile Settings)으로 이동합니다.
왼쪽 메뉴에서 "SSH Keys"를 클릭합니다.
"Key" 필드에 복사한 공개 키를 붙여넣습니다.
"Title" 필드에 이 키를 설명하는 이름을 입력합니다. 예를 들어 "My MacBook Air"와 같이 입력할 수 있습니다.
"Add key"를 클릭하여 SSH 키를 추가합니다

Git Client 설정 

remote repository에서 https 프로토콜로 pull/push하기 위해서 작업 하여야 합니다. 

이를 위해 SSL인증서를 client에 등록해야 합니다. 

1) SSL 인증서 추출 

kubectl get secret gitlab-gitlab-tls -o jsonpath="{.data['tls\.crt']}" | base64 --decode > gitlab-tls.crt

아래 명령으로 host명이 정확한지 확인합니다.

openssl x509 -in gitlab-tls.crt -text -noout

 

2) 인증서 등록

OS에 따라 아래와 같이 등록합니다.

- Git client(로컬, bastion)에 추가
. Mac
sudo vi /etc/ssl/certs/gitlab-tls.crt
git config --global http.sslCAPath /etc/ssl/certs/gitlab-tls.crt

. Window
copy tls.crt C:\Program Files\Git\usr\ssl\certs\
git config --global http.sslCAInfo C:/Program\ Files/Git/usr/ssl/certs/tls.crt

. Linux
sudo cp gitlab-tls.crt /usr/local/share/ca-certificates/
sudo update-ca-certificates

 

3) Access Token 생성

Edit Profile 메뉴를 누르고 Access Tokens에서 생성합니다.

Pull/push 시 로그인 암호 대신 이 토큰을 입력해야 합니다. 

 

4) Pull/push 테스트

이전 단계에서 만든 테스트 레포지토리를 clond 하고 푸쉬 해 봅니다.