이번 실습에서는 Github Action과 ArgoCD를 활용하여 CI/CD 파이프라인을 아래와 같이 구성하는 실습을 진행하도록 하겠습니다.
Continuous Integration with Github Action
두 개의 git repo; application, k8s manifest 생성
실습을 위해서는 다음 두 개의 Github 레파지토리가 필요합니다.
front-app-repo: 애플리케이션 소스가 위치한 레파지토리
k8s-manifest-repo: K8S 관련 메니페스트가 위치한 레파지토리
front-app-repo 라는 이름으로 애플리케이션 레파지토리를 생성합니다.
k8s-manifest-repo 라는 이름으로 github 레파지토리를 생성 합니다. 이 레파지토리는 kubernetes manifests 들을 저장하는 레파지토리입니다.
User profile > Settings > Developer settings > Personal access tokens 탭의 Tokens (classic)을 클릭합니다. 그리고 우측 상단에 위치한 Generate new token을 선택 합니다. Note 에 test-eks-workshop 라고 입력 하고 Select scopes 에서 repo, workflow 를 선택 합니다. 그리고 화면 아래에서 Generate token 을 클릭 합니다.
그리고 화면에 출력되는 token 값을 복사한 후 기록해둡니다.
Cloud9 터미널로 돌아가 환경변수가 제대로 설정되어있는지 확인하고, 설정되어있지 않다면 실습 환경에 맞게 설정합니다.
push 과정에서 필요한 username은 github username, password는 위에서 복사한 token 값을 입력합니다.
만약 push 과정에서, username, password 를 매번 넣어야 하는 상황이 번거롭다면 아래와 같이 cache 설정을 통해 지정 된 시간(기본 15분) 동안 cache 기반으로 로그인 가능 합니다. 이 때 아래의 USERNAME 및 EMAIL 값은 실습자의 환경에 맞게 수정하여 입력합니다.
gitconfig--globaluser.nameUSERNAMEgitconfig--globaluser.emailEMAILgitconfigcredential.helperstoregitconfig--globalcredential.helper'cache --timeout TIME YOU WANT'
애플리케이션을 빌드하고, docker 이미지를 생성한 후, 이를 ECR 에 push 하는 과정은 Github Action을 통해 이루어 집니다. 이 과정에서 사용할 IAM User를 least privilege 를 준수하여 생성 합니다. 먼저 IAM User를 생성합니다.
이번 실습에서는 Github Action이 빌드된 애플리케이션을 Docker Image로 만들어 ECR로 push 합니다. 이 과정에서 AWS credential 을 사용 합니다. 이를 위해 앞서 github-action이라는 IAM User를 생성 했습니다. 이제 아래 명령어를 실행하여 해당 User의 Access Key, Secret Key를 생성하도록 하겠습니다.
awsiamcreate-access-key--user-namegithub-action
아래와 같은 출력 결과 중 "SecretAccessKey", "AccessKeyId"값을 따로 기록해둡니다. 이 값은 향후에 사용 합니다.
Github의 front-app-repo 레파지토리로 돌아가 Settings > Secrets and variables > Actions 를 선택 한 후, 화면 우측의 New repository secret 을 클릭 합니다.
아래 화면 같이 Name에는 ACTION_TOKENValue 에는 앞서 복사한 Github의 personal access token 값을 넣은 후 Add secret 을 클릭 합니다.
다음은 마찬가지 절차로, 앞서 생성 후 기록/저장 해둔 IAM User 인 github-action 의 AccessKeyId 와 SecretAccessKey의 값을 Secret 에 저장 합니다. 이때 AccessKeyId 와 SecretAccessKey의 각각의 Name 값은 AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY 로 합니다.
이제 Github Action에서 사용할 빌드 스크립트를 생성하도록 하겠습니다. 먼저 .github 및 workflows 디렉터리를 생성합니다.
front-app Repo의 소스코드를 checkout 하고, build 한 다음, docker container 로 만들어 ECR 로 push 하는 과정을 담고 있는 github action build 스크립트를 작성 합니다. 이 때 $IMAGE_TAG 값은 빌드 마다 랜덤한 값으로 만들어 이미지에 부착하여 ECR로 push 합니다.
Github의 front-app-repo 로 돌아가 변경사항이 push 되었는지 확인하고, Actions 탭의 workflow가 다음과 같이 동작 하는지 확인 합니다.
정상적으로 빌드가 완료 되었다면 애플리케이션 demo-frontend ECR 레파지토리로 돌아가, 새로운 $IMAGE_TAG를 갖는 이미지가 push 되었는지 확인 합니다. sha 값의 일부가 포함된 Image Tag로 push 된 이미지가 확인 됩니다.
Continuous Deployment with ArgoCD
본 실습 에서는 Kustomize 를 활용해 쿠버네티스 Deployment 리소스에 동일한 label, metadata 값을 주도록 하고, 애플리케이션 소스코드의 새로운 변경 사항 발생에 따른 새로운 Image Tag를 Deployment 리소스에 적용하도록 하겠습니다. 먼저 Kustomize 사용을 위해 kubernetes manifest 디렉토리를 구조화하도록 하겠습니다.
Kustomize 는 쿠버네티스 manifest 를 사용자 입맛에 맞도록 정의 하는데 도움을 주는 도구 입니다. 여기서 "사용자 입맛에 맞도록 정의"에 포함 되는 경우는, 모든 리소스에 동일한 네임스페이스를 정의 하거나, 동일한 네임 접두사/접미사를 준다거나, 동일한 label 을 주거나, 이미지 태그 값을 변경 하는 것들이 있을 수 있습니다. Kustomize 에 관한 자세한 내용은 다음 을 참고 하세요.
마지막으로 위에서 설정 한 파일들(값)을 사용하고 애플리케이션 빌드에 따라 만들어진 새로운 Image Tag 를 사용하겠다고 정의 하겠습니다. 구체적으로는, name 에 지정된 image는 newName의 image와 newTag의 값으로 사용 하겠다는 의미 입니다. 이를 활용해 newTag 값을 변경해 새로운 배포가 이루어질 때 마다 이를 kubernetes 클러스터에 반영 할 수 있습니다. 아래 명령을 실행 합니다.
$argocdclusteradd $CONTEXT_NAME -yWARNING: This will create a service account `argocd-manager` on the cluster referenced by context `i-0fd091734070b9f6f@eksworkshop.ap-northeast-2.eksctl.io` with full cluster level privileges. Do you want to continue [y/N]? y
INFO[0003]ServiceAccount"argocd-manager"createdinnamespace"kube-system"INFO[0003]ClusterRole"argocd-manager-role"createdINFO[0003]ClusterRoleBinding"argocd-manager-role-binding"createdCluster'https://095783B7DF46A1EA53103B1201579207.gr7.ap-northeast-2.eks.amazonaws.com'added
cd ~/environment/amazon-eks-frontend/.github/workflows
git add .
git commit -m "Add image tag update stage"
git push origin main
추가된 단계가 정상적으로 동작 하면, ArgoCD가 k8s-manifest-repo를 지켜 보고 있다가 새로운 변경 사항이 발생 되었음을 알아채고, kustomize build 작업을 수행하여 새로운 kubernetes manifest (*새로운 image tag를 포함한)를 eks 클러스터에 배포 합니다.
새로운 Image Tag가 정상 반영 되었는지 살펴 보겠습니다. k8s-manifest-repo의 commit history를 통해 변경된 Image Tag 정보를 확인 합니다.
그리고 이 값이 ArgoCD에 의해 새롭게 배포된 frontend-deployment가 사용하는 Image Tag 값과 같은지 확인 합니다. ArgoCD 메뉴에서 Applications > eksworkshop-cd-pipeline > 이동 하여 다이어그램에서 demo-frontend-로 시작하는 pod을 클릭하면 상세 정보 확인이 가능합니다.