카테고리 없음

[3주차] 깃옵스 시스템 (harbor / gitlab / argocd)

james_janghun 2023. 3. 26. 08:15

이번 시간에는 쿠버네티스를 통해 깃옵스를 하는 방법에 대해서 확인해보자.

 

Harbor 설치

Harbor는 컨테이너 레지스트리로 우리가 흔히아는 docker hub, 혹은 AWS ECR 등과 같은 서비스이다. 주로 nexus3 등과 비교가 된다.

 

보안관리, 역할기반 엑세스 제어(RBAC), 무료 이미지와 취약점 검사 등을 진행할 수 있다.

 

일단 설치를 위해서 Helm을 사용한다. 따라서 repo add를 진행하고 values.yaml에 아래 내용을 기입한다.

# 하버 설치
helm repo add harbor https://helm.goharbor.io
helm fetch harbor/harbor --untar --version 1.11.0
vim ~/harbor/values.yaml
----------------------
expose.tls.certSource=none                        # 19줄
expose.ingress.hosts.core=harbor.<각자자신의도메인>    # 36줄
expose.ingress.hosts.notary=notary.<각자자신의도메인>  # 37줄
expose.ingress.controller=alb                      # 44줄
expose.ingress.className=alb                       # 47줄~
expose.ingress.annotations=alb.ingress.kubernetes.io/scheme: internet-facing
expose.ingress.annotations=alb.ingress.kubernetes.io/target-type: ip
expose.ingress.annotations=alb.ingress.kubernetes.io/listen-ports: '[{"HTTPS":443}, {"HTTP":80}]'
expose.ingress.annotations=alb.ingress.kubernetes.io/certificate-arn: ${CERT_ARN}   # 각자 자신의 값으로 수정입력

externalURL=https://harbor.<각자자신의도메인>          # 131줄
# 설치
kubectl create ns harbor
helm install harbor harbor/harbor -f ~/harbor/values.yaml --namespace harbor --version 1.11.0

# 확인
helm list -n harbor
kubectl get-all -n harbor
kubectl get pod,pvc,ingress,deploy,sts -n harbor
kubectl get ingress -n harbor harbor-ingress -o json | jq
kubectl krew install df-pv && kubectl df-pv

# 웹 접속 주소 확인 및 접속
echo -e "harbor URL = https://harbor.$KOPS_CLUSTER_NAME"
echo -e "notary URL = https://notary.$KOPS_CLUSTER_NAME"

root@kops-ec2 ~]# kubectl get all -n harbor
NAME                                        READY   STATUS    RESTARTS   AGE
pod/harbor-chartmuseum-656c864cf9-gvfrc     1/1     Running   0          11m
pod/harbor-core-55c4767f5d-94th2            1/1     Running   0          11m
pod/harbor-database-0                       1/1     Running   0          11m
pod/harbor-jobservice-866b7998db-vrbq4      1/1     Running   0          11m
pod/harbor-notary-server-56d5b58c8d-7mh9v   1/1     Running   0          11m
pod/harbor-notary-signer-749b5df7b6-9dw9b   1/1     Running   0          11m
pod/harbor-portal-d74b69db4-7wg45           1/1     Running   0          11m
pod/harbor-redis-0                          1/1     Running   0          11m
pod/harbor-registry-5477888665-ln8kn        2/2     Running   0          11m
pod/harbor-trivy-0                          1/1     Running   0          10m

NAME                           TYPE           CLUSTER-IP       EXTERNAL-IP                                                                 PORT(S)             AGE
service/harbor-chartmuseum     ClusterIP      100.67.39.71     <none>                                                                      80/TCP              11m
service/harbor-core            NodePort       100.70.138.31    <none>                                                                      80:32718/TCP        11m
service/harbor-database        ClusterIP      100.71.31.110    <none>                                                                      5432/TCP            11m
service/harbor-jobservice      ClusterIP      100.67.26.57     <none>                                                                      80/TCP              11m
service/harbor-notary-server   NodePort       100.65.87.17     <none>                                                                      4443:31606/TCP      11m
service/harbor-notary-signer   ClusterIP      100.70.208.106   <none>                                                                      7899/TCP            11m
service/harbor-portal          LoadBalancer   100.66.197.6     a7f1fbbff3d8940ff8a4fef70be1a2d9-2944305.ap-northeast-2.elb.amazonaws.com   80:32240/TCP        11m
service/harbor-redis           ClusterIP      100.65.27.213    <none>                                                                      6379/TCP            11m
service/harbor-registry        ClusterIP      100.65.152.144   <none>                                                                      5000/TCP,8080/TCP   11m
service/harbor-trivy           ClusterIP      100.65.153.129   <none>                                                                      8080/TCP            11m

NAME                                   READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/harbor-chartmuseum     1/1     1            1           11m
deployment.apps/harbor-core            1/1     1            1           11m
deployment.apps/harbor-jobservice      1/1     1            1           11m
deployment.apps/harbor-notary-server   1/1     1            1           11m
deployment.apps/harbor-notary-signer   1/1     1            1           11m
deployment.apps/harbor-portal          1/1     1            1           11m
deployment.apps/harbor-registry        1/1     1            1           11m

