카이도스의 Tech Blog

PKOS 4주차 - Harbor Gitlab ArgoCD 본문

KOPS

PKOS 4주차 - Harbor Gitlab ArgoCD

카이도스 2023. 2. 7. 15:57
728x90
반응형

목표 : 온프레미스 쿠버네티스 환경의 애플리케이션을 배포하는 데 필요한 인프라, 파이프라인 - 애플리케이션을 배포하는 지속적인 배포 시스템

https://aws.amazon.com/ko/blogs/tech/blue-green-or-canary-amazon-eks-clusters-migration-for-stateless-argocd-workloads/

 

Blue/Green, Canary 방법을 활용한 stateless 워크로드의 Amazon EKS 클러스터 마이그레이션 전략 | Amazon Web

신정섭, Solutions Architect 본 게시물은 AWS Container Blog에 게시된 ‘Blue/Green or Canary Amazon EKS clusters migration for stateless ArgoCD workloads by Sebastien Allamand’을 한국어 번역 및 편집하였습니다. 개요 조직에서

aws.amazon.com


실습 환경 배포

kops 인스턴스 t3.small & 노드 c5.2xlarge (vCPU 8, Memory 16GiB) 배포 : 이번주 실습에서 성능을 요구하는 파드를


kops 인스턴스 t3.small : 도커 엔진 확인

# default NS 진입
kubectl ns default

Context "pjhtest.click" modified.

Active namespace is "default".


# 설치된 패키지 확인 : 도커 엔진 확인
yum list installed

# 도커 정보 확인 : client - server, Docker Root Dir, Registry
docker info

# 도커 정보 확인 : Docker Engine - Community
docker version

# 도커 서비스 상태 확인
systemctl status docker

# 모든 서비스의 상태 표시 - 링크
systemctl list-units --type=service

# 도커 루트 디렉터리 확인
tree -L 3 /var/lib/docker

EC2 instance profiles 설정 및 AWS LoadBalancer 배포 & ExternalDNS 설치 및 배포

# EC2 instance profiles 에 IAM Policy 추가(attach)

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
aws iam attach-role-policy --policy-arn arn:aws:iam::$ACCOUNT_ID:policy/AllowExternalDNSUpdates --role-name masters.$KOPS_CLUSTER_NAME
aws iam attach-role-policy --policy-arn arn:aws:iam::$ACCOUNT_ID:policy/AllowExternalDNSUpdates --role-name nodes.$KOPS_CLUSTER_NAME

# kOps 클러스터 편집 : 아래 내용 추가
kops edit cluster
-----
spec:
  certManager:
    enabled: true
  awsLoadBalancerController:
    enabled: true
  externalDns:
    provider: external-dns
-----

# 업데이트 적용
kops update cluster --yes && echo && sleep 3 && kops rolling-update cluster

하버(Harbor)를 이용하여 로컬 컨테이너 이미지 저장소 구축하기

소개 : 온프레미스 환경에서 컨테이너 이미지 저장소, 최소 Spec(2CPU, 4Mem, Disk 40GB)

    • Harbor is an open source registry that secures artifacts with policies and role-based access control, ensures images are scanned and free from vulnerabilities, and signs images as trusted
    • Harbor 정책 역할 기반 액세스 제어로 아티팩트를 보호하고 이미지를 스캔하고 취약성이 없도록 하며 이미지를 신뢰할 있는 것으로 서명하는 오픈 소스 레지스트리입니다.

헬름 차트로 하버 설치 - HelmChart harbor docs

# 사용 리전의 인증서 ARN 확인
aws acm list-certificates --query 'CertificateSummaryList[].CertificateArn[]' --output text

arn:aws:acm:ap-northeast-2:207748141400:certificate/8d18f11b-e794-403e-87b6-b9b4313c33df

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:207748141400:certificate/8d18f11b-e794-403e-87b6-b9b4313c33df


