ArgoCD를 활용한 k8 CI/CD pipeline 구축 #1

최다찬

업데이트:

이야기에 앞서

띵스플로우 인프라팀 SRE/DevOps 조직은 현재 소수의 인원으로 스토리플레이, 헬로우봇, 비트윈 3개 서비스를 대상으로 장애 관리, 클라우드 인프라 운영을하고 있고 어플리케이션
배포 및 모니터링을 자동화하여 개발자분들이 최대한 개발에만 집중 할 수 있도록 노력하고 있습니다.

또, 최신 기술을 POC하고 서비스 성능 최적화를 통한 인프라 비용 최적화 작업을 꾸준히
진행하고 있어요. 띵스플로우에는 node.js로 개발되어 있는 서비스들이 많은데, 싱글 스레드로 동작하는 node.js를 운영하면서 서버 인스턴스들의 CPU 사용률 비효율과 급격하게
트래픽이 증가하면서 상대적으로 느린 EC2 AutoScaling 속도에 한계를 경험하여
스토리플레이 EKS 마이그레이션을 진행했고 컨테이너 배포 자동화를 위해 ArgoCD & GitHub Actions을 활용하여 CI/CD pipeline을 구축했습니다.

이 글에서 EKS 구축 자동화, ArgoCD 구축, 배포 자동화 과정에 대해 소개하려 합니다.

사용 기술

이 글에서 다루게 될 기술과 주제에요.

  1. Container Orchestration
    • Why EKS ?
    • Terraform을 활용한 EKS 구축
    • EKS 주요 addOn 설치 자동화 및 서비스 통합
  2. 어플리케이션 배포 자동화와 GitOps (CI/CD pipeline)
    • What’s GitOps
    • GitHub Actions (CI Tool)
    • ArgoCD (CD Tool)

Container Orchestration

이 글에서 가장 큰 범위의 주제는 Container Orchestration 구축과
Container Orchestration의 CICD pipeline 구축이에요. 아래 그래프는 Container
Orchestration Market Share 인데요. 우리가 알고 있는 것보다 많은 플랫폼이 존재해요.

특징적인 것은 Docker Swarm, Nomad, Cloud Foundry 같은 몇몇 플랫폼을 제외하면
모두 오픈소스인 Kubernetes를 기반으로 각각의 Cloud Provider에서 자기 환경에 맞게 Customizing 된 것들인 것을 알 수 있습니다. 사용자는 각각 자신에 환경에 맞는 Container Orchestration를 선택하여 사용할 수 있어요.

Why EKS ?

EKS는 AWS에서 제공하는 완전관리형 쿠버네티스(Kubernetes) 서비스에요. 띵스플로우에서는 AWS를 메인으로 사용하고 있기 때문에 AWS EKS가 가장 적합한 Container Orchestration 이라고 생각합니다. 왜냐면 AWS에 있는 서비스들과의 연동과 다양한
사용자 편의 기능을 제공하고 있어서 AWS를 사용중이라면 사용하지 않을 이유가 없죠.

아래 내용은 EKS에서 제공하는 핵심 기능입니다.

  1. 완전관리형 : Control Plane(Master)에 대한 설치와 유지관리, 버전관리를 알아서
    해주고 고가용성을 확보 해줍니다.
  2. VPC CNI : 일반적인 k8에서는 파드의 네트워크가 워커 노드의 네트워크와 다른 자체적인 네트워크 대역을 사용하여 외부에서 파드와 통신하는 것이 불가능 하지만 VPC CNI를 사용하면 파드에서 VPC 내부 네트워크 대역을 사용할 수 있어요. Exploring the Networking Foundation for EKS: amazon-vpc-cni-k8s + Calico |  AWS Open Source Blog
  3. AWS ELB 통합 : AWS Load balancer Controller를 통한 k8 ingress와 ELB의
    통합을 지원합니다. controller-design
  4. 그 밖에 IAM를 통한 인증, AutoScaler를 통한 Worker Node 무한 확장, EBS CSI, Secret Manager CSI 와 같은 다양한 서비스 통합 기능들을 제공합니다.

Terraform을 활용한 EKS 구축

사실 .. Terraform이 익숙하지 않다면, 그리고 참고하기 좋은 샘플 코드가 없다면 EKS를 Terraform 으로 구축 하지 않는 것을 추천해요. 왜냐면 eksctl 이라는 강력한 API를
AWS에서 제공하기 때문이에요. eksctl을 사용하면 간단하게 EKS를 구축이 가능합니다.

굳이 Terraform을 사용한 이유는 Terraform 코드로 리소스를 관리하는게 익숙하고 좋은
샘플 코드가 있었기 때문이에요. 또, Terraform을 사용 했을때 받을 수 있는 OUTPUT을
이용해 EKS addOn 설치 자동화도 하고 싶었어요.

