본문 바로가기
EKS Study

7주차 - EKS CI/CD

by 줄스토리 2024. 4. 14.

#스터디 시작

EKS(Amazon Elastic Kubernetes Service) CI/CD를 공부하려면 먼저 Kubernetes를 활용하여 지속적 통합/지속적 배포 파이프라인을 구축하는 방법을 이해해야 합니다. 특히 Jenkins를 지속적인 통합 도구로 사용하여 git의 코드를 통합하고 Argocd를 AWS EKS에 대한 애플리케이션의 지속적인 배포로 많이 사용하고 있습니다. 따라서 CI-CD 기술을 사용하여 AWS EKS에 애플리케이션을 배포하는 작업을 자동화하는 방법을 배워보도록 하겠습니다.

 

#사전준비

  • 실습 환경 배포 : Amazon EKS (myeks) 윈클릭 배포 & 기본 설정
# YAML 파일 다운로드
curl -O https://s3.ap-northeast-2.amazonaws.com/cloudformation.cloudneta.net/K8S/eks-oneclick6.yaml

# CloudFormation 스택 배포
예시) aws cloudformation deploy --template-file eks-oneclick6.yaml --stack-name myeks --parameter-overrides KeyName=kp-gasida SgIngressSshCidr=$(curl -s ipinfo.io/ip)/32  MyIamUserAccessKeyID=AKIA5... MyIamUserSecretAccessKey='CVNa2...' ClusterBaseName=myeks --region ap-northeast-2

# CloudFormation 스택 배포 완료 후 작업용 EC2 IP 출력
aws cloudformation describe-stacks --stack-name myeks --query 'Stacks[*].Outputs[0].OutputValue' --output text

 

 

- 기본 설정

# default 네임스페이스 적용
kubectl ns default

# 노드 정보 확인 : t3.medium
kubectl get node --label-columns=node.kubernetes.io/instance-type,eks.amazonaws.com/capacityType,topology.kubernetes.io/zone

# ExternalDNS
MyDomain=<자신의 도메인>
echo "export MyDomain=<자신의 도메인>" >> /etc/profile
MyDomain=gasida.link
echo "export MyDomain=gasida.link" >> /etc/profile
MyDnzHostedZoneId=$(aws route53 list-hosted-zones-by-name --dns-name "${MyDomain}." --query "HostedZones[0].Id" --output text)
echo $MyDomain, $MyDnzHostedZoneId
curl -s -O https://raw.githubusercontent.com/gasida/PKOS/main/aews/externaldns.yaml
MyDomain=$MyDomain MyDnzHostedZoneId=$MyDnzHostedZoneId envsubst < externaldns.yaml | kubectl apply -f -

# kube-ops-view
helm repo add geek-cookbook https://geek-cookbook.github.io/charts/
helm install kube-ops-view geek-cookbook/kube-ops-view --version 1.2.2 --set env.TZ="Asia/Seoul" --namespace kube-system
kubectl patch svc -n kube-system kube-ops-view -p '{"spec":{"type":"LoadBalancer"}}'
kubectl annotate service kube-ops-view -n kube-system "external-dns.alpha.kubernetes.io/hostname=kubeopsview.$MyDomain"
echo -e "Kube Ops View URL = http://kubeopsview.$MyDomain:8080/#scale=1.5"

# AWS LB Controller
helm repo add eks https://aws.github.io/eks-charts
helm repo update
helm install aws-load-balancer-controller eks/aws-load-balancer-controller -n kube-system --set clusterName=$CLUSTER_NAME \
  --set serviceAccount.create=false --set serviceAccount.name=aws-load-balancer-controller

# gp3 스토리지 클래스 생성
kubectl apply -f https://raw.githubusercontent.com/gasida/PKOS/main/aews/gp3-sc.yaml

# 노드 보안그룹 ID 확인
NGSGID=$(aws ec2 describe-security-groups --filters Name=group-name,Values=*ng1* --query "SecurityGroups[*].[GroupId]" --output text)
aws ec2 authorize-security-group-ingress --group-id $NGSGID --protocol '-1' --cidr 192.168.1.100/32

- 프로메테우스 & 그라파나(admin / prom-operator) 설치 : 대시보드 추천 15757 17900 15172

# 사용 리전의 인증서 ARN 확인
CERT_ARN=`aws acm list-certificates --query 'CertificateSummaryList[].CertificateArn[]' --output text`
echo $CERT_ARN

