(PKOS) Kubernetes GitOps 시스템 – 하버, GitLab, ArgoCD


이 기사는 연구에 참여하면서 배운 내용을 기반으로 Kubernetes를 요약한 기사 시리즈입니다.

책 “24단계 실습으로 쿠버네티스 정복하기”의 내용을 기반으로 합니다.
연구 진행 상황에 따라 4~5개의 글을 쓸 예정입니다.

이 기사에서는 GitOps 시스템을 살펴보겠습니다.
이 시스템은 Harbor, GitLab 및 ArgoCD를 사용합니다.

이번에 실습할 시스템 구성은 아래 그림과 같습니다.
개인/기업 컨테이너 이미지를 Harbor에 업로드하고, Harbour를 기반으로 Application을 배포합니다.
이후 GitLab의 소스 구성을 모니터링하는 argoCD가 동기화를 진행하여 배포합니다.


1. 실습 환경의 배포

따라서 실제 환경에 들어가십시오. Kops 환경을 제공합니다.
콥스 분포는 kOps 및 기본 Kubernetes 관리 방법을 사용한 (PKOS) 클러스터 설치 기사에 자세히 설명되어 있습니다.
이번에는 CPU가 많이 필요한 시스템이고, 상대적으로 사양이 높은 인스턴스 유형을 사용할 계획입니다.
마스터 노드 c5a.2xlarge / 작업자 노드는 c5a.2xlarge를 사용합니다.

배포 후 AWS LoadBalancer 컨트롤러는 AWS에 액세스할 수 있도록 IAM을 설정합니다.
kops 인스턴스(t3.small)는 yaml에 미리 설치된 Docker 엔진과 함께 제공됩니다.

# YAML 파일 다운로드
curl -O https://s3.ap-northeast-2.amazonaws.com/cloudformation.cloudneta.net/K8S/kops-oneclick-f1.yaml

# CloudFormation 스택 배포 : 노드 인스턴스 타입 변경 - MasterNodeInstanceType=t3.medium WorkerNodeInstanceType=c5d.large
aws cloudformation deploy --template-file kops-oneclick-f1.yaml --stack-name mykops --parameter-overrides KeyName=ygpark SgIngressSshCidr=$(curl -s ipinfo.io/ip)/32  MyIamUserAccessKeyID=AKIA6NUKWRMLEXRDE3VA MyIamUserSecretAccessKey='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' ClusterBaseName="ygpark.net" S3StateStore="ygpark-s3" MasterNodeInstanceType=c5a.2xlarge WorkerNodeInstanceType=c5a.2xlarge --region ap-northeast-2

# CloudFormation 스택 배포 완료 후 kOps EC2 IP 출력
aws cloudformation describe-stacks --stack-name mykops --query 'Stacks(*).Outputs(0).OutputValue' --output text
43.201.70.172

# 13분 후 작업 SSH 접속
ssh -i /mnt/c/vswork/_pkos2/secret/ygpark.pem ec2-user@$(aws cloudformation describe-stacks --stack-name mykops --query 'Stacks(*).Outputs(0).OutputValue' --output text)

# EC2 instance profiles 에 IAM Policy 추가(attach) : 처음 입력 시 적용이 잘 안될 경우 다시 한번 더 입력 하자!
- IAM Role에서 새로고침 먼저 확인!
aws iam attach-role-policy --policy-arn arn:aws:iam::$ACCOUNT_ID:policy/AWSLoadBalancerControllerIAMPolicy --role-name masters.$KOPS_CLUSTER_NAME aws iam attach-role-policy --policy-arn arn:aws:iam::$ACCOUNT_ID:policy/AWSLoadBalancerControllerIAMPolicy --role-name nodes.$KOPS_CLUSTER_NAME # 메트릭 서버 확인 : 메트릭은 15초 간격으로 cAdvisor를 통하여 가져옴 kubectl top node

2. 항구


https://goharbor.io/

제가 주로 사용하는 CSP인 Google Cloud에서 Google Container Registry를 제공합니다.
Harbor를 사용하면 이러한 기능을 로컬에서 사용할 수 있습니다.