사전 준비 사항

## terraform 설치 (https://learn.hashicorp.com/tutorials/terraform/install-cli)
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://rpm.releases.hashicorp.com/AmazonLinux/hashicorp.repo
sudo yum -y install terraform

## awscli & eksctl 설치 및 configuration
sudo yum install -y awscli
aws configure
curl --silent --location "https://github.com/weaveworks/eksctl/releases/latest/download/eksctl_$(uname -s)_amd64.tar.gz" | tar xz -C /tmp
sudo mv /tmp/eksctl /usr/local/bin
eksctl version

## helm 설치
curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
chmod 700 get_helm.sh
./get_helm.sh

## kubectl 설치
curl -o kubectl https://s3.us-west-2.amazonaws.com/amazon-eks/1.22.6/2022-03-09/bin/linux/amd64/kubectl
chmod +x ./kubectl
mkdir -p $HOME/bin && cp ./kubectl $HOME/bin/kubectl && export PATH=$PATH:$HOME/bin
echo 'export PATH=$PATH:$HOME/bin' >> ~/.bashrc
kubectl version --short --client

git 설치 및 clone
sudo yum install -y git
git clone https://github.com/thingsflow/infra-terraform.git

VPC 구축 image

  • 테스트를 위한 VPC가 있다면 이 작업을 SKIP 합니다.
  • terraform.auto.tfvars를 수정하여 VPC에 대한 세부 설정을 합니다.
  • VPC workspace는 backend로 s3를 사용하고 있습니다. (_backend.tf)
  • terraform apply

EKS 구축 image

  • Terraform으로 EKS를 구축 합니다.
  • terraform.auto.tfvars에서 EKS에 대한 환경 설정을 할 수 있습니다.
  • eks workspace도 VPC와 마찬가지로 s3 backend를 사용하고 VPC의 backend
    데이터를 가지고와 위에서 생성한 VPC 위에 EKS를 구축하도록 구현 되어 있습니다.(_remote.tf, _local.tf, _backend.tf)
  • 기본 설정에서는 coredns, vpccni, kube-proxy, ebs-csi-driver 4개의 addOn이 설치됩니다.
  • terraform apply

검증

  • VPC
    image
  • subnet 생성
    image
  • EKS Cluster & Node Group image
  • EKS AddOn
    image
  • EKS Node ASG
    image

AWS 주요 addOn 설치 자동화 및 서비스 통합

  1. eks_addon_irsa.tf 에서 addon IRSA를 자동으로 생성해줍니다.
  2. terraform 실행이 완료되면 IRSA ARN을 받아와 scripter.tf가 ./sh 디렉토리에 필수 AddOn shell 생성합니다.
    image
  3. 스크립트 실행
    • ./00.update-kubeconfig.sh
    • ./01.aws_load_balancer_controller.sh
    • ./02.cluster_autoscaler.sh
    • ./03.secrets-store-csi-driver.sh

검증

  • kubectl get pod -n kube-system
  • 명령어로 모든 addOn이 잘 설치 되어 있는지 확인 합니다.
    image

마치며

대부분의 Container Orchestration은 k8 엔진 기반으로 만들어졌기 때문에 대동소이
하다고 볼 수 있어 운영 환경에 맞는 플랫폼을 선택하여 구축하는 것이 좋다고 생각합니다.

구축 방법도 여러가지가 있는데 사실 Terraform은 자주, 단순, 반복 작업을 하는 서비스에
적용하는 것이 가장 효과적일 수도 있습니다. 하지만 자주 실행하지 않더라도 굉장히 복잡한 작업이라 사람이 실수 할 수 있는 포인트가 많은 서비스에 적용할 때도 자동화를 해두면 좋은
효과를 보기도 합니다.

EKS에서 제공하는 AddOn들은 수동으로 설치해야 하고 설치 방법도 생각보다 간단하지
않아 쉽게 잊어 버리고 별거 아닌 일에 시간을 빼앗기는 일도 생길 수 있어요.

이번 글에서는 Terraform을 사용해 EKS 구축 해봤는데요. 다음 글에서는 구축한 EKS에
ArgoCD를 배포하고 ArgoCD를 통해 CI/CD pipeline을 구현하는 내용을 다루겠습니다.

띵스플로우 팀은 자기의 일을 좋아하고 잘하는 사람들 입니다. 사용자와 서비스를 중심으로 빠르게 실행하고 학습하며, 다양한 직무의 사람들이 협업을 통해 시너지를 내고 있습니다. 다양한 콘텐츠 혁신을 이루고 있는 띵스플로우 팀에 함께할 분을 찾습니다! 언제든 people@thingsflow.com로 이메일을 주시기 바랍니다!

태그: , , , ,

카테고리: ,

업데이트:

댓글남기기