지난 시간에는 HPA, 롤링 업데이트, Ingress와 같은 쿠버네티스의 고급 기능들을 배우며 애플리케이션을 더욱 안정적이고 유연하게 운영하는 법을 익혔습니다.
이제 우리는 단순히 애플리케이션을 배포하는 것을 넘어, 실제 서비스 운영에 필요한 다음 단계들을 고민해야 합니다.
"우리 서비스가 지금 잘 동작하고 있나?", "데이터베이스 비밀번호 같은 민감한 정보는 어떻게 안전하게 관리하지?", "코드를 수정할 때마다 매번 손으로 빌드하고 배포하는 과정을 자동화할 수는 없을까?" 와 같은 질문들입니다.
이번 시간에는 이러한 운영 환경의 필수 고려 사항들을 다룹니다.
서비스의 건강 상태를 확인하는
로깅과 모니터링
, 중요한 정보를 안전하게 지키는
Secret
, 그리고 배포 과정을 자동화하는
CI/CD 파이프라인
의 개념을 배우고, GitHub Actions를 이용해 간단한 배포 자동화를 직접 경험해보겠습니다.
애플리케이션을 개발하다 보면 데이터베이스 접속 정보, 외부 서비스 API 키 등 민감한 정보를 코드나 YAML 파일에 넣어야 할 때가 있습니다.
하지만 이런 정보를 평문으로 저장하는 것은 마치 집 현관문에 비밀번호를 적어두는 것과 같이 매우 위험한 일입니다.
쿠버네티스에서는 이러한 민감 정보를 안전하게 관리하기 위해
Secret(시크릿)
이라는 리소스를 제공합니다.
Secret은 데이터를 Base64라는 방식으로 인코딩하여 저장합니다.
Base64 인코딩은 암호화는 아니지만, 사람이 바로 읽을 수 없게 만들어 실수로 정보가 노출되는 것을 방지해줍니다.
이렇게 생성된 Secret은 Pod에 환경 변수나 파일 형태로 주입될 수 있습니다.
마치 우리가 비밀번호를 금고에 넣어두고, 필요할 때만 금고를 열어보는 것과 같은 원리입니다.
5편에서 잠깐 언급했던 ConfigMap은 민감하지 않은 일반 설정 정보를 저장하는 데 사용하고, Secret은 비밀번호나 API 키처럼 반드시 보호해야 할 정보를 저장하는 데 사용한다고 기억하면 좋습니다.
# 터미널에서 직접 Secret 만들기 예시 # DB_PASSWORD라는 키에 S3cr3tP@ssw0rd! 라는 값을 가진 my-secret 생성kubectl create secret generic my-secret --from-literal=DB_PASSWORD='S3cr3tP@ssw0rd!'
지금까지 우리는 코드를 수정한 뒤, docker build, docker push, kubectl apply 같은 명령어들을 직접 터미널에 입력하여 배포했습니다.
이 과정은 반복적이고, 사람이 직접 하다 보면 실수가 발생하기 쉽습니다.
CI/CD
는 이 모든 과정을 자동화하여 개발자가 코드 작성에만 집중할 수 있도록 도와주는 파이프라인입니다.
CI (Continuous Integration, 지속적 통합)
개발자가 코드를 GitHub 같은 코드 저장소에 푸시(push)하면, 자동으로 테스트를 실행하고, Docker 이미지를 빌드하여 이미지 저장소(Docker Hub 등)에 올리는 과정입니다.
자동화된 조립 라인
과 같습니다.
CD (Continuous Deployment, 지속적 배포)
CI 과정에서 새로 만들어진 이미지를 감지하여, 자동으로 쿠버네티스 클러스터에 배포(롤링 업데이트 등)하는 과정입니다.
자동화된 배달 시스템
과 같습니다.
이러한 CI/CD 파이프라인을 구축하는 도구로는 Jenkins, CircleCI, 그리고 오늘 우리가 살펴볼 GitHub Actions 등이 있습니다.
ArgoCD는 CD에 더욱 특화된 도구로, Git 저장소의 상태를 기준으로 쿠버네티스 클러스터의 상태를 자동으로 동기화하는 GitOps 방식을 구현할 때 많이 사용됩니다.
on: push: branches: [ "main" ]main 브랜치에 코드가 푸시될 때마다 이 워크플로우가 실행됩니다.
docker/login-action, docker/build-push-action
Docker Hub에 로그인하고 이미지를 빌드/푸시하는 액션입니다.
Deploy to KubernetesKUBE_CONFIG Secret을 이용해 kubectl을 설정하고, kubectl set image 명령어로 nginx-deployment의 컨테이너 이미지를 방금 푸시한 새 이미지로 교체하여 롤링 업데이트를 실행합니다.
이제 index.html 파일의 내용을 수정하고 git commit, git push를 해보세요.
GitHub 레포지토리의 'Actions' 탭에 가보면 워크플로우가 자동으로 실행되는 것을 볼 수 있습니다.
성공적으로 완료된 후 터미널에서 kubectl get pods를 실행해보면 Pod들이 새로 교체된 것을 확인할 수 있습니다.