EKS 애플리케이션 CI/CD 구성

2023. 9. 4. 20:21DevOps/Jenkins

 

 

버전 정보
AWS EKS (Kubernetes: 1.26)
argocd: (Image: quay.io/argoproj/argocd:v2.7.0,, helm.sh/chart=argo-cd-5.30.0 )
jenkins: 2.401.1
 

1. ECR Repository 생성

user-service repository 생성

order-service repository 생성

item-service repository 생성


2. CI/CD 구성에 필요한 것들...

EKS 클러스터 생성 및 네트워크 리소스 생성 필요 (링크 참조)

Jenkins 서버용 VM


3. 네임스페이스 생성

kubectl create ns app
 

4. CI/CD 구성

AWS ECR Access Key / Secret Access Key 발급

[권장X but 설정 간편] AWS Console > 계정 ID > 보안 자격 증명 > Access Token 발급
혹은
[권장 but 권한 설정이 복잡함] IAM 사용자 액세스 토큰 발급
 

4-1. Github Access Token 발급 & WebHook 설정

- Github 프로필 > Settings > Developer Setting > Personal Access Token > Token(Classic) > Generate new Token > repo 권한 + write 권한 부여 > 생성 > 토큰값 복사

이때 토큰값은 한번만 나타나기 때문에 생성하고 바로 복사하는게 중요하다!

- Repository 설정 > Settings > Webhooks > PayloadURL

Jenkins Plugin 설치

  • Docker 설치
  • Jenkins Plugin 설치
    • Amazon ECR 설치
    • Docker Pipeline 설치
  • Jenkins 재시작

4-2. Credential 설정

  • ECR Access Key / Secret Access Key

Jenkins 관리 > Credentials

Credential Kind에 AWS Credentials가 안 보인다면 Amazon ECR 플러그인이 잘 설치되었는지 확인

  • Github ID / Access Token 입력

Organization Repository라면 Organization에서 개인 Access Token을 사용하여 접근할 수 있는 권한 허용


4-3. Jenkins Pipeline 생성

  • 파이프라인 생성

Dashboard > New Item > Pipeline

  • Githuib Project - Project URL 입력
 

 

  • Trigger 설정

 

  • Pipeline 설정
 

코드 간단 설명


4-5. 젠킨스 파이프라인 실행을 위한 준비

  • 각종 Secret 처리

Github Access Token이나 레포지토리 URL 등의 경우 Jenkins Secret으로 등록하여 처리

아래는 Credential을 받아오는 Jenkinsfile 예시입니다.

REPOSITORY_CREDENTIAL_ID = credentials('GitCredential')
GIT_EMAIL = credentials('GitEmail')
GIT_USERNAME = credentials('GitUsername')

REPOSITORY_URL = credentials('UserServiceRepositoryUrl')
TARGET_BRANCH = 'master'

HELM_REPOSITORY_URL = credentials('HELM_REPOSITORY_URL')
HELM_TARGET_BRANCH = credentials('HELM_TARGET_BRANCH')

AWS_CREDENTIAL_NAME = credentials('AWSCredentials')
ECR_PATH = credentials('ecrPath')
IMAGE_NAME = 'user-service'
REGION = credentials('region')
 

 

  • Application Secret 처리
애플리케이션이 동작하기 위한 Secret 값들이 담겨있는 application.yml 파일을
Jenkins Credentials의 Secret File을 통해서 가지고 옵니다.
이때 해당 파일은 Jenkins Credentials 설정에서 Secret file 형태로 업로드해 줍니다.
 

프로젝트 코드에서 application.yml을 아래와 같이 입력해줍니다

  • 이미지 빌드 후 ECR 푸쉬를 위한 docker.sock 권한 설정

EC2에서는 jenkins가 기본적으로 docker.sock에 접근할 수 없기 때문에

jenkins 유저를 docker 그룹 안에 넣어주어서 실행 가능하게 권한을 설정해야 합니다.

 

sudo usermod -a -G docker jenkins
설정 후 docker, jenkins 재시작
 

 

  • Dockerfile 생성

이미지 배포 후에 쿠버네티스에서 애플리케이션을 실행하기 위한 Dockerfile을 작성

FROM openjdk:11
WORKDIR /app
COPY /build/libs/user-service-1.0.jar userSVC.jar
CMD ["java", "-jar", "/app/userSVC.jar"]
 

4-6. Argocd 구성

EKS 내에 ArgoCD 리소스 생성 및 권한 설정이 필요합니다.

ArgoCD가 배포하기 위한 애플리케이션 Helm 차트가 필요합니다.

  • Helm Chart Repository 연결

EKS 클러스터 내 ArgoCD UI에 접속 > Settings > Repository > CONNECT REPO

1. VIA HTTPS
2. Type: Git
3. Project: default
4. Repository URL 입력
5. Username & Password(ACCESS TOKEN) 입력
 
  • Application 생성(UI 사용)

Applications > New APP

1. Application Name
2. Project Name: default
3. SYNC POLICY: Automatic
  3-1. PRUNE RESOURCE, SELF HEAL CHECK
4. Repository URL: 아까 연결한 레포지토리 선택
5. Revision: HEAD(default)
6. Path: Repository 안의 특정 서비스의 Helm Chart 경로 선택(자동으로 디렉토리 감지하여 추천)
7. Cluster URL: 로컬 클러스터이기 때문에 default인 https://kubernetes.default.svc로 선택
8. Namespace: app namespace
 
  • 서비스 배포 확인
 

Jenkins / Helm / ArgoCD 배포 자동화 프로세스 체크리스트

  • Github 코드 수정 → Github Webhook → Jenkins 서버
  • Jenkins Pipeline 작동 → Github에서 Jenkinsfile을 인식하여 Pipeline 수행
  • Pipeline 동작
    • 환경 변수 설정
    • 애플리케이션 파트
    • 애플리케이션 빌드 워크스페이스 초기화
    • 애플리케이션 코드 Clone
    • 애플리케이션 Secret 복사
    • 애플리케이션 빌드
    • 이미지 빌드
  • 이미지 ECR에 업로드
  • Helm 차트 변경 파트
    • Helm 차트 워크스페이스 초기화
    • Helm 차트 코드 Clone
    • Helm 차트 변경
    • Github 설정
    • Github에 변경사항 Push
  • Argocd에서 Github 변경사항 감지
  • EKS에 변경사항 적용(apply)