이 기사는 연구에 참여하면서 배운 내용을 기반으로 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. 항구
제가 주로 사용하는 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"~~
웹에 액세스하고 로컬로 이미지 업로드
기본 관리자 암호로 로그인합니다.
로그인: 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개의 출입구가 장백의를 공유합니다.
규칙 조건은 다르게 설정됩니다.
(호스트 헤더 및 경로 패턴)
연결 후 별도의 사용자 생성 : 관리자 → 사용자 : 각 사용자의 편리한 계정(herzblue, [email protected], 관리자 권한 부여) ⇒ 해당 계정을 이용한 git 명령 실행
또한 토큰을 생성합니다.
토큰이 생성되면 향후 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
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 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 웹 화면에서 DELETE를 클릭합니다.
마지막으로
회사에서 아직 적용을 안해봐서 깃옵스 개념만 이해했는데 실제로 배포해보니 이렇게 하면 인프라의 빠른 반영과 중앙 집중식 관리가 가능하다는 걸 느꼈습니다.
회사 내부 테스트 환경에 GitOps를 미러링하여 사용할 계획입니다.