Harbor는 오픈 소스 컨테이너 이미지 레지스트리입니다.
RBAC, 이미지 취약성 검색, 다른 원격 리포지토리의 이미지 복제와 같은 다양한 기능을 제공합니다.
이 실습에서는 로컬 컨테이너 이미지 리포지토리를 생성하고 컨테이너 이미지를 업로드합니다.
최소 사양은 CPU 2개, 메모리 4개, 하드디스크 40GB입니다.

투구 차트로 하버 설치

Helm Chart와 함께 Harbour를 다운로드하고 yaml 파일을 수정하여 배포합니다.
설치는 -f 옵션과 함께 적절한 YAML 파일로 계속됩니다.

# 사용 리전의 인증서 ARN 확인
aws acm list-certificates --query 'CertificateSummaryList().CertificateArn()' --output text
CERT_ARN=`aws acm list-certificates --query 'CertificateSummaryList().CertificateArn()' --output text`
echo "alb.ingress.kubernetes.io/certificate-arn: $CERT_ARN"

alb.ingress.kubernetes.io/certificate-arn: arn:aws:acm:ap-northeast-2:991354587926:certificate/013ca7db-cc9a-479d-b407-52fe0f891184

# 하버 설치
**helm repo add harbor <https://helm.goharbor.io>**
"harbor" has been added to your repositories

**helm fetch harbor/harbor --untar --version 1.11.0**
**vim ~/harbor/values.yaml

:set nu**
----------------------
expose.tls.**certSource: none                        # 19줄**
expose.ingress.hosts.**core=harbor.ygpark.net**    # 36줄
expose.ingress.hosts.**notary=notary.ygpark.net**  # 37줄
expose.ingress.hosts.core=harbor.gasida.link
expose.ingress.hosts.notary=notary.gasida.link
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}   # 각자 자신의 값으로 수정입력
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: arn:aws:acm:ap-northeast-2:991354587926:certificate    /013ca7db-cc9a-479d-b407-52fe0f891184**   # 각자 자신의 값으로 수정입력
**externalURL=https://harbor.<각자자신의도메인>          # 131줄**
externalURL=https://harbor.ygpark.net            
----------------------

# 모니터링
**kubectl create ns harbor
watch kubectl get pod,pvc,ingress -n harbor

# 설치**
**helm install harbor harbor/harbor -f ~/harbor/values.yaml --namespace harbor --version 1.11.0**

Every 2.0s: kubectl get pod,pvc,ingress -n harbor                                                                                                                           Sat Mar 25 22:51:04 2023

NAME                                       READY   STATUS              RESTARTS   AGE
pod/harbor-chartmuseum-699fb8c47f-gmdx4    1/1     Running             0          27s
pod/harbor-core-78c8bb4677-xkpsg           0/1     Running             0          27s
pod/harbor-database-0                      0/1     Init:0/2            0          27s
pod/harbor-jobservice-74756ff4b6-d6gk5     0/1     ContainerCreating   0          27s
pod/harbor-notary-server-8d959fc-45d8b     0/1     Running             0          27s
pod/harbor-notary-signer-8c675f8f7-2xfbr   0/1     Running             0          27s
pod/harbor-portal-d74b69db4-9kwdf          1/1     Running             0          27s
pod/harbor-redis-0                         1/1     Running             0          27s
pod/harbor-registry-6889985fb9-mfc7p       0/2     ContainerCreating   0          27s
pod/harbor-trivy-0                         0/1     Running             0          27s