# 하버 설치
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.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줄
----------------------

certSource: none

core: harbor.pjhtest.click

notary: notary.pjhtest.click

controller: alb

className: alb

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:207748141400:certificate/8d18f11b-e794-403e-87b6-b9b4313c33df

externalURL: https://harbor.pjhtest.click


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

하버 웹 접속 및 로컬 이미지 업로드: https://harbor.<각자 자신의 도메인>

  • https://harbor.pjhtest.click (로그인 : admin/Harbor12345)
  • NEW PROJECT → Name(pkos), Access Level(Public Check) ⇒ OK 클릭
    • 신규 프로젝트 생성 : 프로젝트 단위로 컨테이너 이미지 저장소를 관리, 프로젝트 별로 사용자 권한(RBAC) 보안 설정이 가능

  • kops-ec2 에서 로컬 이미지를 원격 하버 이미지 저장소로 업로드
# 컨테이너 이미지 가져오기
docker pull nginx
docker pull busybox 
docker images


# 태그 설정
docker tag busybox harbor.$KOPS_CLUSTER_NAME/pkos/busybox:0.1
docker images
REPOSITORY                          TAG       IMAGE ID       CREATED       SIZE
nginx                               latest    9eee96112def   2 days ago    142MB
busybox                             latest    66ba00ad3de8   4 weeks ago   4.87MB
harbor.pjhtest.click/pkos/busybox   0.1       66ba00ad3de8   4 weeks ago   4.87MB

# 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

# 로그인
docker login harbor.$KOPS_CLUSTER_NAME -u admin -p Harbor12345
cat /root/.docker/config.json | jq

# 이미지 업로드
docker push harbor.$KOPS_CLUSTER_NAME/pkos/busybox:0.1


쿠버네티스 YAML 파일의 컨테이너 이미지 저장소 주소를 로컬 하버로 변경 : harbor 저장소 이미지를 사용하는 디플로이먼트 생성하기

# 파드 배포
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
kubectl apply -f busybox-deploy.yml

# 확인 : 정상적으로 harbor 에서 이미지 다운로드되어 파드가 동작!
cat busybox-deploy.yml | yh
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.pjhtest.click/pkos/busybox:0.1
        command: 
        - "/bin/sh"
        - "-c"
        - "sleep inf"

kubectl get pod
NAME                      READY   STATUS    RESTARTS   AGE
busybox-fcf99964f-7s7jp   1/1     Running   0          5s

kubectl describe pod | grep Events: -A7
Events:
  Type    Reason     Age   From               Message
  ----    ------     ----  ----               -------
  Normal  Scheduled  26s   default-scheduler  Successfully assigned default/busybox-fcf99964f-7s7jp to i-007dfd0137b93f9c0
  Normal  Pulling    26s   kubelet            Pulling image "harbor.pjhtest.click/pkos/busybox:0.1"
  Normal  Pulled     25s   kubelet            Successfully pulled image "harbor.pjhtest.click/pkos/busybox:0.1" in 569.885837ms
  Normal  Created    25s   kubelet            Created container busybox
  Normal  Started    25s   kubelet            Started container busybox

컨테이너 이미지 업로드 시 자동으로 이미지 보안 스캔 기능 사용

  • Trivy 이미지 스캐닝 도구를 통해서 스캔해보자 - 링크

이미지 선택 후 상단 SCAN 클릭

 

스캔 결과 현재 busybox 이미지는 취약점이 없음을 확인

  • 자동 보안 스캔 설정 및 확인
  • 프로젝트에서 Configuration 클릭 후 아래 Automatically... 클릭 후 맨 하단에 Save 선택

