카이도스의 Tech Blog
PKOS 4주차 - Harbor Gitlab ArgoCD 본문
목표 : 온프레미스 쿠버네티스 환경의 애플리케이션을 배포하는 데 필요한 인프라, 파이프라인 - 애플리케이션을 배포하는 지속적인 배포 시스템
실습 환경 배포
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 이미지 스캐닝 도구를 통해서 스캔해보자 - 링크
- 자동 보안 스캔 설정 및 확인
- 프로젝트에서 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.yml
# 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
'KOPS' 카테고리의 다른 글
PKOS 6주차 - Alerting 얼럿매니저 로깅시스템 (0) | 2023.02.23 |
---|---|
PKOS 5주차 - 프로메테우스 그라파나 (0) | 2023.02.14 |
PKOS(쿠버네티스)3주차 - Ingress & Storage (0) | 2023.02.01 |
PKOS(쿠버네티스)2주차 - 쿠버네티스 네트워크 (0) | 2023.01.26 |
PKOS(쿠버네티스) 1주차 - AWS kOps 설치 및 기본 사용 (4) | 2023.01.11 |