1. Jenkins
젠킨스(Jenkins)는 지속적 통합(Continuous Integration, CI) 및 지속적 배포(Continuous Deployment, CD)를 지원하는 오픈 소스 자동화 도구입니다. 주요 특징은 다음과 같습니다:
- 자동화된 빌드: 소스 코드가 변경될 때마다 자동으로 빌드를 실행하여 테스트를 수행하고 결과를 제공합니다.
- 지속적 통합: 개발자들이 작성한 코드가 주기적으로 통합되고 테스트되며, 버그를 빠르게 발견하여 해결할 수 있도록 지원합니다.
- 지속적 배포: 빌드된 애플리케이션을 자동으로 테스트 및 프로덕션 환경으로 배포하여 개발과 운영 간의 간극을 줄입니다.
- 확장성: 풍부한 플러그인 생태계를 통해 다양한 개발 스택 및 툴과의 통합이 가능합니다.
- 유연성: 다양한 작업을 파이프라인으로 구성하여 복잡한 개발 및 배포 프로세스를 자동화할 수 있습니다.
- 보안 및 권한 관리: 프로젝트 및 사용자에 대한 접근 제어를 통해 보안을 강화하고 규정 준수를 유지할 수 있습니다.
젠킨스는 개발 및 배포 프로세스를 자동화하여 개발자들이 빠르게 안정적인 소프트웨어를 제공할 수 있도록 돕는 강력한 도구입니다.

Jenkins 설치
Jenkins 설치를 위해서는 JDK가 사전에 설치되어야 합니다. JDK를 설치하고 JAVA_HOME 환경변수를 지정해 줍니다.
# 실습 편리를 위해서 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" }'
Jenkins 파이프라인
샘플 코드 파이프라인
파이프라인을 생성하고 sample 파이프라인 스크립트를 작성하고 실행결과를 확인합니다.




파이프라인 - trigger(cron)
1분마다 반복하는 파이프라인을 작성합니다. 1분마다 명령어를 파이프라인이 실행됨을 확인할 수 있습니다.
pipeline {
agent any
triggers {
cron('* * * * *')
}
stages {
stage('주기 반복') {
steps {
echo 'Hello World'
}
}
}
}

파이프라인 - Tools
빌드에 필요한 maven, gradle, jdk와 같은 다양한 툴 들을 등록하고 사용할 수 있습니다.
먼저, Java 애플리케이션을 빌드한다고 가정하고 JDK, Maven을 Tools에 등록해 보겠습니다.
- 1. Dashboard > Jenkins 관리 > Tools 메뉴에 들어갑니다.
- 2. Name 에는 등록한 도구의 이름을 작성합니다. 파이프라인에서 사용하는 이름이므로 주의합니다.
- 3. 이전에 Jenkins를 위해 설치해 놓은 JDK의 경로를 등록합니다.

Maven은 설치되어 있지 않기 때문에 Install automatically 옵션을 체크하여 설치합니다. 젠킨스는 다양한 설치방식을 지원합니다.

설정한 Tools를 사용할 수 있도록 파이프라인 스크립트를 작성하고, 설정한 버전을 확인하는 명령어로, 간단하게 명령어를 사용할 수 있는지를 확인합니다.
pipeline {
agent any
tools {
jdk "jdk-17"
maven "maven-3.6.9"
}
stages {
stage('Hello') {
steps {
sh'''
export JAVA_HOME=/usr/lib/jvm/java-17-amazon-corretto.x86_64
mvn --version
java --version
'''
}
}
}
}

파이프라인 - 파라미터와 함께 빌드
파이프라인을 사용하다 보면 입력값(파라미터)을 활용이 필요한 경우가 있습니다. 젠킨스는 파라머티와 함께 빌드할 수 있는 기능을 제공합니다. 파라미터가 추가된 파이프라 스크립트를 작성하고 결과를 확인합니다.
pipeline {
agent any
parameters {
string(name: 'PERSON', defaultValue: 'JSP', description: 'Who are you?')
choice(name: 'CHOICE', choices: ['One', 'Two', 'Three'], description: 'Pick something')
}
stages {
stage('파라미터 사용') {
steps {
echo "Hello ${params.PERSON}"
echo "Choice: ${params.CHOICE}"
}
}
}
}