# repo 추가
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts

# 파라미터 파일 생성 : PV/PVC(AWS EBS) 삭제에 불편하니, 4주차 실습과 다르게 PV/PVC 미사용
cat <<EOT > monitor-values.yaml
prometheus:
  prometheusSpec:
    podMonitorSelectorNilUsesHelmValues: false
    serviceMonitorSelectorNilUsesHelmValues: false
    retention: 5d
    retentionSize: "10GiB"

  ingress:
    enabled: true
    ingressClassName: alb
    hosts: 
      - prometheus.$MyDomain
    paths: 
      - /*
    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/load-balancer-name: myeks-ingress-alb
      alb.ingress.kubernetes.io/group.name: study
      alb.ingress.kubernetes.io/ssl-redirect: '443'

grafana:
  defaultDashboardsTimezone: Asia/Seoul
  adminPassword: prom-operator
  defaultDashboardsEnabled: false

  ingress:
    enabled: true
    ingressClassName: alb
    hosts: 
      - grafana.$MyDomain
    paths: 
      - /*
    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/load-balancer-name: myeks-ingress-alb
      alb.ingress.kubernetes.io/group.name: study
      alb.ingress.kubernetes.io/ssl-redirect: '443'

alertmanager:
  enabled: false
EOT
cat monitor-values.yaml | yh

# 배포
kubectl create ns monitoring
helm install kube-prometheus-stack prometheus-community/kube-prometheus-stack --version 57.2.0 \
--set prometheus.prometheusSpec.scrapeInterval='15s' --set prometheus.prometheusSpec.evaluationInterval='15s' \
-f monitor-values.yaml --namespace monitoring

# Metrics-server 배포
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml

# 프로메테우스 ingress 도메인으로 웹 접속
echo -e "Prometheus Web URL = https://prometheus.$MyDomain"

# 그라파나 웹 접속 : 기본 계정 - admin / prom-operator
echo -e "Grafana Web URL = https://grafana.$MyDomain"

 

 

# EKS CI/CD 개념 및 특징

소프트웨어 엔지니어링 세계에서 CI는 지속적인 통합을 나타내고 CD는 지속적인 전달 또는 배포를 나타냅니다. 오늘날 빠르게 변화하는 소프트웨어 개발 환경에서는 소프트웨어 배포 프로세스를 간소화하는 것이 중요합니다. 이를 위해서는 애플리케이션 구축 및 테스트부터 배포까지 모든 단계에서 자동화가 필요합니다. CI/CD는 반복적인 작업을 자동화하고 배포 및 테스트 시간을 절약하여 핵심 개발에 집중할 수 있게 해주는 유용한 도구입니다.

 

 

CI/CD:

CI/CD는 지속적인 통합과 지속적인 전달/배포를 의미합니다. 애플리케이션 구축, 테스트 및 배포를 자동화하고 간소화하는 것을 목표로 하는 소프트웨어 개발의 일련의 사례 및 프로세스입니다.

CI/CD의  장점:

  1. 시장 출시 시간 단축
  2. 향상된 코드 품질
  3. 위험 감소
  4. 효율적인 협업
  5. 확장성과 유연성

 

 

# EKS CI/CD 실

- Docker

  •  **도커 허브** 가입 : 자신의 계정명 확인
  • 자신만의 웹 서버 도커 이미지 생성 후 도커 컨테이너 실행
# ubuntu 이미지 다운로드
docker pull ubuntu:20.04
docker images

# 실습을 위한 디렉터리 생성 및 이동
mkdir -p /root/myweb && cd /root/myweb

# Dockerfile 파일 생성
vi Dockerfile
FROM ubuntu:20.04
ENV TZ=Asia/Seoul VERSION=1.0.0 NICK=<자신의 닉네임>
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone && \
    sed -i 's/archive.ubuntu.com/mirror.kakao.com/g' /etc/apt/sources.list && \
    sed -i 's/security.ubuntu.com/mirror.kakao.com/g' /etc/apt/sources.list && \
    apt-get update && apt-get install -y apache2 figlet && \
    echo "$NICK Web Server $VERSION<br>" > /var/www/html/index.html && \
    echo "<pre>" >> /var/www/html/index.html && \
    figlet AEWS Study >> /var/www/html/index.html && \
    echo "</pre>" >> /var/www/html/index.html
EXPOSE 80
CMD ["usr/sbin/apache2ctl", "-DFOREGROUND"]

vi Dockerfile
FROM ubuntu:20.04
ENV TZ=Asia/Seoul VERSION=1.0.0 NICK=gasida
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone && \
    sed -i 's/archive.ubuntu.com/mirror.kakao.com/g' /etc/apt/sources.list && \
    sed -i 's/security.ubuntu.com/mirror.kakao.com/g' /etc/apt/sources.list && \
    apt-get update && apt-get install -y apache2 figlet && \
    echo "$NICK Web Server $VERSION<br>" > /var/www/html/index.html && \
    echo "<pre>" >> /var/www/html/index.html && \
    figlet AEWS Study >> /var/www/html/index.html && \
    echo "</pre>" >> /var/www/html/index.html
EXPOSE 80
CMD ["usr/sbin/apache2ctl", "-DFOREGROUND"]

# 이미지 빌드
cat Dockerfile
docker build -t myweb:v1.0.0 .
docker images
docker image history myweb:v1.0.0
docker image inspect myweb:v1.0.0 | jq

# 컨테이너 실행
docker run -d -p 80:80 --rm --name myweb myweb:v1.0.0
docker ps
curl localhost

# 웹 접속 확인
curl -s ipinfo.io/ip | awk '{ print "myweb = http://"$1"" }'

 

- 도커 허브 업로드

#
DHUB=<도커 허브 계정>
DHUB=gasida
docker tag myweb:v1.0.0 $DHUB/myweb:v1.0.0
docker images

# 도커 허브 로그인
docker login
Username: <자신의 ID>
Password: <암호>
## 로그인 정보는 /[계정명]/.docker/config.json 에 저장됨. docker logout 시 삭제됨
## cat /root/.docker/config.json | jq

# push 로 이미지를 저장소에 업로드
docker push $DHUB/myweb:v1.0.0

 

- 해당 저장소 이미지 활용

# 컨테이너 종료
docker rm -f myweb
docker ps

# 로컬 이미지 삭제
docker rmi $DHUB/myweb:v1.0.0
docker images

# 
docker run -d -p 80:80 --rm --name myweb $DHUB/myweb:v1.0.0
docker iamges

# 확인
docker ps
curl localhost
curl -s ipinfo.io/ip | awk '{ print "myweb = http://"$1"" }'

# 삭제
docker rm -f myweb

 

 

 

 

- Jenkins

Jenkins는 Java로 작성된 오픈 소스 자동화 도구로, 주로 CI/CD(지속적인 통합 및 지속적 전달) 영역에서 소프트웨어 개발의 다양한 작업을 자동화하는 데 도움이 됩니다. 소프트웨어 프로젝트를 구축, 테스트 및 배포하기 위한 플랫폼을 제공하여 개발자가 반복적인 작업을 자동화하고 소프트웨어 제공 프로세스를 간소화할 수 있도록 합니다.

 

Jenkins 사용 사례:

지속적인 통합(CI): Jenkins는 여러 개발자의 코드 변경 사항을 공유 저장소에 자동으로 통합하는 데 탁월합니다. 변경 사항이 리포지토리에 푸시될 때마다 자동으로 빌드 및 테스트를 트리거하여 코드 품질에 대한 빠른 피드백을 제공하고 통합 문제를 방지할 수 있습니다.

지속적인 전달(CD): Jenkins는 배포 프로세스를 자동화하여 소프트웨어의 지속적인 전달을 가능하게 합니다. 사전 정의된 구성을 기반으로 개발, 스테이징, 프로덕션 등 다양한 환경에 애플리케이션을 배포할 수 있습니다. 이는 일관되고 안정적인 배포를 보장하는 데 도움이 됩니다.

자동화된 테스트: Jenkins는 다양한 테스트 프레임워크와 통합하여 빌드 프로세스의 일부로 자동화된 테스트를 실행할 수 있습니다. 개발 주기 초기에 버그와 문제를 식별하여 소프트웨어 품질을 보장하는 데 도움이 됩니다.

배포 오케스트레이션: Jenkins를 사용하면 다양한 서버 및 환경에 대한 애플리케이션 배포를 자동화할 수 있습니다. 여러 서버 또는 클라우드 플랫폼 전반에 걸쳐 소프트웨어를 배포하고 관리하는 프로세스를 간소화합니다.

예약된 작업 및 일괄 처리: Jenkins는 예약된 간격으로 백업 실행, 보고서 생성 또는 일괄 작업 실행과 같은 일상적인 작업을 수행하도록 구성할 수 있습니다. 이를 통해 반복적인 작업을 자동화하고 개발자가 보다 중요한 활동에 시간을 확보할 수 있습니다.

 

더보기
# 실습 편리를 위해서 root 계정 전환
sudo su -

# Add required dependencies for the jenkins package
# https://docs.aws.amazon.com/corretto/latest/corretto-17-ug/amazon-linux-install.html
sudo yum install fontconfig java-17-amazon-corretto -y
java -version
alternatives --display java
JAVA_HOME=/usr/lib/jvm/java-17-amazon-corretto.x86_64
echo $JAVA_HOME

# 젠킨스 설치
sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io-2023.key
sudo yum upgrade
sudo yum install jenkins -y
sudo systemctl daemon-reload
sudo systemctl enable jenkins && sudo systemctl start jenkins   # 다소 시간 걸림
sudo systemctl status jenkins

# 초기 암호 확인
sudo systemctl status jenkins
cat /var/lib/jenkins/secrets/initialAdminPassword

# 접속 주소 확인 
curl -s ipinfo.io/ip | awk '{ print "Jenkins = http://"$1":8080" }'

 

- 초기 암호 입력

 

플러그인 설치 : 제안 플러그인 설치

 

==> 플러그인 설치가 안될 경우 아래와 같은 방법 사용

1. 우선 Plugin 설치 안하고 진행

2. Jenkins 접속 후, Jenkins 관리 -> plugin -> Advanced settings에 들어가서 업데이트 사이트 변경

기존경로: https://updates.jenkins.io/update-center.json

변경경로: http://updates.jenkins.io/update-center.json 변경 후 , 로그아웃 후 다시 PLUGIN 설치 진행

 

 

- 설정 완료 후 젠킨스 접속

  • 첫번째 Item(Project) 생성
    • 새로운 Item 클릭 → Name : First-Project , Freestyle project ⇒ 하단 OK 클릭

 

 

 

 

 

간단한 문장 출력 될 수 있게 입력 : echo "Juls" → 하단 Apply 후 저장

  • 상위 메뉴 - 구성 : 아래 명령어 한줄 추가 java -version → Apply 저장
    • 한줄 더 추가 : whoami
    • 한줄 더 추가 : touch hello.txt

  • 최상위 - 프로젝트 화살표 선택 → 지금 빌드
    • 이후 콘솔 출력 확인
  • Item(Job) 프로젝트 디텍토리 확인 : 혹은 젠킨스 작업 공간 확인
#
find / -name First-Project
/var/lib/jenkins/jobs/First-Project
/var/lib/jenkins/workspace/First-Project

# 프로젝트(job, item) 별 작업 공간 확인
tree /var/lib/jenkins/workspace/First-Project

 

  • 파라미터, 빌드 유발(SCM - Git) 사용 : Trigger-Project
    • Item : Trigger-Project, freestyle
      • 빌드 매개변수 : String
        • 변수명(VERSION), Default Vault(v1.0.0)
        • 변수명(NICK), Default Vault(<자신의 계정명>)
      • 소스 코드 관리 : Git
        • Repo URL : https://github.com/**<자신의 계정명>**/aews-cicd
        • Branch : */main
        • Additional Behaviours → Sparse Checkout paths (Path) : 1
      • 빌드 유발 : Poll SCM (* * * * *)
      • Build Steps : Execute shell

 