NAME                                                    STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS    AGE
persistentvolumeclaim/data-harbor-redis-0               Bound    pvc-2b606e26-56b4-4bcc-bdbb-4893cb8a9580   1Gi        RWO            kops-csi-1-21   27s
persistentvolumeclaim/data-harbor-trivy-0               Bound    pvc-708a26b8-2bef-498a-8ccf-02415f3e883b   5Gi        RWO            kops-csi-1-21   27s
persistentvolumeclaim/database-data-harbor-database-0   Bound    pvc-63505ece-bed0-41ea-80d0-b4d4dbb55540   1Gi        RWO            kops-csi-1-21   27s
persistentvolumeclaim/harbor-chartmuseum                Bound    pvc-7cd0bf49-5fd6-4414-aa5d-e656c9080419   5Gi        RWO            kops-csi-1-21   28s
persistentvolumeclaim/harbor-jobservice                 Bound    pvc-55422288-a483-41f3-8986-9142c701cd1e   1Gi        RWO            kops-csi-1-21   28s
persistentvolumeclaim/harbor-jobservice-scandata        Bound    pvc-9efbede1-b3aa-4d22-b590-e9916069f849   1Gi        RWO            kops-csi-1-21   28s
persistentvolumeclaim/harbor-registry                   Bound    pvc-9d8ea2b6-5f6b-49f1-bf89-fb873f374be2   5Gi        RWO            kops-csi-1-21   28s

NAME                                              CLASS   HOSTS               ADDRESS                                                                     PORTS     AGE
ingress.networking.k8s.io/harbor-ingress          alb     harbor.ygpark.net   k8s-harbor-harborin-bb2fb3a2ee-151357625.ap-northeast-2.elb.amazonaws.com   80, 443   27s
ingress.networking.k8s.io/harbor-ingress-notary   alb     notary.ygpark.net   k8s-harbor-harborin-d35c76cb3a-158542167.ap-northeast-2.elb.amazonaws.com   80, 443   27s

# 확인
# registry : 컨테이너 이미지를 저장
# chartmuseum : 하버를 컨테이너 이미지뿐 아니라, 헬름 차트 리포지토리로도 사용
# notary : 서명이 완료된 컨테이너 이미지만 운영 환경에 사용하도록 설정. 서명이 완료된 이미지는 별도로 구분
# trivy : 컨테이너 이미지의 보안 취약점을 스캔, 스캔 기능은 별도 솔루션에서 제공하여 관리자는 보안 스캔용 도구를 선택 가능
**helm list -n harbor**
NAME    NAMESPACE       REVISION        UPDATED                                 STATUS          CHART           APP VERSION
****harbor  harbor          1               2023-03-25 22:50:33.722971229 +0900 KST deployed        harbor-1.11.0   2.7.0

**kubectl get-all -n harbor**
NAME                                                             NAMESPACE  AGE
configmap/harbor-chartmuseum                                     harbor     4m6s
configmap/harbor-core                                            harbor     4m6s
...
ingress.networking.k8s.io/harbor-ingress-notary                  harbor     4m5s

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

PV NAME                                   PVC NAME                         NAMESPACE  NODE NAME            POD NAME                             VOLUME MOUNT NAME     SIZE   USED  AVAILABLE  %USED  IUSED  IFREE   %IUSED
 pvc-2b606e26-56b4-4bcc-bdbb-4893cb8a9580  data-harbor-redis-0              harbor     i-0f1fa370eafcd2c69  harbor-redis-0                       data                  973Mi  24Ki  957Mi      0.00   11     65525   0.02
 pvc-708a26b8-2bef-498a-8ccf-02415f3e883b  data-harbor-trivy-0              harbor     i-01a853fd2d2002b87  harbor-trivy-0                       data                  4Gi    32Ki  4Gi        0.00   13     327667  0.00
 pvc-7cd0bf49-5fd6-4414-aa5d-e656c9080419  harbor-chartmuseum               harbor     i-0f1fa370eafcd2c69  harbor-chartmuseum-699fb8c47f-gmdx4  chartmuseum-data      4Gi    24Ki  4Gi        0.00   11     327669  0.00
 pvc-63505ece-bed0-41ea-80d0-b4d4dbb55540  database-data-harbor-database-0  harbor     i-01a853fd2d2002b87  harbor-database-0                    database-data         973Mi  64Mi  893Mi      6.61   2362   63174   3.60
 pvc-9d8ea2b6-5f6b-49f1-bf89-fb873f374be2  harbor-registry                  harbor     i-01a853fd2d2002b87  harbor-registry-6889985fb9-mfc7p     registry-data         4Gi    24Ki  4Gi        0.00   11     327669  0.00
 pvc-55422288-a483-41f3-8986-9142c701cd1e  harbor-jobservice                harbor     i-01a853fd2d2002b87  harbor-jobservice-74756ff4b6-d6gk5   job-logs              973Mi  24Ki  957Mi      0.00   11     65525   0.02
 pvc-9efbede1-b3aa-4d22-b590-e9916069f849  harbor-jobservice-scandata       harbor     i-01a853fd2d2002b87  harbor-jobservice-74756ff4b6-d6gk5   job-scandata-exports  973Mi  24Ki  957Mi      0.00   11     65525   0.02