파이프라인 - 디플로이먼트/서비스 배포(EKS)
EKS에 컨테이너 이미지를 빌드하고, 디플로이먼트와 서비스를 배포하는 파이프라인을 생성합니다.
파이프라인을 작성합니다.
- DOCKEHUB_USERNAME : 도커허브에서 사용하는 유저명을 작성합니다.
- GITHUB_URL : 배포할 매니페스트 파일이 존재하는 GITHUB 저장소 URL입니다.
pipeline {
agent any
tools {
jdk 'jdk-17'
}
environment {
DOCKERHUB_USERNAME = 'hackjap'
GITHUB_URL = 'https://github.com/hackjap/aews-cicd.git'
// deployment-svc.yaml -> image: hackjap/myweb:v1.0.0
DIR_NUM = '3'
}
stages {
stage('Container Build') {
steps {
// 릴리즈파일 체크아웃
checkout scmGit(branches: [[name: '*/main']],
extensions: [[$class: 'SparseCheckoutPaths',
sparseCheckoutPaths: [[path: "/${DIR_NUM}"]]]],
userRemoteConfigs: [[url: "${GITHUB_URL}"]])
// 컨테이너 빌드 및 업로드
sh "docker build -t ${DOCKERHUB_USERNAME}/myweb:v1.0.0 ./${DIR_NUM}"
sh "docker push ${DOCKERHUB_USERNAME}/myweb:v1.0.0"
}
}
stage('K8S Deploy') {
steps {
sh "kubectl apply -f ./${DIR_NUM}/deploy/deployment-svc.yaml"
sh "sleep 5"
sh "kubectl get pod"
}
}
}
}
젠킨스에서 EKS로 kubectl을 사용할 수 있도록 Jenkins 계정에서 AWS 인증을 하고 EKS의 kubeconfig 파일을 생성합니다.
# 젠킨스 계정접속
su - jenkins
# aws cli 인증
aws configure
AWS Access Key ID [None]: AKIA*******
AWS Secret Access Key [None]: 54wI4**********
Default region name [None]: ap-northeast-2
Default output format [None]: json
# kubeconfig 파일 생성
aws eks update-kubeconfig --region ap-northeast-2 --name myeks
파이프라인을 생성하고 결과를 확인합니다.

2. ArgoCD
ArgoCD는 Kubernetes 상에서 CD(Continuous Deployment)를 제공하는 오픈 소스 도구입니다. 주요 특징은 다음과 같습니다:
- 선언적 배포: GitOps 패러다임에 따라 배포 상태를 Git 리포지토리에 선언적으로 정의합니다. 이를 통해 배포 프로세스를 추적하고 롤백 및 복구를 수행할 수 있습니다.
- 자동화된 배포: Git 리포지토리에 정의된 애플리케이션 및 인프라 구성을 기반으로 자동으로 Kubernetes 클러스터에 배포합니다.
- 상태 동기화: 실제 배포된 상태와 Git 리포지토리에 정의된 상태를 동기화하여 불일치를 감지하고 조치합니다.
- 롤백 및 복구: 이전 버전으로의 롤백 및 문제가 발생했을 때의 자동 복구 기능을 제공하여 안정성을 향상합니다.
- 다양한 환경 관리: 여러 환경(개발, 스테이징, 프로덕션 등)에 대한 배포를 관리하고 각각에 대한 독립적인 설정을 지원합니다.
- 강력한 UI 및 CLI: 직관적인 웹 인터페이스 및 명령줄 인터페이스를 통해 애플리케이션 및 배포를 관리할 수 있습니다.
ArgoCD는 Kubernetes 상에서 CI/CD 파이프라인을 구축하고 운영하는 데 도움을 주며, 신속하고 안정적인 애플리케이션 배포를 가능하게 합니다. GitOps 워크플로우를 통해 애플리케이션 배포를 투명하게 추적하고 관리할 수 있습니다.

ArgoCD 설치
ArgoCD Helm Chart를 통해 ArgoCD를 배포합니다.
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
ArgoCD Application
ArgoCD에서의 Application은 Kubernetes 클러스터 내의 애플리케이션 배포를 관리하는 데 사용되는 주요 개념입니다.
Application 배포 - Argo CD UI
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
- Repository URL : https://github.com/gasida/aews-cicd.git
- Revision : main
- Path : 3/deploy
- DESTINATION
- Cluster URL : https://kubernetes.default.svc
- Namespace : first
- [선택] Directory ← 소스를 보고 자동으로 유형 선택됨
- 화면 상단 [CREATE] 클릭