- 자신의 Github Repo 1 에서 Dockerfile에 VERSION 정보를 수정 후 Commit → 1분 정도 후에 젠킨스에서 확인

 

 

 

- [신규 추가] Secret text - Link

관리 → Credentials → + Add Credentials → Secret text : Usename(root), Password(qwe123), ID(vmsshpw)

 

item : secretssh (pipiline)

item : secretssh (pipiline)
pipeline {
    agent any
    environment {
        SSHPW_CREDS = credentials('vmsshpw')
    }

    stages {
        stage('remote ssh') {
            steps {
                sh('echo ${SSHPW_CREDS}')
                sh('echo ${SSHPW_CREDS_PSW}')
                sh('sshpass -p $SSHPW_CREDS_PSW ssh root@10.10.1.1 hostname')
            }
        }
    }
}

 

 

 

- [신규 추가] Secret files - Link

  • kube config 파일을 자신의 PC에 복사 → Jenkins Web에 Secret files 등록
scp root@<작업용EC2_공인IP>:/root/.kube/config .

# 아래 확인을 위해 모니터링 
watch -d kubectl get pod

 

item : secretk8s (pipiline)

 

 

 

 

- Argo

ArgoCD는 Kubernetes 기반 CD(지속적 배포) 도구입니다. 푸시 기반 배포만 지원하는 외부 CD 도구와 달리 Argo CD는 Git 리포지토리에서 업데이트된 코드를 가져와 Kubernetes 리소스에 직접 배포할 수 있습니다. 이를 통해 개발자는 하나의 시스템에서 인프라 구성과 애플리케이션 업데이트를 모두 관리할 수 있습니다.

 