# 웹 접속 주소 확인 및 접속
**echo -e "harbor URL = https://harbor.$KOPS_CLUSTER_NAME"
harbor URL = <https://harbor.ygpark.net>**
~~echo -e "notary URL = https://notary.$KOPS_CLUSTER_NAME"~~


배포 모니터링

두 개의 AWS ALB가 각각 부동 상태입니다.

웹에 액세스하고 로컬로 이미지 업로드

기본 관리자 암호로 로그인합니다.

로그인: admin/Harbor12345

이름(pkos) 및 액세스 수준(공개 검토)에 대한 설정으로 새 프로젝트를 만듭니다.


이미지를 업로드합니다.

# 컨테이너 이미지 가져오기
docker pull nginx && docker pull busybox && docker images

REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
nginx        latest    ac232364af84   47 hours ago   142MB
busybox      latest    7cfbbec8963d   8 days ago     4.86MB

# 태그 설정
docker tag busybox harbor.$KOPS_CLUSTER_NAME/pkos/busybox:0.1
docker image ls

REPOSITORY                       TAG       IMAGE ID       CREATED        SIZE
nginx                            latest    ac232364af84   47 hours ago   142MB
busybox                          latest    7cfbbec8963d   8 days ago     4.86MB
harbor.ygpark.net/pkos/busybox   0.1       7cfbbec8963d   8 days ago     4.86MB

# 로그인 - 방안2
echo 'Harbor12345' > harborpw.txt
cat harborpw.txt | docker login harbor.$KOPS_CLUSTER_NAME -u admin --password-stdin

Error response from daemon: Get "https://harbor.ygpark.net/v2/": x509: certificate is valid for ygpark.net, not harbor.ygpark.net
helm upgrade harbor harbor/harbor -f ~/harbor/values.yaml --namespace harbor --version 1.11.0

WARNING!
Your password will be stored unencrypted in /root/.docker/config.json. Configure a credential helper to remove this warning. See https://docs.docker.com/engine/reference/commandline/login/#credentials-store Login Succeeded cat /root/.docker/config.json | jq # 이미지 업로드 docker push harbor.$KOPS_CLUSTER_NAME/pkos/busybox:0.1

# 파드 배포
curl -s -O https://raw.githubusercontent.com/junghoon2/kube-books/main/ch13/busybox-deploy.yml
sed -i "s|harbor.myweb.io/erp|harbor.$KOPS_CLUSTER_NAME/pkos|g" busybox-deploy.yml
cat busybox-deploy.yml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: busybox
  labels:
    app: busybox
spec:
  replicas: 1
  selector:
    matchLabels:
      app: busybox  # POD label과 일치
  template:
    metadata:
      labels:
        app: busybox # Selector label과 일치
    spec:
      containers:
      - name: busybox
        # image: busybox
        image: harbor.ygpark.net/pkos/busybox:0.1
        command:
        - "/bin/sh"
        - "-c"
        - "sleep inf"

kubectl apply -f busybox-deploy.yml
deployment.apps/busybox created

# 확인 : 정상적으로 harbor 에서 이미지 다운로드되어 파드가 동작!
kubectl get pod NAME READY STATUS RESTARTS AGE busybox-5c8b9859c8-6cv5w 1/1 Running 0 65s kubectl describe pod | grep Events: -A7 Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 98s default-scheduler Successfully assigned default/busybox-5c8b9859c8-6cv5w to i-0f1fa370eafcd2c69 Normal Pulling 98s kubelet Pulling image "harbor.ygpark.net/pkos/busybox:0.1" Normal Pulled 97s kubelet Successfully pulled image "harbor.ygpark.net/pkos/busybox:0.1" in 581.173072ms Normal Created 97s kubelet Created container busybox Normal Started 97s kubelet Started container busybox # 태그 설정 docker tag nginx harbor.$KOPS_CLUSTER_NAME/pkos/nginx:0.1 # 이미지 업로드 docker push harbor.$KOPS_CLUSTER_NAME/pkos/nginx:0.1