NAME                                              DESIRED   CURRENT   READY   AGE
replicaset.apps/harbor-chartmuseum-656c864cf9     1         1         1       11m
replicaset.apps/harbor-core-55c4767f5d            1         1         1       11m
replicaset.apps/harbor-jobservice-866b7998db      1         1         1       11m
replicaset.apps/harbor-notary-server-56d5b58c8d   1         1         1       11m
replicaset.apps/harbor-notary-signer-749b5df7b6   1         1         1       11m
replicaset.apps/harbor-portal-d74b69db4           1         1         1       11m
replicaset.apps/harbor-registry-5477888665        1         1         1       11m

NAME                               READY   AGE
statefulset.apps/harbor-database   1/1     11m
statefulset.apps/harbor-redis      1/1     11m
statefulset.apps/harbor-trivy      1/1     11m

 

 

Gitlab 배포 및 실행

Github와 양대산맥인 Gitlab은 오픈소스 원격 저장소로 깃 리포지토리로 자주 활용되는 도구이다. 이렇게 컨테이너 형태로 설치가 가능해 프라이빗하게 사용할 수 있다.

kubectl create ns gitlab

helm repo add gitlab https://charts.gitlab.io/
helm repo update
helm fetch gitlab/gitlab --untar --version 6.8.1
vim ~/gitlab/values.yaml

global:
  hosts:
    domain: <각자자신의도메인>             # 52줄
    https: true

  ingress:                             # 66줄~
    configureCertmanager: false
    provider: aws
    class: alb
    annotations:
      alb.ingress.kubernetes.io/scheme: internet-facing
      alb.ingress.kubernetes.io/target-type: ip
      alb.ingress.kubernetes.io/listen-ports: '[{"HTTPS":443}, {"HTTP":80}]'
      alb.ingress.kubernetes.io/certificate-arn: ${CERT_ARN}   # 각자 자신의 값으로 수정입력
      alb.ingress.kubernetes.io/success-codes: 200-399
      alb.ingress.kubernetes.io/group.name: "gitlab"
    tls:                               # 79줄
      enabled: false


helm install gitlab gitlab/gitlab -f ~/gitlab/values.yaml --set certmanager.install=false --set nginx-ingress.enabled=false --set prometheus.install=false --set gitlab-runner.install=false --namespace gitlab --version 6.8.4
#접속 확인
kubectl get secrets -n gitlab gitlab-gitlab-initial-root-password --template={{.data.password}} | base64 -d ;echo

 

ArgoCD 배포 및 실행

ArgoCD는 대표적인 CD 툴로 쿠버네티스와 연동하여 애플리케이션을 배포하고 관리하도록 한다. 특히 깃옵스의 대표적인 툴로 깃허브와도 연동이 가능하여, 깃허브를 원천소스로 사용한다.

# 모니터링
kubectl create ns argocd
watch kubectl get pod,pvc,svc -n argocd

# 설치
cd
helm repo add argo https://argoproj.github.io/argo-helm
helm repo update
helm install argocd argo/argo-cd --set server.service.type=LoadBalancer --namespace argocd --version 5.19.14

# 확인
helm list -n argocd
kubectl get pod,pvc,svc,deploy,sts -n argocd
kubectl get-all -n argocd


# CLB에 ExternanDNS 로 도메인 연결
kubectl annotate service -n argocd argocd-server "external-dns.alpha.kubernetes.io/hostname=argocd.$KOPS_CLUSTER_NAME"

# admin 계정의 암호 확인
ARGOPW=$(kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d)
echo $ARGOPW

# 웹 접속 로그인 (admin) CLB의 DNS 주소로 접속
echo -e "Argocd Web URL = https://argocd.$KOPS_CLUSTER_NAME"

 

 

ArgoCD는 UI 뿐 아니라 CLI에서도 활용이 가능한데 ArgoCD CLI를 통해서 커멘드라인에서도 사용이 가능합니다.

단순히 UI뿐아니라 CLI에서도 gitlab 주소를 추가해 repo에 등록할 수 있습니다.

# 최신버전 설치
curl -sSL -o argocd-linux-amd64 https://github.com/argoproj/argo-cd/releases/latest/download/argocd-linux-amd64
install -m 555 argocd-linux-amd64 /usr/local/bin/argocd
chmod +x /usr/local/bin/argocd

# 버전 확인
argocd version --short

# argocd 서버 로그인
argocd login argocd.$KOPS_CLUSTER_NAME --username admin --password $ARGOPW

# 기 설치한 깃랩의 프로젝트 URL 을 argocd 깃 리포지토리(argocd repo)로 등록. 깃랩은 프로젝트 단위로 소스 코드를 보관.
argocd repo add https://gitlab.$KOPS_CLUSTER_NAME/<깃랩 계정명>/test-stg.git --username <깃랩 계정명> --password <깃랩 계정 암호>