๐Ÿฟ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์Šคํ„ฐ๋”” PKOS 4์ฃผ์ฐจ Harbor / Gitlab / ArgoCD

Burstยท2023๋…„ 2์›” 27์ผ
0

๐Ÿ˜ŽPKOS์Šคํ„ฐ๋””

๋ชฉ๋ก ๋ณด๊ธฐ
4/7

๋ชฉํ‘œ

์ด๋ฒˆ 4์ฃผ์ฐจ๋Š” Gitlab๊ณผ argoCD๋ฅผ ํ™œ์šฉํ•œ Gitops ํ™˜๊ฒฝ์„ ์‹ค์Šตํ•˜๋Š” ๊ฒƒ์ด ๋ชฉํ‘œ์ด๋‹ค.

Harbor(์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€ ์ €์žฅ์†Œ)

์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€ ์ €์žฅ์†Œ๋กœ๋Š” Docker Hub๋งŒ ์‚ฌ์šฉํ•ด๋ดค์ง€๋งŒ, ์ด๋ฒˆ ์Šคํ„ฐ๋””๋ฅผ ์˜จํ”„๋กœ๋ฏธ์Šค ์ปจํ…Œ์ด๋„ˆ ์ €์žฅ์†Œ์ธ Harbor๋ฅผ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค.

Harbor ์„ค์น˜


# ์‚ฌ์šฉ ๋ฆฌ์ „์˜ ์ธ์ฆ์„œ 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"

# ํ•˜๋ฒ„ ์„ค์น˜
helm repo add harbor https://helm.goharbor.io
helm fetch harbor/harbor --untar
vim ~/harbor/values.yaml
----------------------
expose.tls.certSource=none                        # 19์ค„
expose.ingress.hosts.core=harbor.<๊ฐ์ž์ž์‹ ์˜๋„๋ฉ”์ธ>    # 36์ค„
expose.ingress.hosts.notary=notary.<๊ฐ์ž์ž์‹ ์˜๋„๋ฉ”์ธ>  # 37์ค„
expose.ingress.hosts.core=harbor.gasida.link
expose.ingress.hosts.notary=notary.gasida.link
expose.ingress.controller=alb                      # 44์ค„
expose.ingress.className=alb                       # 46์ค„~
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์ค„
externalURL=https://harbor.gasida.link             
----------------------

# ๋ชจ๋‹ˆํ„ฐ๋ง
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

# ํ™•์ธ
# registry : ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๋ฅผ ์ €์žฅ
# chartmuseum : ํ•˜๋ฒ„๋ฅผ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๋ฟ ์•„๋‹ˆ๋ผ, ํ—ฌ๋ฆ„ ์ฐจํŠธ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋กœ๋„ ์‚ฌ์šฉ
# notary : ์„œ๋ช…์ด ์™„๋ฃŒ๋œ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๋งŒ ์šด์˜ ํ™˜๊ฒฝ์— ์‚ฌ์šฉํ•˜๋„๋ก ์„ค์ •. ์„œ๋ช…์ด ์™„๋ฃŒ๋œ ์ด๋ฏธ์ง€๋Š” ๋ณ„๋„๋กœ ๊ตฌ๋ถ„
# trivy : ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€์˜ ๋ณด์•ˆ ์ทจ์•ฝ์ ์„ ์Šค์บ”, ์Šค์บ” ๊ธฐ๋Šฅ์€ ๋ณ„๋„ ์†”๋ฃจ์…˜์—์„œ ์ œ๊ณตํ•˜์—ฌ ๊ด€๋ฆฌ์ž๋Š” ๋ณด์•ˆ ์Šค์บ”์šฉ ๋„๊ตฌ๋ฅผ ์„ ํƒ ๊ฐ€๋Šฅ
helm list -n harbor
kubectl get pod,pvc,ingress,deploy,sts -n harbor
kubectl get ingress -n harbor harbor-ingress -o json | jq
kubectl get-all -n harbor
kubectl krew install df-pv && kubectl df-pv

Harbor ์›น ์ ‘์† ๋ฐ ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ

#์ด๋ฏธ์ง€ ์—…๋กœ๋“œ ์ฃผ์†Œ: https://harbor.<๊ฐ์ž ์ž์‹ ์˜ ๋„๋ฉ”์ธ>
#๋กœ๊ทธ์ธ: admin/Harbor12345

# insecure ์„ค์ •
cat <<EOT> /etc/docker/daemon.json
{
    "insecure-registries" : ["harbor.$KOPS_CLUSTER_NAME"]
}
EOT
cat /etc/docker/daemon.json
systemctl daemon-reload && systemctl restart docker

# ๋กœ๊ทธ์ธ - ๋ฐฉ์•ˆ1
docker login harbor.$KOPS_CLUSTER_NAME -u admin -p Harbor12345
cat /root/.docker/config.json | jq

# ๋กœ๊ทธ์ธ - ๋ฐฉ์•ˆ2
echo 'Harbor12345' > harborpw.txt
cat harborpw.txt | docker login harbor.$KOPS_CLUSTER_NAME -u admin --password-stdin
cat /root/.docker/config.json | jq

# ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ
docker push harbor.$KOPS_CLUSTER_NAME/pkos/busybox:0.1

Harbor ์ €์žฅ์†Œ๋ฅผ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค yamlํŒŒ์ผ์— ์ง€์ •ํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, Docker Hub์—์„œ๋„ ์ œ๊ณตํ•˜ ์ด๋ฏธ์ง€ ๋ณด์•ˆ ์Šค์บ”์„ ํ†ตํ•ด ์ด๋ฏธ์ง€์˜ ์ทจ์•ฝ์ ์„ ํŒŒ์•… ํ•  ์ˆ˜ ์žˆ๋‹ค.

Gitlab

  • ์˜คํ”ˆ์†Œ์Šค ์ฝ”๋“œ ์›๊ฒฉ ์ €์žฅ์†Œ๋กœ ์„œ๋ฒ„์— ์ง์ ‘ ์„ค์น˜ํ•ด์„œ ์‚ฌ์šฉ ํ•˜๋Š” ์„ค์น˜ํ˜• ๋ฒ„์ „ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ

Gitlab ์„ค์น˜

kubectl create ns gitlab

# ์„ค์น˜
helm repo add gitlab https://charts.gitlab.io/
helm repo update
helm fetch gitlab/gitlab --untar
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

certmanager:                           # 833์ค„ 
  installCRDs: false
  install: false
  rbac:
    create: false

nginx-ingress:                         # 847์ค„ 
  enabled: false

prometheus:                            # 904์ค„ 
  install: false

gitlab-runner:                         # 1130์ค„ 
  install: false
----------------------

helm install gitlab gitlab/gitlab -f ~/gitlab/values.yaml --namespace gitlab --version 6.8.1

# ํ™•์ธ - 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 get pod,pvc,ingress,deploy,sts -n gitlab
kubectl get-all -n gitlab

# 4๊ฐœ์˜ Ingress ๊ฐ€ 1๊ฐœ์˜ ALB๋ฅผ ๊ณต์œ ํ•ด์„œ ์‚ฌ์šฉ 
# alb.ingress.kubernetes.io/group.name: "gitlab"

kubectl get ingress -n gitlab
NAME                        CLASS   HOSTS                  ADDRESS                                                             PORTS   AGE
gitlab-kas                  alb     kas.gasida.link        k8s-gitlab-3fbf5c8cab-1066962252.ap-northeast-2.elb.amazonaws.com   80      93s
gitlab-minio                alb     minio.gasida.link      k8s-gitlab-3fbf5c8cab-1066962252.ap-northeast-2.elb.amazonaws.com   80      93s
gitlab-registry             alb     registry.gasida.link   k8s-gitlab-3fbf5c8cab-1066962252.ap-northeast-2.elb.amazonaws.com   80      93s
gitlab-webservice-default   alb     gitlab.gasida.link     k8s-gitlab-3fbf5c8cab-1066962252.ap-northeast-2.elb.amazonaws.com   80      93s