배포하기 - [SYNC] 클릭 > [SYNCHRONIZE] 클릭
- PRUNE : GIt에서 자원 삭제 후 배포 시 K8S에서는 삭제되지 않으나, 해당 옵션을 선택하면 삭제시킴
- FORCE : --force 옵션으로 리소스 삭제
- APPLY ONLY : ArgoCD의 Pre/Post Hook은 사용 안 함 (리소스만 배포)
- DRY RUN : 테스트 배포 (배포에 에러가 있는지 한번 확인해 볼 때 사용)


Application 배포 - Argo CD CLI
먼저, ArgoCD CLI 설치합니다. ArgoCD 로그인과 클러스터를 연결하고 argocd app list 명령어가 잘 동작하는지 확인합니다.
curl -sSL -o argocd-linux-amd64 https://github.com/argoproj/argo-cd/releases/latest/download/argocd-linux-amd64
sudo install -m 555 argocd-linux-amd64 /usr/local/bin/argocd
rm -f argocd-linux-amd64
#
argocd version
#
argocd login argocd.$MyDomain
Username: admin
Password: ###
'admin:login' logged in successfully
#
kubectl config get-contexts -o name
admin@myeks.ap-northeast-2.eksctl.io
argocd cluster add admin@myeks.ap-northeast-2.eksctl.io
y 입력
#
argocd app list
NAME CLUSTER NAMESPACE PROJECT STATUS HEALTH SYNCPOLICY CONDITIONS REPO PATH TARGET
argocd app create 명령어를 통해 Application 생성합니다. UI 상에서도 잘 생성됨을 확인할 수 있습니다.
kubectl config set-context --current --namespace=argocd
argocd app create guestbook --repo https://github.com/argoproj/argocd-example-apps.git --path guestbook --dest-server https://kubernetes.default.svc --dest-namespace default
#
argocd app list
NAME CLUSTER NAMESPACE PROJECT STATUS HEALTH SYNCPOLICY CONDITIONS REPO PATH TARGET
argocd/guestbook https://kubernetes.default.svc default default OutOfSync Missing <none> <none> https://github.com/argoproj/argocd-example-apps.git guestbook

argocd app sync 명령어로 app을 배포합니다.
argocd app get guestbook
...
#
argocd app sync guestbook
Application 배포 - Declarative
ArgoCD는 선언적(Declarative) 방식을 제공합니다. Manifest파일을 통해서 ArgoCD 리소스를 배포할 수 있습니다.
ArgoCD Application Yaml파일을 작성하고 배포합니다.
# declarative-myweb.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: declarative-myweb
namespace: argocd
spec:
destination:
namespace: first
server: https://kubernetes.default.svc
project: default
source:
path: 3/deploy
repoURL: https://github.com/hackjap/aews-cicd.git
targetRevision: HEAD
syncPolicy:
syncOptions:
- CreateNamespace=true
kubectl apply -f declarative-myweb.yaml
UI에서 동일하게 잘 생성됨을 확인할 수 있습니다.


3. Argo Rollouts
Argo Rollouts는 Kubernetes 상에서 롤링 업데이트와 롤백을 관리하기 위한 Argo 프로젝트의 오픈 소스 도구입니다.
Argo Rollouts의 주요 특징은 다음과 같습니다.
- 롤링 업데이트: 새로운 버전의 애플리케이션을 배포할 때, 이전 버전과 새로운 버전을 점진적으로 교체하여 서비스의 중단 없이 업데이트를 수행합니다.
- 카나리 배포: 새로운 버전을 일부 사용자 또는 특정 환경에 먼저 배포하여 안정성을 평가하는 카나리아 배포 전략을 지원합니다.
- 블루-그린 배포: 새로운 버전의 애플리케이션을 배포한 후, 트래픽을 이전 버전에서 새로운 버전으로 전환하는 블루-그린 배포 전략을 지원합니다.
- 자동 롤백: 롤아웃 중 문제가 발생할 경우 자동으로 이전 버전으로의 롤백을 수행하여 안정성을 회복할 수 있습니다.
- 멀티-캔너리 배포: 다수의 버전을 동시에 관리하고, 사용자 정의 조건에 따라 각 버전의 트래픽을 분배할 수 있습니다.
- Promote와 롤백 전략: 다양한 프로모션과 롤백 전략을 사용하여 애플리케이션의 배포를 유연하게 관리할 수 있습니다.