# 태그 설정
docker tag nginx harbor.$KOPS_CLUSTER_NAME/pkos/nginx:0.1
docker images
REPOSITORY                          TAG       IMAGE ID       CREATED       SIZE
nginx                               latest    9eee96112def   2 days ago    142MB
harbor.pjhtest.click/pkos/nginx     0.1       9eee96112def   2 days ago    142MB
busybox                             latest    66ba00ad3de8   4 weeks ago   4.87MB
harbor.pjhtest.click/pkos/busybox   0.1       66ba00ad3de8   4 weeks ago   4.87MB

# 이미지 업로드
docker push harbor.$KOPS_CLUSTER_NAME/pkos/nginx:0.1


# harbor 웹에서 확인 >> 아래 처럼 자동으로 스캔 수행됨

  • 취약점을 제거한 이미지를 서명된(Signed) 이미지로 분류해서 별도로 관리할 수 있습니다

과제1:Harbor 에 자신만의 아무 이미지나 태그해서 업로드하고 다운로드 해보고, 관련 스샷 올려주세요

# 컨테이너 이미지 가져오기, 태그설정(mysql)
docker pull mysql
docker tag mysql harbor.$KOPS_CLUSTER_NAME/pkos/mysql:0.1
docker images
REPOSITORY                          TAG       IMAGE ID       CREATED       SIZE
nginx                               latest    9eee96112def   2 days ago    142MB
harbor.pjhtest.click/pkos/nginx     0.1       9eee96112def   2 days ago    142MB
mysql                               latest    05b458cc32b9   6 days ago    517MB
harbor.pjhtest.click/pkos/mysql     0.1       05b458cc32b9   6 days ago    517MB
harbor.pjhtest.click/pkos/busybox   0.1       66ba00ad3de8   4 weeks ago   4.87MB
busybox                             latest    66ba00ad3de8   4 weeks ago   4.87MB

# 이미지 업로드
docker push harbor.$KOPS_CLUSTER_NAME/pkos/mysql:0.1
The push refers to repository [harbor.pjhtest.click/pkos/mysql]
009d7c4ed067: Pushed 
6d0feecd7e9c: Pushed 
615eef2b5be0: Pushed 
4b91e27e8ba8: Pushed 
9cb17ccc96ac: Pushed 
33ea04b3e7cc: Pushed 
0306fdba8cec: Pushed 
1e9a51413906: Pushed 
cbddb28c6870: Pushed 
9f455fadb16f: Pushed 
f4c2de7b58c0: Pushed 
0.1: digest: sha256:5084e15154ea2784784ddc05b92cc9f5074c1b2d4dcc815acdd8ad6b98afaeb9 size: 2618

용량이 크다..mysql...  취약점도.. 흠....


깃랩(GitLab)를 이용하여 로컬 깃(Git) 소스 저장소 구축

소개 : 무료 오픈소스로 사용 가능한 소스 코드 원격 저장소, 최소 Spec(4CPU, 4Mem, Disk 40GB) - Requirements Pricing GetStarted


헬름 차트로 깃랩 설치 후 웹 로그인 - HelmChart Docs

# 모니터링
kubectl create ns gitlab
watch kubectl get pod,pvc,ingress -n 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
    tls:
      enabled: false

certmanager:              # 832줄
  installCRDs: false
  install: false
  rbac:
    create: false

nginx-ingress:            # 846줄
  enabled: false

prometheus:           # 903줄
  install: false

gitlab-runner:         # 1129줄
  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

# 웹 root 계정 암호 확인
kubectl get secrets -n gitlab gitlab-gitlab-initial-root-password --template={{.data.password}} | base64 -d ;echo

QlAd4OyKiBeRpWzcE7UDOBEYv64DOzeLXUz9tIWhyKq0OonvK2j0tBXnBLkDN9TU


# 웹 접속 https://gitlab.<각자 자신의 도메인> (root / 웹 root 계정 암호)

