(PKOS) 3주 차 – GitOps


PKOS 연구 소개

이 게시물은 가다에서 작성했습니다.
프로덕션 Kubernetes 온라인 연구(PKOS) 연구 내용 정리.

이 PKOS 연구에서 연구, 연구 개요 자료 및 과제(이 게시물)는 모두 책입니다.
콘텐츠 기반 이동.


공부 3주차 소개

이번 셋째 주에는 GitOps에서 사용되는 Harbour, ArgoCD 및 GitLab에 대해 배웁니다.

그림과 같이 다음과 같습니다.


이미지 출처:

실험실 환경 제공

  • kops-ec2 : 요새용(t3.small)
  • 컨트롤 플레인: 마스터 노드
  • node1 : 작업자 노드
  • noed2 : 작업자 노드


항구

로컬 환경에서 사용할 수 있는 컨테이너 이미지 저장소입니다.


하버는 2020년 CNCF를 졸업하는 프로젝트입니다.

운영 수준에서는 RBAC(Role-Based Access Control), 취약성 스캐닝(Vulnerability Scanning) 및 이미지 서명을 지원합니다.

https://github.com/goharbor/harbor

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

예상보다 많은 기업들이 보안상의 이유로 Harbor를 사용하고 있습니다.

훈련

# 사용 중인 리전의 인증서 ARN 확인

aws acm list-certificates –query ‘CertificateSummaryList().CertificateArn()’ –출력 텍스트

CERT_ARN=`aws acm list-certificates –query ‘CertificateSummaryList().CertificateArn()’ –output text`

echo “alb.ingress.kubernetes.io/certificate-arn: $CERT_ARN”

# 포트를 설치

투구 저장소 포트 추가 https://helm.goharbor.io

헬름 포트/포트 가져오기 –untar –version 1.11.0

vim ~/harbor/values.yaml

———————-

# AWS를 사용할 것이므로 certSource를 제외합니다.

Expose.tls.certSource=없음

# 호스트 지정

Expose.ingress.hosts.core=harbor.soojinoncloud.com

Expose.ingress.hosts.notary=notary.soojinoncloud.com

# 컨트롤러와 클래스 이름 얻기

Expose.ingress.controller=alb

expon.ingress.className=alb

# Ingress에 주석 추가

alb.ingress.kubernetes.io/scheme: 인터넷 액세스 가능

alb.ingress.kubernetes.io/대상 유형: ip

alb.ingress.kubernetes.io/listen-ports: ‘({“HTTPS”:443}, {“HTTP”:80})’

alb.ingress.kubernetes.io/certificate-arn: ${CERT_ARN} # 고유한 값 입력

# 포트 콘솔(?)에 접속할 URL을 입력합니다.

외부URL=https://harbor.soojinoncloud.com

———————-

포트 연결 성공


프로젝트 생성



인증서 삽

첫째, SSL이 연결되지 않았습니다.


알고 보니 내가 가지고 있던 ACM 인증서는 soojinoncloud.com용이었는데 Harbor.soojinoncloud.com용 인증서는 없었다.

ACM 인증서를 처음 발급받았기 때문에,

이 기회 덕분에 (이 인증서에 다른 이름을 추가) 해야 한다는 것을 처음 깨달았습니다.

깃랩

Git 소스 코드의 원격 저장소로 가장 잘 알려진 GitHub, Confluence의 BitBucke 및 GitLab이 있습니다.

많은 분들이 깃허브(GitHub)를 좋아하지만 그 중 조직 내에서 설치하여 사용하는 솔루션으로 가장 많이 사용되는 것이 깃랩(GitLab)입니다.

커뮤니티 에디션은 무료로 제공되며 이미지 등록, 이슈 트래킹, 위키, CI/CD 등의 다양한 기능과 추가 비용을 지불하면 소스 코드 원격 저장 기능을 제공한다.



사용자 생성 후 해당 사용자로 로그인하여 프로젝트를 생성합니다.



이메일 프로필 사진을 즉시 받으세요.


GitLab에 로컬로(특히 kops-ec2 VM에서) 로그인하고 git push를 계속합니다.

# 생성한 사용자 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) : 웹에서 확인
echo "gitlab test memo" >> test.txt
git add . && git commit -m "initial commit - add test.txt"
git push
Username for 'https://gitlab.{자신의 도메인}': soojin
Password for 'https://{사용자명}@gitlab.{자신의 도메인}': <토큰 입력>


GitLab 웹 화면에 바로 업로드 된 것을 볼 수 있습니다.


아르고 CD

지속적 전달이란 무엇입니까?

즉, 개발자가 수정한 소스 코드를 Git 저장소에 푸시하면 최종 사용자가 사용하는 실제 운영 환경의 시스템에 변경 사항이 자동으로 푸시된다는 뜻이다.

Jenkins, Bamboo, TeamCity 등 다양한 CD 도구가 있으며 특히 Argo CD는 Kubernetes 시스템 CD 도구로 널리 사용됩니다.

아르고 CD란?

Argo CD는 배포 과정뿐만 아니라 Argo CD와 함께 배포되는 Helm 응용 프로그램, 각 리소스 간의 관계 및 오류 유무를 사용자 인터페이스를 통해 보여줍니다.
감사해요..

힘내

# 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 파일을 수정해보자!

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

아래 YAML 파일에서 소스/경로를 변경합니다.

  • repoURL: {GitLab 저장소 주소}
  • 경로: 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 웹 인터페이스에 반영되는 것을 볼 수 있습니다.


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