콘솔에서 확인할 수 있습니다.
스캐닝은 취약점을 식별할 수도 있습니다.

3. 깃랩

GitLab은 무료 오픈 소스로 제공되는 소스 코드의 원격 저장소입니다.
최소 사양은 Spec(4CPU, 4Mem, Disk 40GB)입니다.
포트와 마찬가지로 제어 카드와 함께 설치됩니다.

# 모니터링
kubectl create ns gitlab
watch kubectl get pod,pvc,ingress -n gitlab

# 설치
echo $CERT_ARN
vim ~/gitlab/values.yaml
----------------------
global:
  hosts:
    domain: <각자자신의도메인>             # 52줄
    domain: ygpark.net
    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: arn:aws:acm:ap-northeast-2:991354587926:certificate/e07b5e39-8859-4d4b-9a68-25d9f27458d6
      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

# ingress 확인
kubectl get ingress -n gitlab                                                                                                                           Sun Mar 26 00:36:42 2023

NAME                                                  CLASS   HOSTS                 ADDRESS                                                             PORTS   AGE
ingress.networking.k8s.io/gitlab-kas                  alb     kas.ygpark.net        k8s-gitlab-1959905b21-1345964672.ap-northeast-2.elb.amazonaws.com   80      10s
ingress.networking.k8s.io/gitlab-minio                alb     minio.ygpark.net      k8s-gitlab-1959905b21-1345964672.ap-northeast-2.elb.amazonaws.com   80      10s
ingress.networking.k8s.io/gitlab-registry             alb     registry.ygpark.net   k8s-gitlab-1959905b21-1345964672.ap-northeast-2.elb.amazonaws.com   80      10s
ingress.networking.k8s.io/gitlab-webservice-default   alb     gitlab.ygpark.net     k8s-gitlab-1959905b21-1345964672.ap-northeast-2.elb.amazonaws.com   80      10s

# 확인 - SubCharts
# gitlab-gitaly : 웹서비스 혹은 ssh 방식으로 진행되는 깃 제목, 브랜치, 태그 등의 깃 요청 등에 대한 작업을 담당
# gitlab-gitlab-shell : https 가 아닌 ssh 방식으로 깃 명령어 실행 시 해당 요청을 처리
# gitlab-kas : gitlab agent server
# gitlab-postgresql : 유저, 권한, 이슈 등 깃랩의 메타 데이터 정보가 저장
# gitlab-redis-master : 깃랩 작업 정보는 레디스 캐시 서버를 이용하여 처리
# gitlab-sidekiq-all-in-1-v2 : 레디스와 연동하여 작업 큐 처리 용도로 사용
# gitlab-webservice-default : 깃랩 웹 서비스를 처리
helm list -n gitlab
kubectl df-pv -n gitlab

 PV NAME                                   PVC NAME                          NAMESPACE  NODE NAME            POD NAME                       VOLUME MOUNT NAME  SIZE  USED    AVAILABLE  %USED  IUSED  IFREE    %IUSED
 pvc-08ac1c2e-3dca-428a-a4ab-303de4c134fb  gitlab-minio                      gitlab     i-0f1fa370eafcd2c69  gitlab-minio-74dfc6b6c7-pfkmb  export             9Gi   96Ki    9Gi        0.00   29     655331   0.00
 pvc-e4a0fd34-de50-4d44-b5b8-3c544bc42827  redis-data-gitlab-redis-master-0  gitlab     i-0f1fa370eafcd2c69  gitlab-redis-master-0          redis-data         7Gi   1808Ki  7Gi        0.02   12     524276   0.00
 pvc-7933d99f-4c59-47c9-9959-ea4655a4a2ec  repo-data-gitlab-gitaly-0         gitlab     i-0f1fa370eafcd2c69  gitlab-gitaly-0                repo-data          49Gi  160Ki   49Gi       0.00   45     3276755  0.00
 pvc-113b8bad-66a4-46f3-850f-229b05a07ad1  data-gitlab-postgresql-0          gitlab     i-0f1fa370eafcd2c69  gitlab-postgresql-0            data               7Gi   139Mi   7Gi        1.77   7061   517227   1.35