https://gitlab.pjhtest.click        ← 넉넉히 10분정도 있다가 접속

  • 접속 후 별도의 사용자 생성 : Admins → Users : 각자 자신만의 편한 계정 (pjh , djdakf1234@naver.com, Administrator 권한 부여) ⇒ 해당 계정으로 git 명령어 실행
    • Impersonation Tokens : Name(test), Scopes(모두 Check) → Create impersonation token 클릭 ⇒ 토큰 값 확인 glpat-1P2QHYy5co3RvJhUstDB
  • Users : 유저 선택 후 암호 입력(Test1234), admin 권한 체크 ⇒ root 계정 로그아웃 ⇒ gasida 계정 로그인 ⇒ 암호 변경(P@ssw0rd)
  • (옵션) Gitlab 관련 Ingress(ALB) 4개를 생성하는 대신, 1대만으로 동작하게 설정해보세요!
  • 깃랩 신규 프로젝트 작성 : Project name (test-stg) , Project URL(<각자계정>, /test-stg) , Visibility Level (Intenal) , Initialize repository with a README (체크)

생성한 깃랩 프로젝트에 쿠버네티스에서 사용하는 YAML 파일을 업로드 ⇒ 토큰 값 확인 glpat-1P2QHYy5co3RvJhUstDB

#
mkdir ~/gitlab-test && cd ~/gitlab-test

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

# git 계정 정보 확인 및 global 계정 정보 입력
git config --global user.name "<각자 자신의 Gialba 계정>"
git config --global user.email "<각자 자신의 Gialba 계정의 이메일>"
git config --global user.name "pjh"
git config --global user.email "djdakf1234@naver.com"
git config --list

user.name=pjh

user.email=djdakf1234@naver.com

 

# git clone
git clone https://gitlab.$KOPS_CLUSTER_NAME/<각자 자신의 Gialba 계정>/test-stg.git
git clone https://gitlab.$KOPS_CLUSTER_NAME/pjh/test-stg.git

Cloning into 'test-stg'...

Username for 'https://gitlab.pjhtest.click': pjh

Password for 'https://pjh@gitlab.pjhtest.click': <토큰 입력>

remote: Enumerating objects: 3, done.

remote: Counting objects: 100% (3/3), done.

remote: Compressing objects: 100% (2/2), done.

Receiving objects: 100% (3/3), done.

remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0


# 이동
ls -al test-stg && cd test-stg

# 파일 생성 및 깃 업로드(push) : 웹에서 확인
echo "gitlab pjh-test HI" >> test.txt
git add . && git commit -m "initial commit - add test.txt"
git push

Username for 'https://gitlab.pjhtest.click': pjh

Password for 'https://pjh@gitlab.pjhtest.click': <토큰 입력>

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), 300 bytes | 300.00 KiB/s, done.

Total 3 (delta 0), reused 0 (delta 0), pack-reused 0

To https://gitlab.pjhtest.click/pjh/test-stg.git

   0e44c45..fbbda95  main -> main


과제2:자신만의 텍스트 파일을 kops-ec2 로컬에서 Gitlab 에 올려보고, 관련 스샷 올려주세요

위에서 진행함!


아르고시디(ArgoCD)를 활용한 깃옵스(GitOps) 시스템 구축

소개 : Argo CD is a declarative, GitOps continuous delivery tool for Kubernetes.

  • 지속적인 배포란(Continuous Delivery, CD) 개발자가 소스코드를 변경해서 깃 저장소에 푸시하면 해당 변경 사항이 고객이 사용하는 실제 운영환경의 시스템까지 자동으로 반영함
    • 개발자의 코드가 원격 저장소에 업로드됐을 때 아르고시디가 자동으로 해당 코드를 클러스터 운영환경에 배포합니다.
    • 아르고시티로 배포한 헬름 애플리케이션의 리소스 목록, 각 리소스 간 관계 및 에러 유무를 UI로 보여줍니다.
  • 단일 진실 원천(SSOT, Single Source Of Truth)이란 어떠한 진실(결과)의 원인이 하나의 이유(원천)에서 비롯되는 것을 의미합니다.
    • 쿠버네티스 환경에서 깃옵스의 의미는 실제 운영 중인 클러스터의 상태를 개발자의 로컬 PC혹은 아무런 기록을 남기지 않고 클러스터에서 임의로 수정하게 하지 않고 공용으로 관리하는 깃 저장소에서만 유일하게 변경을 허용함으로써 단일 진실 원천(SSOT)를 구현합니다.
    • 아르고시디를 사용하면 쿠버네티스 매니페스트 소스 파일을 여러 개발자의 개인 PC에 보관하지 않고 중앙의 통합된 깃 저장소에 반드시 업로드하고 동기화하도록 정책 관리 가능함