# ์›น root ๊ณ„์ • ์•”ํ˜ธ ํ™•์ธ
kubectl get secrets -n gitlab gitlab-gitlab-initial-root-password --template={{.data.password}} | base64 -d ;echo
hhBvAjXoANx8kVIVpcwdgvc6A0kFDIIQFxikRDJfwVPBXn0dxmNBgc7zssSBskTj

# ์›น ์ ‘์† https://gitlab.<๊ฐ์ž ์ž์‹ ์˜ ๋„๋ฉ”์ธ> (root / ์›น root ๊ณ„์ • ์•”ํ˜ธ)

Gitlab ์„ค์ • & git clone & git push

# git ๊ณ„์ • ์ดˆ๊ธฐํ™” : ํ† ํฐ ๋ฐ ๋กœ๊ทธ์ธ ์‹คํŒจ ์‹œ ๋งค๋ฒˆ ์‹คํ–‰ํ•ด์ฃผ์ž
git config --system --unset credential.helper
git config --global --unset credential.helper

# git ๊ณ„์ • ์ •๋ณด ํ™•์ธ ๋ฐ global ๊ณ„์ • ์ •๋ณด ์ž…๋ ฅ
git config --list
git config --global user.name "<๊ฐ์ž ์ž์‹ ์˜ Gitlab ๊ณ„์ •>"
git config --global user.email "<๊ฐ์ž ์ž์‹ ์˜ Gitlab ๊ณ„์ •์˜ ์ด๋ฉ”์ผ>"

#gitlab ์ €์žฅ์†Œ๋กœ ์‚ฌ์šฉํ•  ๋กœ์ปฌ ๋””๋ ‰ํ† ๋ฆฌ ์ƒ์„ฑ
mkdir ~/gitlab-test && cd ~/gitlab-test

# git clone
git clone https://gitlab.$KOPS_CLUSTER_NAME/<๊ฐ์ž ์ž์‹ ์˜ Gitlab ๊ณ„์ •>/test-stg.git
Cloning into 'test-stg'...
Username : <์ƒ์„ฑํ•œ ๊ณ„์ • ์ด๋ฆ„>
Password : <ํ† ํฐ ์ž…๋ ฅ>

# ํŒŒ์ผ ์ƒ์„ฑ ๋ฐ ๊นƒ ์—…๋กœ๋“œ(push)
echo "gitlab test memo" >> test.txt
git add . && git commit -m "initial commit - add test.txt"
git push
Username : <์ƒ์„ฑํ•œ ๊ณ„์ • ์ด๋ฆ„>
Password : <ํ† ํฐ ์ž…๋ ฅ>

argoCD(ํ•ต์‹ฌ๐Ÿ™)

์ฐธ๊ณ 1, ์ฐธ๊ณ 2
GitOps๋ž€ DevOps์˜ ์‹ค์ฒœ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐฐํฌ์™€ ์šด์˜์— ๊ด€๋ จ๋œ ๋ชจ๋“  ์š”์†Œ๋“ค์„ Git์—์„œ ๊ด€๋ฆฌ ํ•˜๋Š”๊ฒƒ์„ ์˜๋ฏธ.
ArgoCD๋ž€ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋ฅผ ์œ„ํ•œ CD(Continuous Delivery)๋„๊ตฌ
์ฆ‰, GitOps ๋ฐฉ์‹์œผ๋กœ ๊ด€๋ฆฌ๋˜๋Š” Manifest(yaml)ํŒŒ์ผ์˜ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ๊ฐ์‹œํ•˜๋ฉฐ, ํ˜„์žฌ ๋ฐฐํฌ๋œ ํ™˜๊ฒฝ์˜ ์ƒํƒœ / Git ManifestํŒŒ์ผ์— ์ •์˜๋œ ์ƒํƒœ๋ฅผ ๋™์ผํ•˜๊ฒŒ ์œ ์ง€ ํ•˜๋Š” ์—ญํ•  ์ˆ˜ํ–‰

argoCD ์„ค์น˜

