Kubernetes

[PKOS] 3주차 - GitOps

라온클 2023. 3. 26. 09:11

PKOS 스터디 소개

본 포스팅은 가시다님의 PKOS(Production Kubernetes Online Study)스터디 내용을 정리한 것이다.

이번 PKOS 스터디는 스터디, 스터디 노션 자료, 과제(본 포스팅) 모두 책 <24단계 실습으로 정복하는 쿠버네티스> 내용을 기반으로 진행한다.



스터디 3주차 소개

이번 3주차에서는 GitOps에서 쓰이는, Harbor, ArgoCD, GitLab에 대해 배운다.

그림으로 나타내면 다음과 같다.

 

 

그림 출처: <24단계 실습으로 정복하는 쿠버네티스> 

 

실습 환경 배포

  • kops-ec2 : 배스천용(t3.small)
  • control-plane : 마스터노드
  • node1 : 워커노드
  • noed2 : 워커노드







Harbor

온프레미스 환경에서 사용할 수 있는 컨테이너 이미지 저장소

 

 

Harbor는 2020년 CNCF를 졸업한 프로젝트다.

운영 레벨에서 RBAC(역할 기반 접근 제어), Vulnarbility Scanning(취약점 스캐닝), 이미지 서명 등을 지원한다.

 

https://github.com/goharbor/harbor 




 

Docker Hub, CSP에서 제공하는 이미지 저장소 등 외부 솔루션을 사용할 수 있지만, 스토리지, 네트워크, 보안상의 이유로 컨테이너 이미지 저장소는 로컬 온프레미스 환경을 선호하는 기업이 많다.

보안상의 이유로 생각보다 많은 기업들이 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 --version 1.11.0

vim ~/harbor/values.yaml

 

 

values.yaml 를 다음과 같이 고친다.

# certSource는 AWS 사용할거니까 제외
expose.tls.certSource=none                       

# host 설정
expose.ingress.hosts.core=harbor.{자신의 도메인}
expose.ingress.hosts.notary=notary.{자신의 도메인}

# contoller과 class이름 정하기
expose.ingress.controller=alb               
expose.ingress.className=alb        

# ingress에 annotation 붙이기
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}   # 각자 자신의 값으로 수정입력

# 웹에서 harbor로 접속할 URL 입력하기
externalURL=https://harbor.{자신의 도메인}

 

 

하버 접속 성공

 

 

프로젝트 생성

 

 

habror는 이미지 레지스트리다. 이미지를 push 해보자!

 

push 후, Habor에 등록된 것을 확인할 수 있다.

 

Harbor는 이미지 취약점 스캐닝 기능도 제공하고 있다.

각각 이미지를 개별로 스캐닝할 수 도 있고, 프로젝트 전체에 스캐닝 설정을 활성화해둘 수도 있다.

 

프로젝트에 스캐닝 기능을 활성화하기

 

이미지 push 후, harbor 웹UI에서 이미지 업로드와동시에 취약점 검사가  같이 진행되는 것을 볼 수 있다.






 

GitLab

Git 소스 코드 원격 저장소로 가장 유명한 GitHub, Confluence회사의 BitBucke, 그리고 GitLab이 있다.

많은 사람들이 GitHub을 애용하지만, 그 중 기업 내부에 설치해서 사용하는 솔루션으로는 GitLab을 가장 많이 사용한다.

Community Edition으로는 무료로 사용 가능하고, 추가 비용을 지불하면 소스코드 원격 저장소 기능 뿐 아니라 이미지 레지스트리, 이슈 트래커, 위키, CI/CD 등 다양한 기능을 제공한다.

 

 

GitLab도 helm으로 설치할 수 있다.

# helm으로 GitLab 설치하기
helm repo add gitlab https://charts.gitlab.io/
helm repo update
helm fetch gitlab/gitlab --untar --version 6.8.1

# value.yaml 수정하기
vim ~/gitlab/values.yaml

 

이어서 values.yaml도 수정한다.

