(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()' --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는 이미지 레지스트리입니다.

그림을 밀어보자!


누른 후 Habor에 등록되어 있는지 확인할 수 있습니다.


Harbor는 이미지 취약성 스캔도 제공합니다.

각 이미지를 개별적으로 스캔하거나 전체 프로젝트에 대해 스캔 설정을 활성화할 수 있습니다.

프로젝트 스캔 활성화


이미지 푸시 후 하버 웹 UI에서 이미지 업로드와 취약점 스캔이 동시에 실행되는 것을 확인할 수 있습니다.



깃랩

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

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

커뮤니티 에디션은 무료로 제공되며 이미지 등록, 이슈 트래킹, 위키, 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.. 사용자입니다.

사용자 계정(직장 개발자)을 생성한 후 사용자로 로그인하여 프로젝트를 생성합니다.



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


방금 생성한 사용자 계정으로 GitLab에 로컬(정확히 말하면 kops-ec2 VM)에 로그인합니다.

# 생성한 사용자 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.{자신의 도메인}': {사용자명}
Password for 'https://{사용자명}@gitlab.{자신의 도메인}': <토큰 입력>


GitLab 웹 UI에서 생성한 프로젝트에 파일이 업로드 된 것을 바로 확인할 수 있습니다.


아르고 CD

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

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

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

아르고 CD란?

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

감사해요..

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 파일에서 소스 부분을 확인 및 수정합니다.

  • 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

삽 역사

1. 양동이 없음

평소처럼 스터디 템플릿을 올려서 그대로 진행했는데 버킷이 없다는 에러가 났습니다.


이로 인해 Cloud Formation 템플릿에 지정된 버킷이 존재하지 않는다는 오류가 발생했습니다.

자동으로 생성되는 줄 알았습니다.

이해력이 부족했기 때문입니다.


그래서 양동이를 만들어서 해결했습니다.


2. 증명서

하버 시작에 성공했지만 인증서 오류가 발생했습니다.


알고 보니 Harbors values.yaml에 설정된 인증서가 문제였습니다.

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

요약하면 soojinoncloud.com ACM 인증서는 있지만 Harbor.soojinoncloud.com 인증서는 없습니다.


‘아.. harbour.soojinoncloud.com 인증서는 ACM에서 따로 요청해야 하나요?’


물론 도메인을 소유할 생각이라면 그럴 수 없습니다.

나는 찾고 있었다, ACM 인증서 신청 시 추가(이름 추가)를 진행하셔야 합니다.

내가 그 말을 한 후에

기존 ACM 인증서를 삭제하고 다음과 같이 추가하여 다시 생성했습니다.


내가 소유한 도메인에 대한 ACM 인증서를 요청할 때 “*.domain”도 추가될 수 있다는 것을 몰라서 도메인 이름만 요청했습니다.

어쨌든 Route53에서 도메인을 구입했기 때문에 즉시 인증서가 생성되었습니다.


그런 다음 https로 포트도 성공적으로 설정되었습니다.


분포도 아주 좋았습니다.



이거보면서 정대만 생각나서..


화력이 높은 남자..