kubectl get-all -n gitlab

# 4개의 Ingress 가 1개의 ALB를 공유해서 사용 : ALB의 Rule 확인해볼것!
# alb.ingress.kubernetes.io/group.name: "gitlab" kubectl get ingress -n gitlab # 웹 root 계정 암호 확인 kubectl get secrets -n gitlab gitlab-gitlab-initial-root-password --template={{.data.password}} | base64 -d ;echo ymSVwoVHyjj6cLWOVW3KyUgMKwNs9wQ2jn74VHFAelOzxWHxs9QgHiV4vbF7vjou # 웹 접속 주소 확인 및 접속 echo -e "gitlab URL = https://gitlab.$KOPS_CLUSTER_NAME" gitlab URL = https://gitlab.ygpark.net # 웹 접속 https://gitlab.<각자 자신의 도메인> (root / 웹 root 계정 암호)

4개의 출입구가 장백의를 공유합니다.
규칙 조건은 다르게 설정됩니다.
(호스트 헤더 및 경로 패턴)


gitlab의 로드 밸런서

연결 후 별도의 사용자 생성 : 관리자 → 사용자 : 각 사용자의 편리한 계정(herzblue, [email protected], 관리자 권한 부여) ⇒ 해당 계정을 이용한 git 명령 실행


Gitlab 콘솔

또한 토큰을 생성합니다.
토큰이 생성되면 향후 Git 작업에 사용할 수 있도록 캡처합니다.


토큰 생성

새 프로젝트를 생성한 후 처음 생성한 GitLab 프로젝트에 Kubernetes에서 사용하는 YAML 파일을 업로드해 보세요.

# 폴더 생성
mkdir ~/gitlab-test && cd ~/gitlab-test

# git 계정 초기화 : 토큰 및 로그인 실패 시 매번 실행해주자
git config --system --unset credential.helper
git config --global --unset credential.helper

# git 계정 정보 확인 및 global 계정 정보 입력
git config --list
git config --global user.name "<각자 자신의 Gialba 계정>"
git config --global user.email "<각자 자신의 Gialba 계정의 이메일>"
git config --global user.name "herzblue"
git config --global user.email "[email protected]"

# git clone
git clone https://gitlab.$KOPS_CLUSTER_NAME/<각자 자신의 Gitlab 계정>/test-stg.git
git clone https://gitlab.$KOPS_CLUSTER_NAME/herzblue/test-stg.git
Cloning into 'test-stg'...
Username for 'https://gitlab.ygpark.net': herzblue
Password for 'https://[email protected]': <토큰 입력>
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Receiving objects: 100% (3/3), done.

# 토큰: 
glpat-jy-djx3UWPtdC1sAEySN

# 이동
ls -al test-stg && cd test-stg && pwd
total 8
drwxr-xr-x 3 root root   35 Mar 26 01:42 .
drwxr-xr-x 3 root root   22 Mar 26 01:42 ..
drwxr-xr-x 8 root root  163 Mar 26 01:42 .git
-rw-r--r-- 1 root root 6209 Mar 26 01:42 README.md
/root/gitlab-test/test-stg

# tree
.
└── README.md

0 directories, 1 file
# 파일 생성 및 깃 업로드(push) : 웹에서 확인
echo "gitlab test memo" >> test.txt
git add . && git commit -m "initial commit - add test.txt"
git push
Username for 'https://gitlab.ygpark.net': herzblue
Password for 'https://[email protected]':
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Delta compression using up to 2 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 299 bytes | 299.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
To https://gitlab.ygpark.net/herzblue/test-stg.git
   da5173c..3b5eb01  main -> main


Gitlab 콘솔

4. 아르고C디)