kubectl create ns 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
kubectl get pod,pvc,svc,deploy,sts -n argocd
kubectl get-all -n argocd

# CLB์— ExternanDNS ๋กœ ๋„๋ฉ”์ธ ์—ฐ๊ฒฐ
kubectl annotate service -n argocd argocd "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
mf8bOtNEq7iHMqq1

# ์›น ์ ‘์† ๋กœ๊ทธ์ธ (admin) CLB์˜ DNS ์ฃผ์†Œ๋กœ ์ ‘์† http, https
echo -e "Argocd Web URL = http://argocd.$KOPS_CLUSTER_NAME"

Gitlab ์ €์žฅ์†Œ์™€ k8s ํด๋Ÿฌ์Šคํ„ฐ ๋“ฑ๋ก(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

# Help
# argocd app : ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋™๊ธฐํ™” ์ƒํƒœ ํ™•์ธ
# argocd context : ๋ณต์ˆ˜์˜ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ ๋“ฑ๋ก ๋ฐ ์„ ํƒ
# argocd login : ์•„๋ฅด๊ณ ์‹œ๋”” ์„œ๋ฒ„์— ๋กœ๊ทธ์ธ 
# argocd repo : ์›๊ฒฉ ๊นƒ ์ €์žฅ์†Œ๋ฅผ ๋“ฑ๋กํ•˜๊ณ  ํ˜„ํ™ฉ ํŒŒ์•…
argocd

# CLB ๋„๋ฉ”์ธ ๋ณ€์ˆ˜ ์ง€์ •
CLB=<๊ฐ์ž ์ž์‹ ์˜ argocd ์„œ๋น„์Šค์˜ CLB ๋„๋ฉ”์ธ ์ฃผ์†Œ>
CLB=adc4dcad7d21743c4b6524f37f2e7ca3-1872175753.ap-northeast-2.elb.amazonaws.com

# argocd ์„œ๋ฒ„ ๋กœ๊ทธ์ธ
argocd login $CLB --username admin --password $ARGOPW

# ๊ธฐ ์„ค์น˜ํ•œ ๊นƒ๋žฉ์˜ ํ”„๋กœ์ ํŠธ 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/gasida/test-stg.git --username gasida --password P@ssw0rd
 
# ๋“ฑ๋ก ํ™•์ธ : ๊ธฐ๋ณธ์ ์œผ๋กœ ์•„๋ฅด๊ณ ์‹œ๋””๊ฐ€ ์„ค์น˜๋œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ๋Š” ํƒ€๊นƒ ํด๋Ÿฌ์Šคํ„ฐ๋กœ ๋“ฑ๋ก๋จ
argocd repo list
TYPE  NAME  REPO                                            INSECURE  OCI    LFS    CREDS  STATUS      MESSAGE  PROJECT
git         https://gitlab.gasida.link/gasida/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.

[๊ณผ์ œ1]: Harbor ์— ์ž์‹ ๋งŒ์˜ ์•„๋ฌด ์ด๋ฏธ์ง€๋‚˜ ํƒœ๊ทธํ•ด์„œ ์—…๋กœ๋“œํ•˜๊ณ  ๋‹ค์šด๋กœ๋“œ ํ•ด๋ณด๊ณ , ๊ด€๋ จ ์Šค์ƒท ์˜ฌ๋ ค์ฃผ์„ธ์š”.

์ด์ „ ๊ณผ์ œ์—์„œ ์‚ฌ์šฉํ–ˆ๋˜ ๋งˆ๋ฆฌ์˜ค ์ด๋ฏธ์ง€๋ฅผ Harbor์— ์—…๋กœ๋“œ!
1. mario ์ด๋ฏธ์ง€๋ฅผ ๋‹ค์šด๋กœ๋“œ ํ›„ tag ์„ค์ •(harnor.burst89.com/pkos/mario:1.0)
2. harbor push
3. harbor web ํ™•์ธ

[๊ณผ์ œ2]: ์ž์‹ ๋งŒ์˜ ํ…์ŠคํŠธ ํŒŒ์ผ์„ kops-ec2 ๋กœ์ปฌ์—์„œ Gitlab ์— ์˜ฌ๋ ค๋ณด๊ณ , ๊ด€๋ จ ์Šค์ƒท ์˜ฌ๋ ค์ฃผ์„ธ์š”.

  1. 4์ฃผ์ฐจ๊ณผ์ œ.txtํŒŒ์ผ ์ƒ์„ฑ
  2. git add
  3. git push
  4. gitlab ํ™•์ธ

[๊ณผ์ œ3]: ArgoCD ์ฑ•ํ„ฐ์ธ, ์ฑ… 273ํŽ˜์ด์ง€์˜ โ€˜Gitops ์‹ค์Šต: ํด๋Ÿฌ์Šคํ„ฐ ์„ค์ • ๋‚ด์—ญ ๋ณ€๊ฒฝ๊ณผ ๊นƒ ์ €์žฅ์†Œ ์ž๋™ ๋ฐ˜์˜โ€™์„ ์ง์ ‘ ์Šค์Šค๋กœ ์‹ค์Šตํ•ด๋ณด๊ณ , ๊ด€๋ จ ์Šค์ƒท ์˜ฌ๋ ค์ฃผ์„ธ์š”.

#Harbor์— ์˜ฌ๋ฆฐ ๋งˆ๋ฆฌ์˜ค ์ด๋ฏธ์ง€๋ฅผ ๋‹ค์šด๋ฐ›์•„ Pod๋ฅผ ๋ฐฐํฌํ•˜๋Š” yamlํŒŒ์ผ ์ž‘์„ฑ(mario_argocd.yaml)
๊ธฐ์กด replicas 1 -> 2๋กœ ๋ณ€๊ฒฝ

  1. Image ์ €์žฅ์†Œ๋ฅผ harbor ์ €์žฅ์†Œ๋กœ ์ง€์ •
  2. harbor ํ™•์ธ(ํ˜„์ œ pull ์ˆ˜๋Š” 1)
  3. Gitlab push ๋ฐ ํ™•์ธ
  4. Application CRD๋ฅผ ์ด์šฉํ•˜์—ฌ ํด๋Ÿฌ์Šคํ„ฐ ๋™๊ธฐํ™”
#Application CRD yamlํŒŒ์ผ

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: mario
  namespace: argocd
  finalizers:
  - resources-finalizer.argocd.argoproj.io
spec:
  destination:
    namespace: mario
    server: https://kubernetes.default.svc
  project: default
  source:
    repoURL: https://gitlab.burst89.com/burst/test-stg.git
    path: mario
    targetRevision: HEAD
    directory:
      recurse: true
  syncPolicy:
    syncOptions:
    - CreateNamespace=true
    automated:
      prune: true
  • repoURL: gitlab ์ฃผ์†Œ
  • path: mario, ๋กœ์ปฌ gitlab์ €์žฅ์†Œ ์œ„์น˜
  • directory: recurse: true -> ์ด์ „ ์‹ค์Šต์—์„œ ๋ ˆ๋น—์— ํ๋Š” ํ—ฌ๋ฆ„ ์ฐจํŠธ๋ฅผ ์ด์šฉํ•ด ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•˜์˜€์ง€๋งŒ, ํ˜„์žฌ ์‹ค์Šต์€ ์ผ๋ฐ˜ ๋””ํ”Œ๋กœ์ด๋จผํฌ ๋ฐ ์„œ๋น„์Šค yamlํŒŒ์ผ์ด๋ฏ€๋กœ ์•„๋ฅด๊ณ ์‹œ๋””์— directory๋กœ ์ง€์ •(recurse์˜ต์…˜์€ ํ•˜์œ„ ๋””๋ ‰ํ„ฐ๋ฆฌ๊นŒ์ง€ ๋ฐฐํฌํ•œ๋‹ค๋Š” ์˜๋ฏธ)
  • automated: prune: true -> ์ž๋™์œผ๋กœ ๋™๊ธฐํ™” ๋ฐ prune: true์˜ ๊ฒฝ์šฐ ๊นƒ์—์„œ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์‚ญ์ œํ•˜๋ฉด ์ž๋™์œผ๋กœ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ๋„ ์‚ญ์ œ๋ฅผ ํ•˜๊ฒŒ ํ•˜๋Š” ์˜ต์…˜
  1. application CRD yamlํŒŒ์ผ ์‹คํ–‰
    a. Deployment, svc, pod ์ƒ์„ฑ
    b. argocd ์›นํ™”๋ฉด์— mario ํ™•์ธ
    c. ์‹ฑํฌ ํ™•์ธ

๋งˆ๋ฆฌ์˜ค Pod ์ƒ์„ฑ ์ˆœ์„œ
1. Gitlab์— ๋งˆ๋ฆฌ์˜ค yamlํŒŒ์ผ ์ €์žฅ
2. ํ•ด๋‹น yamlํŒŒ์ผ์€ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๋ฅผ harbor์— ์žˆ๋Š” ๋งˆ๋ฆฌ์˜ค ์ด๋ฏธ์ง€๋ฅผ ๋‹ค์šด๋กœ๋“œ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ฒŒ ์ง€์ •
3. Application CRD yamlํŒŒ์ผ์„ ํ†ตํ•ด argocd ์—ฐ๋™ ๋ฐ pod ๋ฐฐํฌ(ํ•ด๋‹น ํŒŒ์ผ์„ apply ํ•˜๋Š” ๊ฒฝ์šฐ pod ์ƒ์„ฑ ๋ฐ argocd ์—ฐ๋™๊นŒ์ง€ ์ง„ํ–‰)

  1. ์‹ค์Šต์„ ์œ„ํ•ด gitlab์— ์ €์žฅ๋œ yamlํŒŒ์ผ์„ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ , edit ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ๋ฐฐํฌ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝ
  • ํ˜„์žฌ replica๋ฅผ 2๊ฐœ์—์„œ 1๊ฐœ๋กœ ์ˆ˜์ •
  • ์ˆ˜์ • ํ›„ argocd์—์„œ OutofSync ๋ฐœ์ƒ
  1. argocd์˜ app diff๋ฉ”๋‰ด์—์„œ ๋ณ€๊ฒฝ๋œ ๋ถ€๋ถ„ ํ™•์ธ
    a. Gitlab ์†Œ์Šค์ฝ”๋“œ ๋ฐ˜์˜ ์—†์ด ์ž„์˜๋กœ ํด๋Ÿฌ์Šคํ„ฐ์˜ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ฒŒ ๋˜๋ฉด ๋ฐ”๋กœ argocd์—์„œ ํ™•์ธ ๊ฐ€๋Šฅ!!

  2. Sync!!
    a. argocd์—์„œ Sync๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ Sync๋ฅผ ๋งˆ์ถ”๋ฉด ์›๋ž˜ gitlab์— ์ €์žฅ๋œ yamlํŒŒ์ผ์„ ํ†ตํ•ด ๋‹ค์‹œ ์›๋ณต
    ์ฆ‰, replicas์˜ ์ˆ˜๋ฅผ 1์—์„œ ๋‹ค์‹œ 2๋กœ ๋ณ€๊ฒฝ๋˜๋ฉด์„œ pod๊ฐ€ ์ƒˆ๋กœ ์ƒ๊น€

  3. yamlํŒŒ์ผ์„ ์ˆ˜์ • ํ›„, gitlab์— ์—…๋ฐ์ดํŠธ ํ•˜์—ฌ ํด๋Ÿฌ์Šคํ„ฐ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ
    Mario deployment์˜ replica ๊ฐœ์ˆ˜๋ฅผ 5๋กœ ๋ณ€๊ฒฝ

  4. gitlab push

  5. argoCD ํ™•์ธ(gitlab์—์„œ yamlํŒŒ์ผ์ด ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๊ฒฝ์šฐ ๋ณ„๋„์˜ argoCD์—์„œ๋Š” ๋ฐ˜์‘์ด ์—†์Œ)

  6. sync๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด ๋ณ„๋„์˜ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ edit ์ž‘์—… ์—†์ด pod์˜ ์ˆ˜๊ฐ€ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธ

  7. argoCD ํ™•์ธ(Pod ์ฆ๊ฐ€)

  8. gitlab์—์„œ ์ง์ ‘ yamlํŒŒ์ผ ์ˆ˜์ • ํ›„ argocd์—์„œ sync๋ฅผ ํ•˜๋ฉด ํ•ด๋‹น ๋‚ด์šฉ์ด ํด๋Ÿฌ์Šคํ„ฐ์— ๋ฐ”๋กœ ๋ฐ˜์˜(replicas 10)

๋งˆ๋ฌด๋ฆฌ

์‹ค์ œ GitOpsํ™˜๊ฒฝ์„ ์‹ค์Šตํ•ด ๋ณด๋ฉด์„œ ์ฒ˜์Œ DevOps๊ฐ€ ์–ด๋–ค ๋Š๋‚Œ์ธ์ง€๋ฅผ ์•Œ ์ˆ˜ ์žˆ์—ˆ๋‹ค. ํ˜„์—…์—์„œ๋Š” ํผ๋ธ”๋ฆญ ํด๋ผ์šฐ๋“œ์— ์ธํ”„๋ผ๋ฅผ ๊ตฌ์„ฑํ•˜๊ณ , ํ•ด๋‹น ์ธํ”„๋ผ์— ์„œ๋น„์Šค๋ฅผ ์˜ฌ๋ ค์„œ ์šด์˜์„ ํ•˜๊ณ  ์žˆ๋‹ค. ์˜ค๋Š˜ ์‹ค์Šตํ•œ argoCD์ฒ˜๋Ÿผ ์˜จํ”„๋กœ๋ฏธ์Šค ๋˜๋Š” ํด๋ผ์šฐ๋“œ์—์„œ ์šด์˜์ค‘์ธ ์„œ๋น„์Šค๋„ GitOps์ฒ˜๋Ÿผ ์šด์˜ ๊ด€๋ฆฌ ๋˜๋Š” ์†”๋ฃจ์…˜์ด ์–ด๋–ค๊ฒƒ์ด ์žˆ๋Š”์ง€ ์ฐพ์•„๋ณด๊ณ  ์‹ค๋ฌด์— ์ ์šฉ์„ ํ•ด๋ณด๊ณ  ์‹ถ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ž์ฃผ ๊ฒช๋Š” ๋ˆ„๊ฐ€ config ํŒŒ์ผ์„ ์ˆ˜์ •ํ–ˆ๊ณ , ์–ด๋–ค ๋ถ€๋ถ„์ด ์ˆ˜์ •๋˜์–ด ์ด๋ฅผ ๋น ๋ฅด๊ฒŒ ํŒŒ์•…ํ•˜๊ณ  ์กฐ์ทจ๋ฅผ ์ทจํ•œ๋‹ค๋ฉด ํ›จ์”ฌ ๋น ๋ฅด๊ณ  ์•ˆ์ •์ ์ธ ์„œ๋น„์Šค ์šด์˜์„ ํ•  ์ˆ˜ ์žˆ์„๊ฑฐ ๊ฐ™๋‹ค.
ํ˜น์‹œ ์ด๋ฏธ ์ด๋ ‡๊ฒŒ ์„œ๋น„์Šค๋ฅผ ์šด์˜์ค‘์ด๋ผ๋ฉด... ๋Œ“๊ธ€์— ์•Œ๋ ค์ฃผ์‹œ๋ฉด ๋„ˆ๋ฌด ๊ฐ์‚ฌํ• ๊ฑฐ ๊ฐ™๋‹ค!
๊ผญ ์ด๋ฅผ ์‘์šฉํ•ด์„œ ์‚ฌ์šฉํ•ด ๋ด์•ผ ๊ฒ ๋‹ค!

profile
Cloud Developer

0๊ฐœ์˜ ๋Œ“๊ธ€