global:
  hosts:
    domain: {자신의 도메인}
    https: true

  ingress:                            
    configureCertmanager: false # 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" # alb 룰 그룹으로 묶기
    tls:      # {} 괄호 풀기
      enabled: false

 

 

수정한 values.yaml 를 기반으로 helm install를 시작한다.

# helm install 로 설치하기
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

# 설치된 GitLab 리소스 확인하기
helm list -n gitlab
kubectl get pod,pvc,ingress,deploy,sts -n gitlab
kubectl df-pv -n gitlab
kubectl get-all -n gitlab
kubectl get ingress -n gitlab

# 웹 접속 주소 확인하기
echo -e "gitlab URL = https://gitlab.$KOPS_CLUSTER_NAME"

 

 

 

 

 

 

방금 로그인한 건 Root..사용자다.

사용자(현업에선 개발자) 계정을 생성 후, 해당 사용자로 로그인해서 프로젝트를 생성해보자.

 

 

이메일 프로필 사진을 바로 가져온다..

 

 

 

 

로컬에서(정확히는 kops-ec2 VM에서) 방금 생성한 사용자 계정으로 GitLab 으로 로그인하자.

# 생성한 사용자 GitLab 계정으로 로그인하기
git config --global user.name "사용자명"
git config --global user.email "사용자 이메일"

# GitLab에서 방금 생성한 프로젝트 git clone하기
git clone https://gitlab.$KOPS_CLUSTER_NAME/<각자 자신의 Gitlab 계정>/test-stg.git

# git clone 한 디렉토리로 이동
ls -al test-stg
cd test-stg

 

이어서 push해보자

# 파일 생성 및 깃 업로드(push) : 웹에서 확인
echo "gitlab test memo" >> test.txt
git add . && git commit -m "initial commit - add test.txt"
git push
Username for 'https://gitlab.{자신의 도메인}': {사용자명}
Password for 'https://{사용자명}@gitlab.{자신의 도메인}': <토큰 입력>

 

 

 

 

GitLab 웹 UI에서 사용자가 생성한 프로젝트에 해당 파일이 업로드된걸 바로 확인할 수 있다.

 

 

 

Argo CD

지속적인 배포(Continuous Delivery)란?

개발자가 변경한 소스코드를 Git 저장소에 푸시하면 해당 변경사항이 엔드유저가 사용하는 실제 운영환경의 시스템까지 자동으로 반영되는 것을 뜻한다.

Jenkins, Bamboo, TeamCity 등 다양한 CD도구들이 있으며, 특히 Argo CD는 쿠버네티스 시스템 CD도구로 널리 쓰이고 있다.

 

 

 

 

Argo CD란?

Argo CD는 배포 작업 뿐 아니라 Argo CD로 배포한 Helm 애플리케이션, 각 리소스 간 관계, 에러 유무를 UI로 보여준다. 감사합니다..

 

 

Argo CD도 설치하자!

# Helm 으로 설치
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


# 설치 후 확인하기
helm list -n argocd
kubectl get pod,pvc,svc,deploy,sts -n argocd
kubectl get-all -n argocd
kubectl get crd | grep argoproj


# 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

 

 

 

분위기가 스폰지밥의 광기를 닮았다

 

Argo CD CLI 도구 설치하기

# Argo CD 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

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

# 위에서 설치한 설치한 깃랩의 프로젝트 URL 을 argocd 깃 리포지토리(argocd repo)로 등록. 깃랩은 프로젝트 단위로 소스 코드를 보관.
argocd repo add https://gitlab.$KOPS_CLUSTER_NAME/<깃랩 계정명>/test-stg.git --username <깃랩 계정명> --password <깃랩 계정 암호>
 
# Git Repository 등록 확인하기
argocd repo list

# Argo CD에 등록된 클러스터 조회하기(기본적으로 Argo CD가 설치된 쿠버네티스 클러스터는 타깃 클러스터로 등록된다)
argocd cluster list

 

 

Argo CD CLI 도구로 애플리케이션 배포하기

# Git 디렉터리로 이동하기(test-stg)
cd ~/gitlab-test/test-stg

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

# RabbitMQ Helm 차트 설치하기
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