헬름 차트로 설치 후 웹 로그인 - HelmChart

# 모니터링
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
kubectl get pod,pvc,svc,deploy,sts -n argocd
kubectl get-all -n argocd

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

A8Jr2-nx0PS9FAsC


# 웹 접속 로그인 (admin) CLB의 DNS 주소로 접속 http, https


아르고시디로 애플리케이션 배포에 사용할 깃 저장소와 쿠버네티스 클러스터 정보를 등록을 위해,

argocd CLI 도구 설치 - 링크 악분일상

# 최신버전 설치

curl -LO 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=a9f62b722667d4698972effaa2757382-966816332.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/pjh/test-stg.git --username pjh --password P@ssw0rd

# 등록 확인 : 기본적으로 아르고시디가 설치된 쿠버네티스 클러스터는 타깃 클러스터로 등록됨
argocd repo list

TYPE  NAME  REPO                                           INSECURE  OCI    LFS    CREDS  STATUS      MESSAGE  PROJECT

git         https://gitlab.pjhtest.click/pjh/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 헬름 애플리케이션 배포하기 : RabbitMQ Helm 깃랩 업로드

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

# 깃 원격 오리진 주소 확인
git config -l | grep remote.origin.url

remote.origin.url=https://gitlab.pjhtest.click/pjh/test-stg.git


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

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

Username for 'https://gitlab.pjhtest.click': pjh

Password for 'https://pjh@gitlab.pjhtest.click': <토큰 입력>

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), 64.74 KiB | 4.05 MiB/s, done.

Total 56 (delta 13), reused 0 (delta 0), pack-reused 0

To https://gitlab.pjhtest.click/pjh/test-stg.git

   fbbda95..2200ac4  main -> main



# argocd CRD 확인
kubectl get crd | grep argo

applications.argoproj.io              2023-02-07T07:04:11Z.    # 배포 앱 현재 실행 상태와 깃 저장소의 의도한 상태를 계속 비교

applicationsets.argoproj.io           2023-02-07T07:04:11Z.    # 프로젝트 단위 구분

appprojects.argoproj.io               2023-02-07T07:04:11Z



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.pjhtest.click/pjh/test-stg.git
    path: rabbitmq
    targetRevision: HEAD
    helm:
      valueFiles:
      - my-values.yaml
  syncPolicy:
    syncOptions:
    - CreateNamespace=true
--------------------------------------

# 모니터링 : argocd 웹 화면 보고 있기!
# 배포
kubectl apply -f rabbitmq-helm-argo-application.ym
l


# YAML 파일을 적용(apply)하여 아르고시디 ‘Application’ CRD를 생성
kubectl get applications.argoproj.io -n argocd

NAME            SYNC STATUS   HEALTH STATUS
rabbitmq-helm   OutOfSync     Missing

#sync 후 재확인

kubectl get applications.argoproj.io -n argocd

NAME            SYNC STATUS   HEALTH STATUS

rabbitmq-helm   Synced        Healthy


과제3:ArgoCD 챕터인, 책 273페이지의 ‘Gitops 실습: 클러스터 설정 내역 변경과 깃 저장소 자동 반영’을 직접 스스로 실습해보고, 관련 스샷 올려주세요