- ArgoCD의 기능

1. GIT 저장소의 코드로 정의된 전체 Kubernetes 구성.

2. 웹 사용자 인터페이스 및 명령줄 인터페이스(CLI).

3. 변경 사항을 이전 상태로 롤백할 수 있는 쉬운 롤백 메커니즘이 있습니다.

4. 모든 코드가 GIT에 존재하므로 클러스터가 종료되면 정확한 클러스터를 생성하는 데 도움이 되는 클러스터 재해 복구 기능이 있습니다.

5. GIT를 사용한 Kubernetes 액세스 제어가 포함되어 있습니다.

6. GitLab, GitHub, Microsoft, OAuth2, OIDC, LinkedIn, LDAP 및 SAML 2.0과 같은 공급자를 통한 SSO(Single Sign-On)

7. GitLab, GitHub 및 BitBucket에서 작업을 트리거하는 웹후크를 지원합니다.

8. 배포 문제를 시각화하고 구성 드리프트를 감지 및 해결하는 기능.

 

 

# 간단 설치
kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

# helm 설치
cat <<EOT > argocd-values.yaml
global:
  domain: argocd.$MyDomain

configs:
  params:
    server.insecure: true

controller:
  metrics:
    enabled: true
    serviceMonitor:
      enabled: true

server:
  ingress:
    enabled: true
    controller: aws
    ingressClassName: alb
    hostname: "argocd.$MyDomain"
    annotations:
      alb.ingress.kubernetes.io/scheme: internet-facing
      alb.ingress.kubernetes.io/target-type: ip
      alb.ingress.kubernetes.io/backend-protocol: HTTP
      alb.ingress.kubernetes.io/listen-ports: '[{"HTTPS":80}, {"HTTPS":443}]'
      alb.ingress.kubernetes.io/certificate-arn: $CERT_ARN
      alb.ingress.kubernetes.io/ssl-redirect: '443'
    aws:
      serviceType: ClusterIP
      backendProtocolVersion: GRPC
  metrics:
    enabled: true
    serviceMonitor:
      enabled: true

