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로 포트도 성공적으로 설정되었습니다.
분포도 아주 좋았습니다.
이거보면서 정대만 생각나서..