# 교제의 소스코드 git clone
git clone https://github.com/wikibook/kubepractice.git

# 이동
cd ~/gitlab-test/test-stg/

# httpd 매니페스토 파일 관리를 위해 디렉터리 생성 및 파일복사
mkdir 03.httpd && cd 0.3httpd/
cp ~/kubepractice/ch15/httpd-deploy.yml .
cp ~/kubepractice/ch15/httpd-nodeport-svc.yml .

# git 커밋 후 push
git add . && git commit -m"add httpd manifest"
 2 files changed, 35 insertions(+)
 create mode 100644 03.httpd/httpd-deploy.yml
 create mode 100644 03.httpd/httpd-nodeport-svc.yml

git push
Username for 'https://gitlab.pjhtest.click': pjh
Password for 'https://pjh@gitlab.pjhtest.click': <토큰 입력>
Enumerating objects: 6, done.
Counting objects: 100% (6/6), done.
Delta compression using up to 2 threads
Compressing objects: 100% (5/5), done.
Writing objects: 100% (5/5), 799 bytes | 799.00 KiB/s, done.
Total 5 (delta 0), reused 0 (delta 0), pack-reused 0
To https://gitlab.pjhtest.click/pjh/test-stg.git
   2200ac4..ce2d71b  main -> main

argocd login / repo 등록 / yaml 파일 배포 후 sync 확인

# Application crd 소스코드 복사
cd ~
cp ~/kubepractice/ch15/httpd-directory-argo-application.yml .
k apply -f httpd-directory-argo-application.yml
application.argoproj.io/httpd created

# argocd 서버 로그인
argocd login $CLB --username admin --password $ARGOPW
WARNING: server certificate had error: x509: certificate is valid for localhost, argocd-server, argocd-server.argocd, argocd-server.argocd.svc, argocd-server.argocd.svc.cluster.local, not a9f62b722667d4698972effaa2757382-966816332.ap-northeast-2.elb.amazonaws.com. Proceed insecurely (y/n)? y
'admin:login' logged in successfully
Context 'a9f62b722667d4698972effaa2757382-966816332.ap-northeast-2.elb.amazonaws.com' updated

# argocd repo 등록
argocd repo add https://gitlab.$KOPS_CLUSTER_NAME/pjh/test-stg.git --username pjh --password P@ssw0rd
Repository 'https://gitlab.pjhtest.click/pjh/test-stg.git' added

# 확인
argocd repo list
TYPE  NAME  REPO                                           INSECURE  OCI    LFS    CREDS  STATUS      MESSAGE  PROJECT
git         https://gitlab.pjhtest.click/pjh/test-stg.git  false     false  false  true   Successful  

argocd cluster list
SERVER                          NAME        VERSION  STATUS      MESSAGE  PROJECT
https://kubernetes.default.svc  in-cluster  1.24     Successful

# 배포 전 httpd-directory-argo-application.yml 수정
vi httpd-directory-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.pjhtest.click/pjh/test-stg.git
    path: 0.3httpd
    targetRevision: HEAD
    helm:
      valueFiles:
      - my-values.yaml
  syncPolicy:
    syncOptions:
    - CreateNamespace=true
-----------------------------

# 배포 및 확인
k apply -f httpd-directory-argo-application.yml 
application.argoproj.io/httpd configured

k get applications -n argocd 
NAME            SYNC STATUS   HEALTH STATUS
httpd           Synced        Healthy
rabbitmq-helm   OutOfSync     Healthy

k get po,svc -n httpd
NAME                         READY   STATUS    RESTARTS   AGE
pod/httpd-676d9bc46d-8wv2b   1/1     Running   0          3m3s
pod/httpd-676d9bc46d-q8r2h   1/1     Running   0          3m3s
pod/httpd-676d9bc46d-qghpg   1/1     Running   0          3m3s