Argo Rollouts 설치
ArgoCD Rollouts helm chart로 배포합니다. 실습을 위해 제공하는 dashboard를 활성화합니다.
cat <<EOT > argorollouts-values.yaml
dashboard:
enabled: true
ingress:
enabled: true
ingressClassName: alb
hosts:
- argorollouts.$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'
EOT
kubectl create ns argo-rollouts
helm install argo-rollouts argo/argo-rollouts --version 2.35.1 -f argorollouts-values.yaml --namespace argo-rollouts
# 확인
kubectl get all -n argo-rollouts
kubectl get crd | grep argo
# rollout dashboard 접속
https://argorollouts.<자신의 도메인>/rollouts/
Rollout CLI 설치
Argo Rollouts 역시 CLI를 통해 기능을 사용할 수 있습니다. Argo 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
Rollout 배포
Demo Rollout을 배포합니다. 배포 전략은 canary이고, setWeight를 통해 가중치를 설정합니다.
# Run the following command to deploy the initial Rollout and Service:
kubectl apply -f https://raw.githubusercontent.com/argoproj/argo-rollouts/master/docs/getting-started/basic/rollout.yaml
kubectl apply -f https://raw.githubusercontent.com/argoproj/argo-rollouts/master/docs/getting-started/basic/service.yaml

Rollout 대시보드를 통해 확인합니다. 각 스텝을 보기 좋게 한눈에 확인할 수 있습니다.


Rollout CLI을 통해서도 확인해 봅니다.

pause 상태의 시간을 정해두지 않을 경우, 아래와 같이 멈추어있게 되는데, 상단에 Promete / PromoteFull 버튼을 눌러 진행할 수 있습니다.


'AWS > EKS' 카테고리의 다른 글
EKS 설치 및 클러스터 엔드포인트(EKS Cluster Endpoint) (2) | 2025.02.09 |
---|---|
EKS IaC(Terraform) - AEWS 8주차 (1) | 2024.04.28 |
EKS 보안(Security) - AEWS 6주차 (1) | 2024.04.14 |
EKS 오토스케일링(Autoscaling) - AEWS 5주차 (0) | 2024.04.07 |
EKS 옵저버빌리티(Obsivability) - AEWS 4주차 (0) | 2024.03.31 |
1. Jenkins
젠킨스(Jenkins)는 지속적 통합(Continuous Integration, CI) 및 지속적 배포(Continuous Deployment, CD)를 지원하는 오픈 소스 자동화 도구입니다. 주요 특징은 다음과 같습니다:
- 자동화된 빌드: 소스 코드가 변경될 때마다 자동으로 빌드를 실행하여 테스트를 수행하고 결과를 제공합니다.
- 지속적 통합: 개발자들이 작성한 코드가 주기적으로 통합되고 테스트되며, 버그를 빠르게 발견하여 해결할 수 있도록 지원합니다.
- 지속적 배포: 빌드된 애플리케이션을 자동으로 테스트 및 프로덕션 환경으로 배포하여 개발과 운영 간의 간극을 줄입니다.
- 확장성: 풍부한 플러그인 생태계를 통해 다양한 개발 스택 및 툴과의 통합이 가능합니다.
- 유연성: 다양한 작업을 파이프라인으로 구성하여 복잡한 개발 및 배포 프로세스를 자동화할 수 있습니다.
- 보안 및 권한 관리: 프로젝트 및 사용자에 대한 접근 제어를 통해 보안을 강화하고 규정 준수를 유지할 수 있습니다.
젠킨스는 개발 및 배포 프로세스를 자동화하여 개발자들이 빠르게 안정적인 소프트웨어를 제공할 수 있도록 돕는 강력한 도구입니다.

Jenkins 설치
Jenkins 설치를 위해서는 JDK가 사전에 설치되어야 합니다. JDK를 설치하고 JAVA_HOME 환경변수를 지정해 줍니다.
# 실습 편리를 위해서 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" }'
Jenkins 파이프라인
샘플 코드 파이프라인
파이프라인을 생성하고 sample 파이프라인 스크립트를 작성하고 실행결과를 확인합니다.




파이프라인 - trigger(cron)
1분마다 반복하는 파이프라인을 작성합니다. 1분마다 명령어를 파이프라인이 실행됨을 확인할 수 있습니다.
pipeline {
agent any
triggers {
cron('* * * * *')
}
stages {
stage('주기 반복') {
steps {
echo 'Hello World'
}
}
}
}