ArgoCD는 연속 배포입니다.
(지속적인 배송, CD) / SSOT(Single Source Of Truth) 개념을 구현한 배포 도구입니다.
개발자가 소스 코드를 변경하여 Git 저장소(이 환경에서는 GitLab)에 커밋하면 변경 사항이 고객의 실제 운영 체제 환경에 자동으로 반영됩니다.

SSOT(Single Source Of Truth)는 많은 사람들이 단일 인프라를 단일 소스로 관리할 수 있도록 하는 개념입니다.
Git 리포지토리는 통합된 중앙 리포지토리가 됩니다.

Helm 차트로 설치 후 웹 로그인

# 모니터링
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


# 확인
# argocd-application-controller : 실행 중인 k8s 애플리케이션의 설정과 깃 저장소의 소스 파일에 선언된 상태를 서로 비교하는 컨트롤러. 상태와 다르면 ‘OutOfSync’ 에러를 출력.
# argocd-dex-server : 외부 사용자의 LDAP 인증에 Dex 서버를 사용할 수 있음
# argocd-repo-server : 원격 깃 저장소의 소스 코드를 아르고시디 내부 캐시 서버에 저장합니다.
디렉토리 경로, 소스, 헬름 차트 등이 저장. helm list -n argocd NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION argocd argocd 1 2023-03-26 01:51:24.910444903 +0900 KST deployed argo-cd-5.19.14 v2.5.10 kubectl get pod,pvc,svc,deploy,sts -n argocd NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/argocd-applicationset-controller ClusterIP 100.71.214.217 <none> 7000/TCP 4m47s service/argocd-dex-server ClusterIP 100.68.244.141 <none> 5556/TCP,5557/TCP 4m47s service/argocd-redis ClusterIP 100.65.28.45 <none> 6379/TCP 4m47s service/argocd-repo-server ClusterIP 100.67.147.23 <none> 8081/TCP 4m47s service/argocd-server LoadBalancer 100.69.2.130 a83f24e5a8f094c8ab424afb5cbeab0f-14854422.ap-northeast-2.elb.amazonaws.com 80:32158/TCP,443:30417/TCP 4m47s kubectl get-all -n argocd NAME READY AGE statefulset.apps/argocd-application-controller 1/1 4m47s kubectl get crd | grep argoproj applications.argoproj.io 2023-03-25T16:51:26Z applicationsets.argoproj.io 2023-03-25T16:51:26Z appprojects.argoproj.io 2023-03-25T16:51:26Z # 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 VjqK5OsrfBA60NLJ # 웹 접속 로그인 (admin) CLB의 DNS 주소로 접속 echo -e "Argocd Web URL = https://argocd.$KOPS_CLUSTER_NAME"


ArgoCD 콘솔

ArgoCD는 Argocd CLI 도구를 제공합니다.
이 도구를 사용하여 Git 리포지토리 및 Kubernetes 클러스터 정보를 등록합니다.

# 최신버전 설치
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: v2.6.7+5bcd846
FATA(0000) Argo CD server address unspecified

# Help
# argocd app : 쿠버네티스 애플리케이션 동기화 상태 확인
# argocd context : 복수의 쿠버네티스 클러스터 등록 및 선택
# argocd login : 아르고시디 서버에 로그인 
# argocd repo : 원격 깃 저장소를 등록하고 현황 파악
argocd

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

'admin:login' logged in successfully
Context 'argocd.ygpark.net' updated

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

# 등록 확인 : 기본적으로 아르고시디가 설치된 쿠버네티스 클러스터는 타깃 클러스터로 등록됨
argocd repo list
TYPE  NAME  REPO                                             INSECURE  OCI    LFS    CREDS  STATUS      MESSAGE  PROJECT
git         https://gitlab.ygpark.net/herzblue/test-stg.git  false     false  false  true   Successful

# 기본적으로 아르고시디가 설치된 쿠버네티스 클러스터는 타깃 클러스터로 등록됨
argocd cluster list
SERVER                          NAME        VERSION  STATUS   MESSAGE                                                  PROJECT
https://kubernetes.default.svc  in-cluster           Unknown  Cluster has no applications and is not being monitored.

ArgoCD로 RabbitMQ Helm 애플리케이션 배포