NAME                TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
service/httpd-svc   NodePort   100.71.223.130   <none>        80:30180/TCP   3m3s

 

httpd 이미지 변경 후 argoc와 sync 확인

# 네임스페이스, 이미지 변경
k ns httpd
k edit deployments.apps httpd
-----------------------------
 ......  
 spec:
      containers:
      - image: httpd:alpine
        imagePullPolicy: Always
        name: httpd
 ......  
-----------------------------

# 확인
k get po
NAME                     READY   STATUS    RESTARTS   AGE
httpd-6bd6458855-fz6bc   1/1     Running   0          59s
httpd-6bd6458855-lkhwn   1/1     Running   0          71s
httpd-6bd6458855-r5n2x   1/1     Running   0          65s

k describe po httpd-6bd6458855
k get applications -n argocd 
NAME            SYNC STATUS   HEALTH STATUS
httpd           OutOfSync     Healthy
rabbitmq-helm   OutOfSync     Healthy

 

# httpd-svc 서비스 삭제 후 확인

k get svc
NAME        TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
httpd-svc   NodePort   100.71.223.130   <none>        80:30180/TCP   18m

k delete svc httpd-svc 
service "httpd-svc" deleted

k get svc
No resources found in httpd namespace.

argocd 사이트에서 sync 누르고 다시 확인!!

k get svc     서비스파드가 다시 생성되었다!!
NAME        TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
httpd-svc   NodePort   100.70.52.12   <none>        80:30180/TCP   56s

httpd 재배포

k delete -f httpd-directory-argo-application.yml 
application.argoproj.io "httpd" deleted

k apply -f httpd-directory-argo-application.yml 
application.argoproj.io/httpd created

k get svc
NAME        TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
httpd-svc   NodePort   100.65.146.174   <none>        80:30180/TCP   17s

cd ~/gitlab-test/test-stg/03.httpd/
ll
total 8
-rw-r--r-- 1 root root 393 Feb  7 17:19 httpd-deploy.yml
-rw-r--r-- 1 root root 219 Feb  7 17:19 httpd-nodeport-svc.yml

mv httpd-nodeport-svc.yml httpd-clusterip-svc.yaml
vi httpd-clusterip-svc.yaml
---------------
apiVersion: v1
kind: Service
metadata:
  name: httpd-svc
  namespace: httpd
spec:
  ports:
  - name: http
    port: 80
    protocol: TCP
    targetPort: 80
    nodePort: 30180
  selector:
    app: httpd
  type: ClusterIP
---------------

git add . && git commit -m"modify httpd-clusterip-s"
git push
Username for 'https://gitlab.pjhtest.click': pjh
Password for 'https://pjh@gitlab.pjhtest.click': 
Enumerating objects: 6, done.
Counting objects: 100% (6/6), done.
Delta compression using up to 2 threads
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 585 bytes | 585.00 KiB/s, done.
Total 4 (delta 0), reused 0 (delta 0), pack-reused 0
To https://gitlab.pjhtest.click/pjh/test-stg.git
   ce2d71b..33b7323  main -> main

REFRESH 후 OutOfSync 상태

k get svc

NAME        TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE
httpd-svc   ClusterIP   100.65.146.174   <none>        80/TCP    11m

(실습 완료 후) 자원 삭제

헬름 차트 삭제

# argocd 삭제
kubectl delete application.argoproj.io -n argocd rabbitmq-helm
helm uninstall -n argocd argocd
kubectl delete ns argocd

# gitlab 삭제
helm uninstall -n gitlab gitlab
kubectl delete pvc --all -n gitlab
kubectl delete ns gitlab

# harbor 삭제
helm uninstall -n harbor harbor
kubectl delete pvc --all -n harbor
kubectl delete ns harbor

kOps 클러스터 삭제 & AWS CloudFormation 스택 삭제

kops delete cluster --yes && aws cloudformation delete-stack --stack-name mykops
728x90
반응형
Comments