[CJ Olivenetworks - Cloud Wave] CGV Fast Order 시스템 인프라 구축 3-2. [CI/CD] Github Action - Docker / ArgoCD
1. Github Action / Docker 를 활용한 CI
Github Action 을 사용해서 Docker Image를 자동 Build 및 Docker Hub에 Push 하는 모습
- 이전 포스팅에서 만들어 놓은 WEB / WAS 이미지를
Github Actions
와Docker
를 사용하여 CI 환경을 구축해보자.
이전 포스팅 바로 가기: [Httpd, Spring Boot, Aurora MySQL] 3 Tier Web Application - Github Actions, Docker
[Github Actions] Workflow File 작성하기
# Workflow 이름 지정
name:
on:
# 아래 명시된 Repository(조건) 에 Push 발생 시 Github Actions 작동
push:
paths:
- 'gooloom-was/**'
- 'gooloom-web/**'
branches: [ main ]
jobs:
deploy:
# Github Actions 가 실행될 환경(VM)을 설정
runs-on: ubuntu-latest
steps:
- name: 저장소 Checkout
uses: actions/checkout@v3
- name: Set up JDK 19
uses: actions/setup-java@v3
with:
java-version: '19'
distribution: 'oracle'
- name: 스프링부트 애플리케이션 빌드 # (1)
run: |
cd gooloom-was
sudo chmod +x gradlew
./gradlew build
shell:
bash
# Github 에 저장되어 있는 Variables(Secrets) 를 사용하여 암호화 된 변수를 통해 안전하게 Login.
- name: Docker Hub 로그인 # (2)
uses: docker/login-action@v2
with:
username: $
password: $
- name: 도커 이미지 빌드 # (3)
run: |
cd gooloom-was
docker build -t csm4903/gooloom-was:latest .
- name: Docker Hub 퍼블리시 # (4)
run: docker push csm4903/gooloom-was:latest
️📣 K8s 배포 시 주의 사항 📣
현재
latest
로 버전을 명시 하였으므로manifest file
옵션 중imagePullPolicy: "Always"
로 설정해주어야 항상 해당 이미지의 latest 버전을 새로 배포해준다.
또한, 이전에 작성한Dockerfile
은Github Repository
의 최상단(루트)에 존재해야 한다.
2. ArgoCD 를 활용하여 AWS EKS Cluster 에 자동 배포하기 - CD
본 진행 과정은 AWS EC2 로 생성된 Bastion server
에서 진행됩니다.
ArgoCD의 작동 모습
ArgoCD 설치
- 공식 홈페이지에서 제공하는 설치 방법이다.
$ kubectl create namespace argocd $ kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
- 설치 후 확인
$ kubectl get po -n argocd
- ArgoCD 초기 Admin 비밀번호 확인
$ kubectl get secret -n argocd argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d
- 위 비밀번호는 다음 Step 에서 사용되므로 복사해두자.
- [ArgoCD CLI] ArgoCD 초기 비밀번호 변경
a. ArgoCD Pod 에 직접 접근 후 Login
$ kubectl exec -it -n argocd deployment/argocd-server -- /bin/bash $ argocd login localhost:8080
- username : admin
- password : 이전 Step 에서 얻어낸 Admin password 입력.
b. ArgoCD CLI 를 사용해서 비밀번호 변경. (ArgocD Container 에 이미 CLI가 준비되어 있다.)
$ argocd account update-password
- 기존 Password 입력 후 새로운 Password 등록
- 현재 단계까지 진행하던 중 ArgoCD 의 접근 편리성을 위해 ALB 가 가장 처음 마주하는 첫번째 Private Subnet (WAS Cluster) 에 재설치 하였다.
- ArgoCD 로드 밸런서 생성하기 참고: velog@junsugi
- 설치한 ArgoCD 에 접속하기 위해
K8s 의 Ingress
를 통해 외부와 통신할 수 있도록 해준다.Ingress 란?
한 Namespace 안에 여러 개의 서비스들이 존재하고 서비스 내부에는 여러 개의 Pod 가 존재 할 수 있다.
이때, 외부에서 Ingress 의 라우팅을 이용, 원하는 서비스에 접근해서 실제 Application에 접근할 수 있도록 해주는 리소스 이다.
출처: 쿠버네티스 공식 홈페이지
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: alb.ingress.kubernetes.io/certificate-arn: <인증서 arn> alb.ingress.kubernetes.io/healthcheck-path: / alb.ingress.kubernetes.io/healthcheck-protocol: HTTP alb.ingress.kubernetes.io/listen-ports: '[{"HTTPS":443}, {"HTTP":80}]' alb.ingress.kubernetes.io/scheme: internet-facing alb.ingress.kubernetes.io/target-type: ip kubernetes.io/ingress.class: alb finalizers: - ingress.k8s.aws/resources labels: app: velog-test tier: backend name: argocd-ingress # 인그레스 이름 정하기 namespace: argocd # 설치할 네임스페이스 spec: rules: - http: paths: - backend: service: name: argocd-server # 연결할 서비스 (이부분은 고정) port: number: 80 # (이부분도 고정) path: /* pathType: ImplementationSpecific
- Ingress 생성을 위한 k8s manifest 파일.
- Yaml 파일을 보면
spec
아래service
부분에argocd-server
라는 부분이 적혀 있다.- 해당 서비스 내부에 ArgoCD 페이지가 존재.
- 우리는 해당 페이지 UI에 접근하기 위해 해당 서비스를 Ingress 에 연결 한 것.
- 위 파일을 .yaml 파일로 생성 후, 아래와 같이 argocd namespace 에 apply 하여 적용.
$ kubectl apply -f <ingress yaml 경로> -n argocd # 경로를 모르겠다면, 아래와 같이 실행 $ pwd /home.ex2-user/argocd/(yaml 이름).yaml $ kubectl apply -f (pwd에서 나온 yaml 파일 경로) -n argocd
$ kubectl get ing -A
- Ingress 를 위 명령어를 통해 조회해보면
ADDRESS
를 볼 수 있다.
- 설치한 ArgoCD 에 접속하기 위해
- EKS Cluster 보안 그룹에 ArgoCD 와 연결된 CLB의 트래픽 허용하기
- 위 경로에서 클러스터 보안그룹을 찾아 편집해주자.
- in-bound 규칙: 모든 트래픽 -> ArgoCD 보안 그룹
argocd-server
Service 편집하기$ kubectl edit service argocd-server -n argocd
- 가장 아래의 type : ClusterIP 부분을 LoadBalancer 로 수정
$ kubectl get svc -n argocd
- service 검색 후 ArgoCD-server 의 Type이
LoadBalancer
로 수정된 것을 확인. - 생성된 해당
External-IP
로 접속하면 접속 성공.
- 가장 아래의 type : ClusterIP 부분을 LoadBalancer 로 수정
- ArgoCD 접속 성공
- 이전에 생성한 ID / PW 를 사용해서 로그인 한다.
ArgoCD 와 Github Repository 연동
- ArgoCD 접속 -> settings -> Connect Repo
[ArgoCD] AWS EKS 환경에 Spring boot Web Application 배포하기
[사전 작업] Deployment 작성을 위한 WAS Application image의 성능 확인
- WAS 이미지를 Docker COntainer 에서 Running Test
- CPU : 약 30% 사용
- Memory : 약 5% 사용
- 위 사용량 테스트를 기준으로 Deployment.yaml 작성.
- 추후 Load Test (트래픽 부하 테스트) 를 통해 Pod 의 Spec을 더욱 상세하게 설정할 예정.
[ArgoCD] 3 Tier 구조 - EKS Cluster 두 개 (WEB/WAS) 에 각각 배포하기
- [ArgoCD CLI] ArgoCD 주소로 Login
$ argocd login (ArgoCD 주소)
kubectl get svc -n argocd
- External-IP 주소로 로그인
- [ArgoCD CLI] 하나의 ArgoCD server에 새로운 Cluser 추가하기
$ argocd cluster add <클러스터 arn>
- 위와 같이 클러스터 추가가 되면 성공.
[Trouble Shooting] exec plugin error : no valid apiVersion: v1alpha1
- 이번 프로젝트 진행 중 가장 많이 마주한 에러 중 하나이다.
- 결국은 버전 호환성 문제이다.
[해결]
- 루트 경로의
.kube/config
확인 후 각 Cluster 의apiVersion을 v1beta1
으로 변경.
- 뭔가 더 진행이 되긴 하나 결국 다시 에러.
- 뭔가 더 진행이 되긴 하나 결국 다시 에러.
aws eks update-kubeconfig --name (클러스터 이름)
- update 는 진행이 되나 에러 해결은 되지 않음.
- update 는 진행이 되나 에러 해결은 되지 않음.
- Github Community 에 따르면 aws cli2 사용시 관련 apiVersion 에러가 발생하지 않는다고 함.
aws cli2
로 upgrade 후 성공.- 이제 ArgoCD 가 두번째 WAS Cluster 도 관리하고 있다.
- 위와 같이 클러스터 추가가 되면 성공.
- [ArgoCD] 두 개의 EKS Cluster (WEB/WAS) 에 Application 배포.
- application name : ArgoCD 화면에서 뜰 application 의 이름 지정
- Project Name : 진행할 ArgoCD Project 선택
- Sync Policy : Automatic 선택 시 약 3분 간격으로 연결된 Github Repo의 변동 사항을 Checking.
- prune resource, self heal 둘 다 선택.
- Source : 배포할 K8s Manifest File이 있는 경로 설정
- Destination : 해당 K8s Manifest File을 배포할 EKS Cluster 설정.
- ArgoCD 와 정상적으로 Source 및 Destination 이 연결 되었을 시, 위처럼 약 3분 간격으로 Source의 변동 사항을 Checking 하게 된다.
- 만약 Source에 변동사항 발생 시 ArgoCD 는 해당 변동 사항을 WebHook.
- Destination 으로 설정된 Cluster 에 변동 사항을 적용하여 배포하게 된다.
배포 성공
CGV 프로젝트 전체 CI / CD 과정
- CI / CD Test 진행 전 초기 홈페이지의 모습.
- Title: “CICD Test”
CI
CI 전체 Flow
- Web Application 소스코드 추가/삭제/수정
- Git push
- Github Actions
Docker Build
Docker Push
CD
CD 전체 Flow
- CI 의 결과로 업그레이드 된 버전의 이미지를 K8s Manifest 에 적용 후 Git Push
Docker Image의 버전을 latest
로 설정했기 때문에ImagePullPolicy 를 Always
로 설정하여 매Pod가 뜰 때마다 Docker Hub에서 latest tag를 가진 이미지를 새로 다운
받도록 해준다.- ArgoCD 가 보고 있던 Git repo에 존재하는 K8s Manifest 파일의 변동 사항을 Web Hook 하여 EKS Cluster 에 배포.
- Github 에 Push 하게 되면 해당 repository를 보고 있던
ArgoCD가 Webhook 을 통해 k8s manifest 파일의 변경사항을 확인
하고 최신 이미지를모든 Pod에 Rolling Update 방식으로 무중단 배포
한다.
CI / CD 후 변동 사항에 대해 정상적으로 배포된 애플리케이션의 모습
CICD test -> Gooloom - CGV 로 Title이 변경되어 배포된 것을 볼 수 있다.
CI / CD 시연 영상 (배속)
[CJ Olivenetworks - Cloud Wave 1기] 활동 중 진행한 팀 프로젝트입니다.
무단 복제 및 게시는 삼가주시기 바랍니다.
Task Lists
- Github Action / Docker 를 활용한 CI
- Workflow File 작성하기
- ArgoCD 를 활용하여 AWS EKS Cluster 에 자동 배포하기 - CD
- ArgoCD 설치
- ArgoCD 와 Github Repository 연동
- AWS EKS 환경에 Spring boot Web Application 배포하기
- Deployment 작성을 위한 WAS Application image의 성능 확인
- 3 Tier 구조 - EKS Cluster 두 개 (WEB/WAS) 에 각각 배포하기
- CGV 프로젝트 전체 CI / CD 과정
- CI / CD 시연 영상 (배속)
Comments