본문으로 이동
Kim Jongwon
← 전체 프로젝트

GitOps 배포 | 개인 실습, 과정 자료로 자율 진행 | 2026.04.10 - 2026.04.20

GCP GKE GitOps Pipeline

이미지 빌드와 클러스터 배포 권한을 나눈 GKE 배포 경로

GitHub Actions는 키 없이 인증해 이미지만 올리고, 클러스터 배포는 Argo CD가 맡게 했습니다. CPU 부족으로 멈춘 배포는 교체 순서를 바꿔 해결했습니다.

클러스터

노드 2대

GKE 노드 Ready

배포

2/2

Pod 2개 모두 정상

외부 접속

HTTP 200

Ingress 응답 확인

GKE 배포 흐름

이미지 업로드와 배포 권한을 나눈 경로

Terraform 적용부터 외부 접속 HTTP 200까지 실습에서 확인했습니다.

01

Terraform

GKE, VPC, Registry, 인증 준비

02

Actions

키 없이 인증 → 이미지 빌드와 업로드

03

태그 반영

새 이미지 태그를 사람이 Git에 커밋

04

Argo CD

Git 내용대로 클러스터 동기화

05

Ingress

외부 IP로 HTTP 200 확인

인프라

Terraform 적용, 노드 2대 Ready

배포

이미지 업로드, 태그 확인

실행 상태

Synced/Healthy, HTTP 200

Terraform → GitHub Actions → Artifact Registry → Argo CD → GKE

문제 해결 과정

배포 중 새 Pod가 CPU 부족으로 멈췄습니다

작은 노드 2대에서 무중단 교체가 막혔고, 교체 순서를 바꿔 끝냈습니다. 그 대가도 함께 기록했습니다.

  1. 새 Pod가 Pending에서 멈춤

    새 이미지로 교체하는 중 추가로 뜨는 Pod가 Pending 상태로 멈췄고, 이벤트에는 '2 Insufficient cpu'가 남았습니다.

  2. 노드에 여유 CPU 부족

    e2-medium 노드 2대에는 기존 Pod를 유지한 채 새 Pod를 하나 더 띄울 CPU가 없었습니다.

  3. 기존 Pod부터 하나씩 교체

    maxSurge 0, maxUnavailable 1로 바꿔, 새 Pod를 더 띄우지 않고 기존 Pod를 하나씩 바꾸게 했습니다. 최종 2/2를 확인했습니다.

  4. 교체 중에는 1개로 줄어듦

    이 방식은 교체하는 동안 Pod가 1개로 줄어듭니다. 운영에서는 노드 여유 용량이나 자동 확장부터 확보해야 한다는 점을 기록했습니다.

원인 분석 문서 보기 ↗

설계 배경

배포 권한을 나눈 이유

CI가 클러스터를 직접 바꿀 수 있으면 권한 사고가 곧 배포 사고가 됩니다. 그래서 CI에는 클러스터 접속 정보를 두지 않고, 이미지를 만드는 단계와 클러스터에 반영하는 단계를 나눴습니다.

직접 한 일

  • GKE, VPC, 서브넷, Artifact Registry, GitHub 인증 준비 자원을 Terraform으로 관리했습니다.
  • GitHub Actions는 이미지 업로드까지, Argo CD는 매니페스트 동기화부터 맡도록 책임을 나눴습니다.
  • 디스크 할당량, Ingress 설정, Argo CD 설치, 배포 자원 부족 문제를 직접 겪고 해결했습니다.

결과

  • CI(이미지)와 CD(배포) 권한 분리
  • 키 파일 없는 GitHub → GCP 인증 (OIDC/WIF)
  • CPU 부족으로 멈춘 배포를 전략 변경으로 해결

배포 기록

Terraform부터 외부 접속까지 5단계

실습에서 순서대로 확인한 실제 화면입니다.

Terraform apply 성공 화면
1단계 Terraform 적용: GKE 인프라 생성 원본 보기
GitHub Actions CI 성공 화면
2단계 GitHub Actions: 키 없이 인증 후 이미지 업로드 원본 보기
GCP Artifact Registry 이미지 태그 화면
3단계 Artifact Registry: 커밋 SHA 이미지 태그 원본 보기
Argo CD Application Synced Healthy 상태 화면
4단계 Argo CD: Synced / Healthy 원본 보기
GKE Ingress 외부 IP HTTP 200 응답 화면
5단계 GKE Ingress: 외부 접속 HTTP 200 원본 보기

핵심 코드

CI는 이미지만, 배포는 Argo CD가

Actions는 키 없이 인증해 이미지를 올리는 권한만 갖고, 클러스터 반영은 Argo CD가 Git을 보고 합니다.

CI 권한과 Argo CD 동기화 설정

.github/workflows/ci.yml + gitops/argocd-app.yaml

permissions:
  contents: read
  id-token: write

- uses: google-github-actions/auth@v2
  with:
    workload_identity_provider: ${{ secrets.GCP_WORKLOAD_IDENTITY_PROVIDER }}
    service_account: ${{ secrets.GCP_SERVICE_ACCOUNT }}

- name: Build and push image
  run: docker push "${IMAGE_URI}"

spec:
  source:
    path: k8s
  syncPolicy:
    automated:
      prune: true
      selfHeal: true