C
DevOps/CICD_K8s/Lesson 03

CI/CD + Kubernetes — GitHub Actions·Pod·Deployment

60분·theory

CI/CD + Kubernetes — GitHub Actions·Pod·Deployment

🎯 이 lesson 을 읽고 나면

이 lesson 을 다 읽고 나면 아래 3가지를 자신 있게 할 수 있습니다.

  • ✅ GitHub Actions / GitLab CI 워크플로우
  • ✅ Kubernetes Pod · Deployment · Service · Ingress
  • ✅ Helm 패키지 매니저 + 환경별 values.yml

학습 목표를 체크리스트로 두고 다 답할 수 있게 되면 lesson 을 닫으세요.

CI/CD 흐름 + GitHub Actions

CI/CD = 코드 → 운영 자동화:
1. Continuous Integration: 코드 push → 자동 빌드·테스트·린트
2. Continuous Delivery: + 자동 스테이징 배포
3. Continuous Deployment: + 자동 운영 배포

GitHub Actions (가장 흔함):

  • .github/workflows/*.yml 파일
  • push·PR·schedule·manual 트리거
  • public repo 무료, private 월 2000 분 무료

예시:

yaml
name: CI
on: [push, pull_request]
jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with: { node-version: '20', cache: 'npm' }
      - run: npm ci
      - run: npm run lint
      - run: npm test
      - run: npm run build

보안 best practice:

  • secrets.GITHUB_TOKEN 사용 (Personal Access Token 직접 X)
  • OIDC 로 AWS·GCP 임시 자격증명 (장기 키 X)
  • pin 액션 commit hash 로 (버전 태그 X)
  • Dependabot 으로 액션 자동 업데이트

다른 CI/CD 도구:

  • GitLab CI — GitLab 내장
  • Jenkins — 자체 호스팅, 강력하나 복잡
  • CircleCI — 빠른 시작
  • ArgoCD — GitOps (K8s 특화)

Kubernetes — Pod·Service·Deployment

한 줄: K8s = 컨테이너의 자동 운영 도구. Google 의 Borg → 2014 오픈소스 → 사실상 표준.

핵심 객체:

객체의미
Pod컨테이너 1개+ 의 최소 단위. 같은 IP·볼륨 공유
ServicePod 들의 고정 진입점 (Pod IP 변동에도 안정)
DeploymentPod 의 원하는 상태 관리 (replica·롤링 업데이트)
StatefulSet영속·순서 있는 Pod (DB·Kafka)
DaemonSet모든 노드에 하나씩 (로그 수집·모니터)
Job·CronJob1회·주기 작업
ConfigMap·Secret설정·시크릿
IngressHTTP 라우팅·TLS

Deployment 예시:

yaml
apiVersion: apps/v1
kind: Deployment
metadata: { name: web }
spec:
  replicas: 3
  selector: { matchLabels: { app: web } }
  template:
    metadata: { labels: { app: web } }
    spec:
      containers:
      - name: web
        image: myapp:1.0
        ports: [{ containerPort: 3000 }]
        resources:
          requests: { cpu: "100m", memory: "128Mi" }
          limits:   { cpu: "500m", memory: "512Mi" }

롤링 업데이트 (기본 전략):

  • 새 버전 Pod 점진 추가 → 옛 Pod 점진 제거
  • 무중단 배포 보장
  • 실패 시 자동 롤백 가능

필수 명령:

  • kubectl apply -f deploy.yaml — 배포
  • kubectl get pods,svc,deploy — 상태
  • kubectl logs -f <pod> — 로그
  • kubectl exec -it <pod> -- bash — 진입
  • kubectl rollout undo deployment web — 롤백
💻 📌 GitHub Actions + kubectl
# ============================================
# .github/workflows/deploy.yml
# 코드 push → 테스트 → 빌드 → 이미지 push → K8s 배포
# ============================================
name: Deploy
on:
  push:
    branches: [main]

jobs:
  deploy:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      id-token: write          # OIDC 용

    steps:
      - uses: actions/checkout@v4

      - name: Setup Node
        uses: actions/setup-node@v4
        with: { node-version: '20' }

      - run: npm ci
      - run: npm test
      - run: npm run build

      # Docker 이미지 빌드 + push
      - uses: docker/login-action@v3
        with:
          registry: ghcr.io
          username: \${{ github.actor }}
          password: \${{ secrets.GITHUB_TOKEN }}

      - uses: docker/build-push-action@v5
        with:
          context: .
          push: true
          tags: ghcr.io/\${{ github.repository }}:\${{ github.sha }}

      # AWS OIDC (장기 키 없이)
      - uses: aws-actions/configure-aws-credentials@v4
        with:
          role-to-assume: arn:aws:iam::123:role/github-deploy
          aws-region: ap-northeast-2

      # K8s 배포
      - uses: azure/setup-kubectl@v3
      - run: |
          aws eks update-kubeconfig --name prod-cluster
          kubectl set image deployment/web web=ghcr.io/myorg/web:\${{ github.sha }}
          kubectl rollout status deployment/web --timeout=5m

# ============================================
# 실용 kubectl 명령
# ============================================
# kubectl get all                          # 모든 리소스
# kubectl describe pod <name>              # 상세 (이벤트·문제 진단)
# kubectl logs -f <pod> -c <container>     # 멀티 컨테이너
# kubectl port-forward svc/web 8080:80     # 로컬 → 클러스터
# kubectl scale deployment web --replicas=5
# kubectl rollout history deployment web   # 배포 이력
# kubectl rollout undo deployment web      # 직전으로
# kubectl top pods                         # CPU·MEM 사용
# kubectl drain node-1 --ignore-daemonsets # 노드 비우기

🤖 AI 에게 이렇게 요청해보세요

이 lesson 의 개념을 알면 AI 에게 구체적으로 지시할 수 있습니다. 막연한 "고쳐줘" 가 아니라 어휘를 가진 요청 — 그게 토큰 절약의 출발점입니다.

  • "이 프로젝트의 GitHub Actions 워크플로우 (lint + test + deploy) 만들어줘"
  • "이 앱을 Kubernetes deployment + service + ingress yaml 로 변환해줘"

왜 이게 토큰을 줄이나

개념을 모를 땐 AI 답변을 받고도 "그게 뭐예요?" 를 다시 물어야 합니다. 그 "다시 물음" 이 토큰을 잡아먹습니다. 개념 한 번 익혀두면 대화가 한 번에 끝납니다.

CI/CD + Kubernetes — GitHub Actions·Pod·Deployment - DevOps