파이프라인 - Tools
빌드에 필요한 maven, gradle, jdk와 같은 다양한 툴 들을 등록하고 사용할 수 있습니다.
먼저, Java 애플리케이션을 빌드한다고 가정하고 JDK, Maven을 Tools에 등록해 보겠습니다.
- 1. Dashboard > Jenkins 관리 > Tools 메뉴에 들어갑니다.
- 2. Name 에는 등록한 도구의 이름을 작성합니다. 파이프라인에서 사용하는 이름이므로 주의합니다.
- 3. 이전에 Jenkins를 위해 설치해 놓은 JDK의 경로를 등록합니다.

Maven은 설치되어 있지 않기 때문에 Install automatically 옵션을 체크하여 설치합니다. 젠킨스는 다양한 설치방식을 지원합니다.

설정한 Tools를 사용할 수 있도록 파이프라인 스크립트를 작성하고, 설정한 버전을 확인하는 명령어로, 간단하게 명령어를 사용할 수 있는지를 확인합니다.
pipeline {
agent any
tools {
jdk "jdk-17"
maven "maven-3.6.9"
}
stages {
stage('Hello') {
steps {
sh'''
export JAVA_HOME=/usr/lib/jvm/java-17-amazon-corretto.x86_64
mvn --version
java --version
'''
}
}
}
}

파이프라인 - 파라미터와 함께 빌드
파이프라인을 사용하다 보면 입력값(파라미터)을 활용이 필요한 경우가 있습니다. 젠킨스는 파라머티와 함께 빌드할 수 있는 기능을 제공합니다. 파라미터가 추가된 파이프라 스크립트를 작성하고 결과를 확인합니다.
pipeline {
agent any
parameters {
string(name: 'PERSON', defaultValue: 'JSP', description: 'Who are you?')
choice(name: 'CHOICE', choices: ['One', 'Two', 'Three'], description: 'Pick something')
}
stages {
stage('파라미터 사용') {
steps {
echo "Hello ${params.PERSON}"
echo "Choice: ${params.CHOICE}"
}
}
}
}


파이프라인 - 디플로이먼트/서비스 배포(EKS)
EKS에 컨테이너 이미지를 빌드하고, 디플로이먼트와 서비스를 배포하는 파이프라인을 생성합니다.
파이프라인을 작성합니다.
- DOCKEHUB_USERNAME : 도커허브에서 사용하는 유저명을 작성합니다.
- GITHUB_URL : 배포할 매니페스트 파일이 존재하는 GITHUB 저장소 URL입니다.
pipeline {
agent any
tools {
jdk 'jdk-17'
}
environment {
DOCKERHUB_USERNAME = 'hackjap'
GITHUB_URL = 'https://github.com/hackjap/aews-cicd.git'
// deployment-svc.yaml -> image: hackjap/myweb:v1.0.0
DIR_NUM = '3'
}
stages {
stage('Container Build') {
steps {
// 릴리즈파일 체크아웃
checkout scmGit(branches: [[name: '*/main']],
extensions: [[$class: 'SparseCheckoutPaths',
sparseCheckoutPaths: [[path: "/${DIR_NUM}"]]]],
userRemoteConfigs: [[url: "${GITHUB_URL}"]])
// 컨테이너 빌드 및 업로드
sh "docker build -t ${DOCKERHUB_USERNAME}/myweb:v1.0.0 ./${DIR_NUM}"
sh "docker push ${DOCKERHUB_USERNAME}/myweb:v1.0.0"
}
}
stage('K8S Deploy') {
steps {
sh "kubectl apply -f ./${DIR_NUM}/deploy/deployment-svc.yaml"
sh "sleep 5"
sh "kubectl get pod"
}
}
}
}
젠킨스에서 EKS로 kubectl을 사용할 수 있도록 Jenkins 계정에서 AWS 인증을 하고 EKS의 kubeconfig 파일을 생성합니다.
# 젠킨스 계정접속
su - jenkins
# aws cli 인증
aws configure
AWS Access Key ID [None]: AKIA*******
AWS Secret Access Key [None]: 54wI4**********
Default region name [None]: ap-northeast-2
Default output format [None]: json
# kubeconfig 파일 생성
aws eks update-kubeconfig --region ap-northeast-2 --name myeks
파이프라인을 생성하고 결과를 확인합니다.

