이 글은 스터디를 참여하면서 학습한 내용을 중심으로 Kubernetes를 정리하는 연재 글이다.
'24단계 실습으로 정복하는 쿠버네티스' 도서 내용을 중심으로 정리하고 있다. 스터디 진도에 맞춰 4~5개의 글을 작성 할 예정이다.
이번 글에서는 GitOps 시스템을 알아보겠다. 시스템은 하버(Harbor), 깃랩(GitLab), 아르고시디(ArgoCD)를 사용한다.
이번에 실습 해볼 시스템 구성은 아래 그림과 같다. Harbor에 개인/회사의 컨테이너 이미지를 올리고, Harbor 기반으로 어플리케이션이 배포된다. 이후 GitLab의 소스 형상을 모니터링하는 argoCD가 동기화를 진행해 배포하게 된다.
1. 실습환경 배포
그럼 실습환경으로 들어가보자. kops 환경을 배포해준다. kops 배포는 [PKOS] kOps를 사용한 Cluster 설치와 기본 Kubernetes 관리 방법 글에 자세히 기술되어 있다. 이번에는 CPU를 많이 요구하는 시스템으로 비교적 높은 사양의 인스턴스 타입을 사용할 예정이다. 마스터 노드는 c5a.2xlarge / 워커 노드는 c5a.2xlarge를 사용한다.
배포 후에 AWS LoadBalancer Controller가 AWS 접근 가능하도록 IAM 설정 하는 작업을 해준다. kops 인스턴스 (t3.small)에는 도커 엔진 설치가 yaml에 미리 포함되어 설치되어 있다.
# 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. 하버(Harbor)
내가 주로 사용하는 CSP인 구글 클라우드에서는 구글 컨테이너 레지스트리를 제공한다. 로컬에서 이런 기능을 사용할 수 있도록 하는 것이 하버이다.
하버는 오픈소스 컨테이너 이미지 레지스트리이다. RBAC, 이미지 보안 취약점 스캐닝, 원격에 있는 다른 레포지토리에서 이미지 복제 등의 다양한 기능을 제공한다. 이번 실습에서 로컬 컨테이너 이미지 저장소 구축하고, 컨테이너 이미지를 업로드 해본다. 최소 스펙은 2CPU, 4Mem, Disk 40GB이다.
헬름 차트로 하버 설치
헬름 차트로 하버를 다운받아 주고, 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 비밀번호로 로그인한다.
로그인 : admin/Harbor12345
NEW PROJECT를 Name(pkos), Access Level(Public Check) 설정으로 생성한다.
이미지 업로드를 한다.
# 컨테이너 이미지 가져오기
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)
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개의 ingress가 하나의 alb를 공유해서 사용한다. Rule 조건이 다르게 설정되어 있다. (호스트 헤더 and 경로 패턴)
접속 후 별도의 사용자 생성 : Admins → Users : 각자 자신만의 편한 계정 (herzblue, herzblue@gamil.com, Administrator 권한 부여) ⇒ 해당 계정으로 git 명령어 실행
토큰도 생성해준다. 토큰이 생성되면 이후에 git 작업할 때 사용할 수 있도록 기록해둔다.
신규 프로젝트 생성 후 처음 생성한 깃랩 프로젝트에 쿠버네티스에서 사용하는 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 "herzblue@gmail.com"
# 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://herzblue@gitlab.ygpark.net': <토큰 입력>
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://herzblue@gitlab.ygpark.net':
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. 아르고시디(ArgoCD)
ArgoCD는 지속적인 배포(Continuous Delivery, CD) / 단일 진실 원천(SSOT, Single Source Of Truth) 개념을 중심으로 작동하는 배포 툴이다. 개발자가 소스코드를 변경해서 깃 저장소 (이 환경에서는 GitLab) 에 푸시하면 해당 변경 사항이 고객이 사용하는 실제 운영환경의 시스템까지 자동으로 반영되도록 한다.
단일 진실 원천(SSOT, Single Source Of Truth)은 많은 사람이 하나의 인프라를 관리 할 때 유일한 소스로 관리 할 수 있도록 하는 개념이다. git 저장소는 통합된 중앙 저장소가 된다.
헬름 차트로 설치 후 웹 로그인
# 모니터링
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 툴을 제공한다. 이 툴로 깃 저장소와 쿠버네티스 클러스터 정보를 등록한다.
# 최신버전 설치
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 헬름 애플리케이션 배포하기
# 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://herzblue@gitlab.ygpark.net':
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 클릭 → 헬름 차트 상세 내역 확인 ⇒ 화면 상단 SYNC 클릭해 동기화 실행
배포 후 동기화를 하고 파드를 증가시켜본다.
yaml 파일에서 간단하게 파드 개수만 변경 후 gitlab에서 모니터링 해본다. 모니터링 해보면 파드를 증가시키면 반영된다.
노드 별로도 파드가 모니터링 할 수 있다.
배포 삭제는 argocd 웹 화면에서 DELETE 클릭하면 된다.
마치며
GitOps 개념을 아직 회사 적용하고 있지 않아서 개념만 이해하고 있었는데, 실제로 배포해보면서 인프라의 빠른 반영과 중앙집중 관리가 이렇게 이뤄질 수 있구나 느낄 수 있었다. GitOps를 회사 내부 테스트 환경에 반영해서 사용해볼 생각이다.
'스터디 > Kubernetes' 카테고리의 다른 글
[PKOS] Kubernetes 보안 - kubescape, polaris, RBAC (2/2) (0) | 2023.04.10 |
---|---|
[PKOS] Kubernetes 보안 - kubescape, polaris, RBAC (1/2) (0) | 2023.04.09 |
[PKOS] Kubernetes 모니터링과 로깅 - Prometheus, Grafana, Loki (0) | 2023.04.02 |
[PKOS] AWS Kubernetes 네트워크, 노드의 Max Pod 제한 (2) | 2023.03.18 |
[PKOS] kOps를 사용한 Cluster 설치와 기본 Kubernetes 관리 방법 (0) | 2023.03.12 |