repoServer:
  metrics:
    enabled: true
    serviceMonitor:
      enabled: true

applicationSet:
  metrics:
    enabled: true
    serviceMonitor:
      enabled: true

notifications:
  metrics:
    enabled: true
    serviceMonitor:
      enabled: true
EOT

kubectl create ns argocd
helm repo add argo https://argoproj.github.io/argo-helm
helm install argocd argo/argo-cd --version 6.7.11 -f argocd-values.yaml --namespace argocd

# 확인
kubectl get ingress,pod,svc -n argocd
kubectl get crd | grep argo
applications.argoproj.io                     2024-04-14T08:12:16Z
applicationsets.argoproj.io                  2024-04-14T08:12:17Z
appprojects.argoproj.io                      2024-04-14T08:12:16Z

# 최초 접속 암호 확인
kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d ;echo
MC3y8rzzECTIAHSB

 

 

  • 최초 접속 https://argocd.<자신의도메인> admin / <최초 접속 암호>
    • (옵션) 로그인 후 User info → UPDATE PASSWORD 변경 가능
  • rollouts cli …
#
curl -LO https://github.com/argoproj/argo-rollouts/releases/download/v1.6.4/kubectl-argo-rollouts-linux-amd64
chmod +x ./kubectl-argo-rollouts-linux-amd64
mv ./kubectl-argo-rollouts-linux-amd64 /usr/local/bin/kubectl-argo-rollouts