# Helm 차트를 GitLab 저장소에 업로드하기
git add . && git commit -m "add rabbitmq helm"
git push

# Argo CD CRD 확인하기
kubectl get crd | grep argo

 

 

ArgoCD를 이용하여 RabbitMQ Helm 애플리케이션 배포하기

(책에서 제공하는)RabbitMQ yaml파일을 수정 후 배포해보자!

cd ~/
curl -s -O https://raw.githubusercontent.com/wikibook/kubepractice/main/ch15/rabbitmq-helm-argo-application.yml
vim rabbitmq-helm-argo-application.yml

 

아래 yaml파일에서 source 부분을 확인 후 고친다.

  • repoURL: {GitLab 레포지토리 주소}
  • path: rabbitmq
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: {GitLab 레포지토리 주소}
    path: rabbitmq
    targetRevision: HEAD
    helm:
      valueFiles:
      - my-values.yaml
  syncPolicy:
    syncOptions:
    - CreateNamespace=true

 

배포와 동시에 바로 Argo CD의 웹 UI에 반영되는 것을 볼 수 있다.

 

 

 

 

Statefulset을 파드 1개에서 5개로 늘려보자.

kubectl scale statefulset -n rabbitmq rabbitmq-helm --replicas 5

 

웹 UI에 바로 반영되는 것을 볼 수 있다.

 

 

리소스 지우기

 

 

1단계: Helm 차트 삭제

# argocd 삭제
kubectl delete application -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

 

 

2단계: kOps 클러스터 삭제 & AWS CloudFormation 스택 삭제

kops delete cluster --yes && aws cloudformation delete-stack --stack-name mykops

 

 

 

 

 

 

삽질 및 후기

1. 버킷이 없어

여느때와 다름없이 스터디 템플릿을 그대로 업로드해서 진행하는데, 버킷이 없다는 에러가 나타났다.

 

 

이건 Cloud Formation 템플릿에 지정한 버킷이 없다고 에러가 났다.

평소처럼 자동으로 생성해주는 줄.. 

 

그래서 버킷 만들어주고 해결.

 

 

2. 인증서

처음에 Harbor를 띄우는건 성공했는데, 인증서 에러가 났다.

 

 

알고보니 Harbor의 values.yaml 에서 설정한 인증서가 문제였다.

alb.ingress.kubernetes.io/certificate-arn: ${CERT_ARN} 

 

요약하면 soojinoncloud.com ACM인증서는 있는데, harbor.soojinoncloud.com 인증서는 없다 라는 것

 

 

'Aㅏ.. ACM에서 harbor.soojinoncloud.com 인증서를 별도로 요청해줘야 하나?'하고

아래처럼 요청하고 가만히 가마니 기다렸는데 당연히 발급되지 않았다. 도메인 소유권을 생각해보면 당연한 일이다.

요청하기 전에 생각했나요?

 

 

검색해보니, ACM 인증서 신청할 때, [다른 이름 추가] 식으로 추가하는 방식으로 진행해야 한다고 해서, 

기존 soojinoncloud.com ACM인증서를 삭제하고, 아래와 같이 추가해서 다시 생성했다.

 

 

그러니까 이 이슈는 전에 ACM 인증서를 요청할 때, '*.도메인'도 같이 추가하면 된다는 것을 몰라서 도메인이름 하나만 요청해둔게 원인이었다.

 

아무튼 Route53에서 구매한 도메인이다 보니, 인증서는 바로 생성되었다.



 

그랬더니 harbor도 바로 https 바로 세팅 성공

 

 

배포도 너무 잘 되었다.

 

이거 보는데 그냥 정대만 짤이 생각났다....

불꽃 상중하남자..

 

 

3. 비용 확인

웃긴데 안 웃긴 짤..

 

 

실습 끝나고 벌벌 떨면서 root계정 들어갔다.

실습 리소스가 비싼것보다는, 내가 삽질하느라 시간이 오래 걸려서 걱정이 되었다.

다행히 비용이 크게 나오진 않았음..

 

 

벌벌 떨었던 이유 = PTSD

63빌딩