2. ArgoCD
ArgoCD는 Kubernetes 상에서 CD(Continuous Deployment)를 제공하는 오픈 소스 도구입니다. 주요 특징은 다음과 같습니다:
- 선언적 배포: GitOps 패러다임에 따라 배포 상태를 Git 리포지토리에 선언적으로 정의합니다. 이를 통해 배포 프로세스를 추적하고 롤백 및 복구를 수행할 수 있습니다.
- 자동화된 배포: Git 리포지토리에 정의된 애플리케이션 및 인프라 구성을 기반으로 자동으로 Kubernetes 클러스터에 배포합니다.
- 상태 동기화: 실제 배포된 상태와 Git 리포지토리에 정의된 상태를 동기화하여 불일치를 감지하고 조치합니다.
- 롤백 및 복구: 이전 버전으로의 롤백 및 문제가 발생했을 때의 자동 복구 기능을 제공하여 안정성을 향상합니다.
- 다양한 환경 관리: 여러 환경(개발, 스테이징, 프로덕션 등)에 대한 배포를 관리하고 각각에 대한 독립적인 설정을 지원합니다.
- 강력한 UI 및 CLI: 직관적인 웹 인터페이스 및 명령줄 인터페이스를 통해 애플리케이션 및 배포를 관리할 수 있습니다.
ArgoCD는 Kubernetes 상에서 CI/CD 파이프라인을 구축하고 운영하는 데 도움을 주며, 신속하고 안정적인 애플리케이션 배포를 가능하게 합니다. GitOps 워크플로우를 통해 애플리케이션 배포를 투명하게 추적하고 관리할 수 있습니다.

ArgoCD 설치
ArgoCD Helm Chart를 통해 ArgoCD를 배포합니다.
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
ArgoCD Application
ArgoCD에서의 Application은 Kubernetes 클러스터 내의 애플리케이션 배포를 관리하는 데 사용되는 주요 개념입니다.
Application 배포 - Argo CD UI
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
- Repository URL : https://github.com/gasida/aews-cicd.git
- Revision : main
- Path : 3/deploy
- DESTINATION
- Cluster URL : https://kubernetes.default.svc
- Namespace : first
- [선택] Directory ← 소스를 보고 자동으로 유형 선택됨
- 화면 상단 [CREATE] 클릭


배포하기 - [SYNC] 클릭 > [SYNCHRONIZE] 클릭
- PRUNE : GIt에서 자원 삭제 후 배포 시 K8S에서는 삭제되지 않으나, 해당 옵션을 선택하면 삭제시킴
- FORCE : --force 옵션으로 리소스 삭제
- APPLY ONLY : ArgoCD의 Pre/Post Hook은 사용 안 함 (리소스만 배포)
- DRY RUN : 테스트 배포 (배포에 에러가 있는지 한번 확인해 볼 때 사용)


Application 배포 - Argo CD CLI
먼저, ArgoCD CLI 설치합니다. ArgoCD 로그인과 클러스터를 연결하고 argocd app list 명령어가 잘 동작하는지 확인합니다.
curl -sSL -o argocd-linux-amd64 https://github.com/argoproj/argo-cd/releases/latest/download/argocd-linux-amd64
sudo install -m 555 argocd-linux-amd64 /usr/local/bin/argocd
rm -f argocd-linux-amd64
#
argocd version
#
argocd login argocd.$MyDomain
Username: admin
Password: ###
'admin:login' logged in successfully
#
kubectl config get-contexts -o name
admin@myeks.ap-northeast-2.eksctl.io
argocd cluster add admin@myeks.ap-northeast-2.eksctl.io
y 입력
#
argocd app list
NAME CLUSTER NAMESPACE PROJECT STATUS HEALTH SYNCPOLICY CONDITIONS REPO PATH TARGET
argocd app create 명령어를 통해 Application 생성합니다. UI 상에서도 잘 생성됨을 확인할 수 있습니다.
kubectl config set-context --current --namespace=argocd
argocd app create guestbook --repo https://github.com/argoproj/argocd-example-apps.git --path guestbook --dest-server https://kubernetes.default.svc --dest-namespace default
#
argocd app list
NAME CLUSTER NAMESPACE PROJECT STATUS HEALTH SYNCPOLICY CONDITIONS REPO PATH TARGET
argocd/guestbook https://kubernetes.default.svc default default OutOfSync Missing <none> <none> https://github.com/argoproj/argocd-example-apps.git guestbook