# 설치 확인
kubectl argo rollouts version

 

 

  • App 배포 with Directory
    • App 생성 : New App 클릭

  • Application Name : first-myweb
  • Project Name : default
  • SYNC POLICY : Manual
    • AUTO-CREATE NAMESPACE : 클러스터에 네임스페이스가 없을 시 argocd에 입력한 이름으로 자동 생성
    • APPLY OUT OF SYNC ONLY : 현재 동기화 상태가 아닌 리소스만 배포

 

  • PRUNE PROPAGATION POLICY
    • foreground : 부모(소유자, ex. deployment) 자원을 먼저 삭제함
    • background : 자식(종속자, ex. pod) 자원을 먼저 삭제함
    • orphan : 고아(소유자는 삭제됐지만, 종속자가 삭제되지 않은 경우) 자원을 삭제함
  • [체크] AUTO-CREATE-NAMESPACE
  • SOURCE
  • DESTINATION
  • 화면 상단 [CREATE] 클릭
    • PRUNE : GIt에서 자원 삭제 후 배포시 K8S에서는 삭제되지 않으나, 해당 옵션을 선택하면 삭제시킴
    • FORCE : --force 옵션으로 리소스 삭제
    • APPLY ONLY : ArgoCD의 Pre/Post Hook은 사용 안함 (리소스만 배포)
    • DRY RUN : 테스트 배포 (배포에 에러가 있는지 한번 확인해 볼때 사용)배포하기 - [SYNC] 클릭 > [SYNCHRONIZE] 클릭

 

  • 리소스 클릭 후 확인 : 각각 LIVE MANIFEST(쿠버네티스 정보) vs DESIRED MANIFEST(Git깃 정보)
    • 위 화면에서 Deployment 리소스 직접 수정 해보기 : EDIT 클릭 후 lables 아래 추가 → SAVE
# 모니터링
kubectl get deploy,svc -n first --show-labels
watch -d kubectl get deploy -n first --show-labels

 

  • k8s에서 직접 수정 → argocd 싱크(반영) 확인
# 아래 추가
kubectl edit deploy -n first myweb
...
  labels:
    add: label-test
    add2: k8s-test
...

 

 

  • 현재 상태는, Git을 기준으로 보자면 LIVE MANIFEST(K8S)형상이 뒤떨어진것으로 볼 수 있다 → OutOfSync 상태니 Sync 하자
  • Git Repo화면에서 replicas 4로 변경 후 → Commit 후 ArgoCD에서 REFRESH 클릭 후 Sync 후 확인

 

- 실습 리소스 삭제 : Argocd 에서 DELETE

 

- CLI vs UI 확인 https://argorollouts.<각자 자신의 도메인>/rollouts/default

 

- Updating a Rollout

#
watch -d kubectl get pod -n argocd -l app=rollouts-demo -owide --show-labels

# Run the following command to update the rollouts-demo Rollout with the "yellow" version of the container:
kubectl argo rollouts set image rollouts-demo rollouts-demo=argoproj/rollouts-demo:yellow

- Aborting a Rollout

# 
kubectl argo rollouts set image rollouts-demo rollouts-demo=argoproj/rollouts-demo:red

#
kubectl argo rollouts abort rollouts-demo

#
kubectl argo rollouts set image rollouts-demo rollouts-demo=argoproj/rollouts-demo:yellow

 

 

- 실습 완료 후 리소스 삭제

  • EKS 클러스터 삭제
eksctl delete cluster --name $CLUSTER_NAME && aws cloudformation delete-stack --stack-name $CLUSTER_NAME

 

 

#스터디 후기

이번 EKS CI/CD 스터디에서는 Amazon의 EKS(Elastic Kubernetes Service) 내에서 CI/CD(지속적 통합/지속적 배포) 방식의 구현을 자세히 살펴봤습니다. CI/CD에서 코드 변경 사항을 공유 저장소에  통합한 다음 해당 변경 사항을 프로덕션 환경(CD)에 자동으로 배포하는 방법론등을 배웠습니다. 이 과정에서 jenkins , argocd 등을 이용한 툴을 학습하였고, 애플리케이션의 배포, 확장 및 관리를 더욱 용이하게 할 수 있었습니다.

'EKS Study' 카테고리의 다른 글

8주차 - EKS IaC  (0) 2024.04.21
6주차 - EKS Security  (0) 2024.04.13
5주차 - EKS Autoscaling  (0) 2024.04.07
4주차 - EKS Observability  (1) 2024.03.24
3주차 - EKS Storage & Nodegroup  (1) 2024.03.17