PromleeBlog
sitemap
aboutMe

posting thumbnail
쿠버네티스 운영 자동화 로깅 모니터링 CI/CD - DevOps 컨테이너에서 클러스터까지 7편
Kubernetes Operations Automation Logging Monitoring CI/CD - DevOps from Containers to Clusters Part 7

📅

🚀

들어가기 전에 🔗

지난 시간에는 HPA, 롤링 업데이트, Ingress와 같은 쿠버네티스의 고급 기능들을 배우며 애플리케이션을 더욱 안정적이고 유연하게 운영하는 법을 익혔습니다.

이제 우리는 단순히 애플리케이션을 배포하는 것을 넘어, 실제 서비스 운영에 필요한 다음 단계들을 고민해야 합니다.
"우리 서비스가 지금 잘 동작하고 있나?", "데이터베이스 비밀번호 같은 민감한 정보는 어떻게 안전하게 관리하지?", "코드를 수정할 때마다 매번 손으로 빌드하고 배포하는 과정을 자동화할 수는 없을까?" 와 같은 질문들입니다.

이번 시간에는 이러한 운영 환경의 필수 고려 사항들을 다룹니다.
서비스의 건강 상태를 확인하는
로깅과 모니터링
, 중요한 정보를 안전하게 지키는
Secret
, 그리고 배포 과정을 자동화하는
CI/CD 파이프라인
의 개념을 배우고, GitHub Actions를 이용해 간단한 배포 자동화를 직접 경험해보겠습니다.

🚀

로깅과 모니터링 🔗

자동차를 운전할 때 우리는 속도계, 연료계, 엔진 온도계 같은 계기판을 계속 확인합니다.
계기판이 없다면 차에 어떤 문제가 생겼는지 알 수 없어 위험한 상황에 처할 수 있습니다.

쿠버네티스 클러스터를 운영하는 것도 마찬가지입니다.
수많은 Pod와 노드들이 잘 동작하고 있는지, 자원은 얼마나 사용하고 있는지 항상 지켜봐야 합니다.
이 역할을 해주는 것이 바로
로깅(Logging)
모니터링(Monitoring)
입니다.

쿠버네티스 생태계에서는
Prometheus(프로메테우스)
로 시스템 상태 데이터를 수집하고,
Grafana(그라파나)
로 그 데이터를 멋진 대시보드에 시각화하는 조합이 사실상의 표준으로 사용됩니다.
모니터링 역할(ex. 자동차 계기판)
모니터링 역할(ex. 자동차 계기판)

🚀

Kubernetes Secret 🔗

애플리케이션을 개발하다 보면 데이터베이스 접속 정보, 외부 서비스 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!'

🚀

CI/CD 파이프라인 🔗

지금까지 우리는 코드를 수정한 뒤, docker build, docker push, kubectl apply 같은 명령어들을 직접 터미널에 입력하여 배포했습니다.
이 과정은 반복적이고, 사람이 직접 하다 보면 실수가 발생하기 쉽습니다.

CI/CD
는 이 모든 과정을 자동화하여 개발자가 코드 작성에만 집중할 수 있도록 도와주는 파이프라인입니다.

이러한 CI/CD 파이프라인을 구축하는 도구로는 Jenkins, CircleCI, 그리고 오늘 우리가 살펴볼 GitHub Actions 등이 있습니다.
ArgoCD는 CD에 더욱 특화된 도구로, Git 저장소의 상태를 기준으로 쿠버네티스 클러스터의 상태를 자동으로 동기화하는 GitOps 방식을 구현할 때 많이 사용됩니다.
CI/CD
CI/CD

실습: GitHub Actions로 Nginx 이미지 배포 자동화 🔗

이제 GitHub Actions를 이용해 아주 간단한 CI/CD 파이프라인을 경험해보겠습니다.

목표는 2편에서 만들었던 나만의 Nginx 페이지(index.htmlDockerfile)를 GitHub에 올리고, 코드를 수정하여 푸시할 때마다 자동으로 Docker 이미지를 빌드/푸시하고, Minikube 클러스터에 롤링 업데이트를 수행하는 것입니다.
➡️

1. GitHub Repository 및 Secrets 설정 🔗

➡️

2. GitHub Actions 워크플로우 파일 작성 🔗

레포지토리 안에 .github/workflows 폴더를 만들고, 그 안에 ci-cd.yml 파일을 생성하여 아래 내용을 입력합니다.
.github/workflows/ci-cd.yml
name: CI/CD for Nginx on Minikube
 
on:
  push:
    branches: [ "main" ]
 
jobs:
  build-and-deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v3
 
      - name: Login to Docker Hub
        uses: docker/login-action@v2
        with:
          username: ${{ secrets.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKERHUB_TOKEN }}
 
      - name: Build and push Docker image
        uses: docker/build-push-action@v4
        with:
          context: .
          push: true
          tags: ${{ secrets.DOCKERHUB_USERNAME }}/my-custom-nginx:latest
 
      - name: Install kubectl
        uses: azure/setup-kubectl@v3
 
      - name: Deploy to Kubernetes
        run: |
          mkdir -p ~/.kube
          echo "${{ secrets.KUBE_CONFIG }}" | base64 -d > ~/.kube/config
          kubectl set image deployment/nginx-deployment nginx=${{ secrets.DOCKERHUB_USERNAME }}/my-custom-nginx:latest
이제 index.html 파일의 내용을 수정하고 git commit, git push를 해보세요.
GitHub 레포지토리의 'Actions' 탭에 가보면 워크플로우가 자동으로 실행되는 것을 볼 수 있습니다.
성공적으로 완료된 후 터미널에서 kubectl get pods를 실행해보면 Pod들이 새로 교체된 것을 확인할 수 있습니다.

🚀

결론 🔗

오늘은 실제 서비스를 안정적으로 운영하기 위한 세 가지 중요한 기둥에 대해 배웠습니다.

로깅과 모니터링
을 통해 서비스의 건강 상태를 진단하는 의사의 역할을,
Secret
을 통해 민감한 정보를 지키는 금고지기의 역할을, 그리고
CI/CD
를 통해 반복적인 배포 작업을 대신해주는 로봇의 역할을 이해했습니다.

특히 GitHub Actions를 이용한 배포 자동화 실습을 통해, 개발자는 이제 코드 수정에만 집중하고 배포는 자동화된 파이프라인에 맡기는 현대적인 DevOps 워크플로우를 직접 경험했습니다.

다음 마지막 시간에는 이 모든 과정을 종합하여, 프론트엔드(Nginx), 백엔드(API), 데이터베이스로 구성된 블로그 서비스를 로컬 개발 환경부터 쿠버네티스 운영 환경까지 배포하는 종합 실습을 진행하며 시리즈를 마무리하겠습니다.

참고 🔗