# test-stg 깃 디렉터리에서 아래 실행
cd ~/gitlab-test/test-stg

# 깃 원격 오리진 주소 확인
git config -l | grep remote.origin.url
remote.origin.url=https://gitlab.ygpark.net/herzblue/test-stg.git

# RabbitMQ 헬름 차트 설치
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update
helm fetch bitnami/rabbitmq --untar --version 11.10.3
cd rabbitmq/
cp values.yaml my-values.yaml

# 헬름 차트를 깃랩 저장소에 업로드
git add . && git commit -m "add rabbitmq helm"
git push

Username for 'https://gitlab.ygpark.net': herzblue
Password for 'https://[email protected]':
Enumerating objects: 57, done.
Counting objects: 100% (57/57), done.
Delta compression using up to 2 threads
Compressing objects: 100% (54/54), done.
Writing objects: 100% (56/56), 65.14 KiB | 5.43 MiB/s, done.
Total 56 (delta 13), reused 0 (delta 0), pack-reused 0
To https://gitlab.ygpark.net/herzblue/test-stg.git
   3b5eb01..bc0ecde  main -> main

# argocd CRD 확인
kubectl get crd | grep argo
applications.argoproj.io              2023-03-25T16:51:26Z
applicationsets.argoproj.io           2023-03-25T16:51:26Z
appprojects.argoproj.io               2023-03-25T16:51:26Z

applications.argoproj.io                              2022-01-25T15:46:16Z   # 배포 앱 현재 실행 상태와 깃 저장소의 의도한 상태를 계속 비교
appprojects.argoproj.io                               2022-01-25T15:46:16Z   # 프로젝트 단위 구분
argocdextensions.argoproj.io                          2022-01-25T15:46:16Z

# 수정
cd ~/
curl -s -O https://raw.githubusercontent.com/wikibook/kubepractice/main/ch15/rabbitmq-helm-argo-application.yml
vim rabbitmq-helm-argo-application.yml
--------------------------------------
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: rabbitmq-helm
  namespace: argocd
  finalizers:
  - resources-finalizer.argocd.argoproj.io
spec:
  destination:
    namespace: rabbitmq
    server: https://kubernetes.default.svc
  project: default
  source:
    repoURL: https://gitlab.gasida.link/gasida/test-stg.git
    path: rabbitmq
    targetRevision: HEAD
    helm:
      valueFiles:
      - my-values.yaml
  syncPolicy:
    syncOptions:
    - CreateNamespace=true
--------------------------------------

# 모니터링 : argocd 웹 화면 보고 있기!
echo -e "Argocd Web URL = https://argocd.$KOPS_CLUSTER_NAME" # 배포 kubectl apply -f rabbitmq-helm-argo-application.yml # YAML 파일을 적용(apply)하여 아르고시디 ‘Application’ CRD를 생성 kubectl get applications.argoproj.io -n argocd NAME SYNC STATUS HEALTH STATUS rabbitmq-helm OutOfSync Missing

배포가 진행됨에 따라 Argocd 웹 화면에 배포가 표시됩니다.


GitOps를 실행하려면 이 배포에 대한 동기화를 설정하세요.

Argocd 웹 화면에서 rabbitmq 클릭 → Helm 차트 세부 정보 확인 ⇒ 화면 상단의 SYNC 클릭하여 동기화 실행


배포 후 포드를 동기화하고 성장시키십시오.

yaml 파일에서 포드 수를 변경하고 Gitlab에서 모니터링하기만 하면 됩니다.
이를 모니터링하면 포드 수의 증가가 반영됩니다.


증가하는 것 같다

포드는 노드별로 모니터링할 수도 있습니다.


노드별 ArgoCD 모니터링

배포를 삭제하려면 Argocd 웹 화면에서 DELETE를 클릭합니다.


마지막으로

회사에서 아직 적용을 안해봐서 깃옵스 개념만 이해했는데 실제로 배포해보니 이렇게 하면 인프라의 빠른 반영과 중앙 집중식 관리가 가능하다는 걸 느꼈습니다.
회사 내부 테스트 환경에 GitOps를 미러링하여 사용할 계획입니다.