argocd app sync 명령어로 app을 배포합니다.
argocd app get guestbook
...
#
argocd app sync guestbook
Application 배포 - Declarative
ArgoCD는 선언적(Declarative) 방식을 제공합니다. Manifest파일을 통해서 ArgoCD 리소스를 배포할 수 있습니다.
ArgoCD Application Yaml파일을 작성하고 배포합니다.
# declarative-myweb.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: declarative-myweb
namespace: argocd
spec:
destination:
namespace: first
server: https://kubernetes.default.svc
project: default
source:
path: 3/deploy
repoURL: https://github.com/hackjap/aews-cicd.git
targetRevision: HEAD
syncPolicy:
syncOptions:
- CreateNamespace=true
kubectl apply -f declarative-myweb.yaml
UI에서 동일하게 잘 생성됨을 확인할 수 있습니다.


3. Argo Rollouts
Argo Rollouts는 Kubernetes 상에서 롤링 업데이트와 롤백을 관리하기 위한 Argo 프로젝트의 오픈 소스 도구입니다.
Argo Rollouts의 주요 특징은 다음과 같습니다.
- 롤링 업데이트: 새로운 버전의 애플리케이션을 배포할 때, 이전 버전과 새로운 버전을 점진적으로 교체하여 서비스의 중단 없이 업데이트를 수행합니다.
- 카나리 배포: 새로운 버전을 일부 사용자 또는 특정 환경에 먼저 배포하여 안정성을 평가하는 카나리아 배포 전략을 지원합니다.
- 블루-그린 배포: 새로운 버전의 애플리케이션을 배포한 후, 트래픽을 이전 버전에서 새로운 버전으로 전환하는 블루-그린 배포 전략을 지원합니다.
- 자동 롤백: 롤아웃 중 문제가 발생할 경우 자동으로 이전 버전으로의 롤백을 수행하여 안정성을 회복할 수 있습니다.
- 멀티-캔너리 배포: 다수의 버전을 동시에 관리하고, 사용자 정의 조건에 따라 각 버전의 트래픽을 분배할 수 있습니다.
- Promote와 롤백 전략: 다양한 프로모션과 롤백 전략을 사용하여 애플리케이션의 배포를 유연하게 관리할 수 있습니다.

Argo Rollouts 설치
ArgoCD Rollouts helm chart로 배포합니다. 실습을 위해 제공하는 dashboard를 활성화합니다.
cat <<EOT > argorollouts-values.yaml
dashboard:
enabled: true
ingress:
enabled: true
ingressClassName: alb
hosts:
- argorollouts.$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'
EOT
kubectl create ns argo-rollouts
helm install argo-rollouts argo/argo-rollouts --version 2.35.1 -f argorollouts-values.yaml --namespace argo-rollouts
# 확인
kubectl get all -n argo-rollouts
kubectl get crd | grep argo
# rollout dashboard 접속
https://argorollouts.<자신의 도메인>/rollouts/
Rollout CLI 설치
Argo Rollouts 역시 CLI를 통해 기능을 사용할 수 있습니다. Argo 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
Rollout 배포
Demo Rollout을 배포합니다. 배포 전략은 canary이고, setWeight를 통해 가중치를 설정합니다.
# Run the following command to deploy the initial Rollout and Service:
kubectl apply -f https://raw.githubusercontent.com/argoproj/argo-rollouts/master/docs/getting-started/basic/rollout.yaml
kubectl apply -f https://raw.githubusercontent.com/argoproj/argo-rollouts/master/docs/getting-started/basic/service.yaml

Rollout 대시보드를 통해 확인합니다. 각 스텝을 보기 좋게 한눈에 확인할 수 있습니다.


Rollout CLI을 통해서도 확인해 봅니다.

pause 상태의 시간을 정해두지 않을 경우, 아래와 같이 멈추어있게 되는데, 상단에 Promete / PromoteFull 버튼을 눌러 진행할 수 있습니다.


'AWS > EKS' 카테고리의 다른 글
EKS 설치 및 클러스터 엔드포인트(EKS Cluster Endpoint) (2) | 2025.02.09 |
---|---|
EKS IaC(Terraform) - AEWS 8주차 (1) | 2024.04.28 |
EKS 보안(Security) - AEWS 6주차 (1) | 2024.04.14 |
EKS 오토스케일링(Autoscaling) - AEWS 5주차 (0) | 2024.04.07 |
EKS 옵저버빌리티(Obsivability) - AEWS 4주차 (0) | 2024.03.31 |