AI

[모각코] 2주차 환경 구성

Hanhorang31 2026. 7. 5. 14:22
앞으로 4주간 온라인 모각코를 통해 스터디한 내용을 업로드할 예정입니다.

모각코란 모여서 각자 코딩의 준말로, CloudNet@ 가시다님과 함께 책 하나를 돌파하는 스터디입니다.

이번 모각코는 책, AI 시대에 개발자가 알아야 할 인프라 구성 배포 with 클로드 코드 를 기반으로 진행합니다.

 

환경 구성

가상의 스타트앱, notiflex을 개발할 예정입니다. 2장에서는 GKE 클러스터와 애플리케이션 배포, 깃허브를 구성할 예정입니다.

 

 

서비스 활용

가상의 앱, Notfilex 환경 구성을 위해 다음의 서비스가 필요합니다.
서비스
목적
비용
비고
GCP (GKE, Artifact Registry 등)
클라우드 환경 구성
$300 무료 크레딧
신규 계정 90일, 크레딧 내 실습 완료 가능
클로드 코드
AI LLM 활용
최소 $22/월 (Pro)
Max($110/월) 권장, 상세 내용은 2.2절 참고
깃허브
GItOps 활용
무료
Public repo + Actions 무료
  • 필자의 경우 GCP 계정과 클로드 코드 Pro 로 진행하였습니다.

 

 

GCP 신규 크레딧 활용

클로드 코드 설정

git clone https://github.com/sysnet4admin/_Book_GitAIOps.git 
cd _Book_GitAIOps 

# 자동 승인 모드
claude --dangerously-skip-permissions
  • 필자는 Sonnet 5 모델로 환경을 구성합니다.
안녕 나는 Notifliex라는 B2B알림 Saas플랫폼의 DevOps 엔지니어야. 
이 책을 따라가면서 쿠버네티스 운영 환경을 처음부터 구축하려고 해

 

 

 

환경 구성

1. Gcloud CLI 설치 & 인증

 gcloud CLI 설치해줘

! gcloud auth login
  • 접두사 ! 는 LLM을 거치지 않고 셸 명령어를 바로 실행시킬 수 있는 명령어입니다.
프로젝트는 hanhorang-gitaiops로 만들어줘, 리전은 서울로 cloud 기본 값을 설정해줘

 

 

2. Artifact Registry 인증 설정


Artifact Registry 인증 설정해주세요. 서울 리전입니다.

 

3. 깃허브 저장소 구성

 GitHub 저장소 만들어줘
 ! gh auth login
tree .
-----
.
├── CLAUDE.md
├── app
└── k8s
    └── smb # small-medium business의 약자로, notiflex의 첫번째 서비스 티어를 의미
  • 필자의 경우 private로 깃허브 Repo가 구성되어 있습니다. gitignore와 REAMD 파일이 생성되지 않았습니다.
 
4. GKE 클러스터 생성
 GKE 클러스터 생성해줘

여담이지만, 필자의 경우 프로젝트 hanhornag-gitaiops 를 콘솔에서 못 찾었는데

조직 없음 내의 프로젝트로 들어가 생성된 것을 확인하였습니다.

GKE 생성 명렁어는 클로드코드에게 지시해서 확인이 가능합니다.


아까 클러스터 생성했을 때 너가 실행한 명령어 알려줘

 

5. Notfilex 배포

Notiflex 앱 만들고 배포해줘

Notiflex 앱 배포는 미리 설정된 가이드라인에 이미지 빌드 및 artifact registry 에 배포되고

GKE에 파드로 배포됩니다.

# cat main.go
package main

import (
        "fmt"
        "log"
        "net/http"
        "os"
        "sync/atomic"
)

var counter atomic.Int64

func main() {
        podName := os.Getenv("POD_NAME")
        if podName == "" {
                podName = "unknown"
        }

        http.HandleFunc("/health", func(w http.ResponseWriter, r *http.Request) {
                w.WriteHeader(http.StatusOK)
                fmt.Fprintln(w, "ok")
        })

        http.HandleFunc("/id", func(w http.ResponseWriter, r *http.Request) {
                id := counter.Add(1)
                w.Header().Set("Content-Type", "application/json")
                fmt.Fprintf(w, `{"id":%d,"pod":%q}`+"\n", id, podName)
        })

        log.Println("notiflex-api listening on :8080")
        if err := http.ListenAndServe(":8080", nil); err != nil {
                log.Fatal(err)
        }
}

# ../notiflex-platform/k8s/smb
apiVersion: apps/v1
kind: Deployment
metadata:
  name: notiflex-api
  namespace: notiflex
spec:
  replicas: 2
  selector:
    matchLabels:
      app: notiflex-api
  template:
    metadata:
      labels:
        app: notiflex-api
    spec:
      containers:
        - name: notiflex-api
          image: asia-northeast3-docker.pkg.dev/hanhorang-gitaiops/notiflex/api:v0.1.0
          ports:
            - containerPort: 8080
          env:
            - name: POD_NAME
              valueFrom:
                fieldRef:
                  fieldPath: metadata.name
          readinessProbe:
            httpGet:
              path: /health
              port: 8080
            initialDelaySeconds: 3
            periodSeconds: 5
          livenessProbe:
            httpGet:
              path: /health
              port: 8080
            initialDelaySeconds: 5
            periodSeconds: 10

접근 확인

 

kubectl port-forward svc/notiflex-api -n notiflex 8080:80 &
$ curl -s http://localhost:8080/id | jq .

 

 

6. 깃허브 커밋

깃허브에 커밋하고 푸쉬해주세요.
  • 지침에 의해 JOURNEY가 자동 생성되었습니다. JOURNEY 는 각 장의 있는 실습 일지로 진행 사항을 저장합니다.
# Notiflex 여정 기록

이 파일은 독자가 실제로 진행한 내용을 기록한다. AI가 각 챕터 완료 시 자동으로 업데이트한다.

## 진행 현황

| 챕터 | 서브챕터 | 상태 | 완료일 | 비고 |
|------|---------|------|--------|------|
| ch2 | 2.2 설치 확인 | ✅ | 2026-07-04 | Claude Code v2.1.201, statusline 구성 확인 |
| ch2 | 2.3 gcloud 설정 | ✅ | 2026-07-04 | 프로젝트 hanhorang-gitaiops 생성, 결제 계정 연결, asia-northeast3 |
| ch2 | 2.4 GitHub 저장소 | ✅ | 2026-07-04 | notiflex-platform (private) |
| ch2 | 2.5 GKE 클러스터 | ✅ | 2026-07-04 | notiflex-cluster, e2-medium x2 Spot, Gateway API standard |
| ch2 | 2.6 빌드/배포 | ✅ | 2026-07-04 | notiflex-api v0.1.0, notiflex 네임스페이스 |
| ch2 | 2.7 첫 커밋 | ✅ | 2026-07-04 | |
| ch3 | 3.2 GitOps 도구 | ⬜ | | |
| ch3 | 3.3 기능 추가 | ⬜ | | |
| ch3 | 3.4 CI | ⬜ | | |
| ch3 | 3.5 CI-CD 연결 | ⬜ | | |
| ch4 | 4.2 메트릭 모니터링 | ⬜ | | |
| ch4 | 4.3 로그 수집 | ⬜ | | |
| ch4 | 4.4 알림 | ⬜ | | |
| ch5 | 5.2 트래픽 관리 | ⬜ | | |
| ch5 | 5.3 무중단 배포 | ⬜ | | |
| ch6 | 6.1 캐시 | ⬜ | | |
| ch6 | 6.2 시크릿 관리 | ⬜ | | |
| ch6 | 6.3 Canary 전환 | ⬜ | | |
| ch7 | 7.2 멀티 노드풀 | ⬜ | | |
| ch7 | 7.3 App of Apps | ⬜ | | |
| ch7 | 7.4 멀티테넌시 | ⬜ | | |
| ch8 | 8.1 메시징 | ⬜ | | |
| ch8 | 8.2 트레이싱 | ⬜ | | |
| ch8 | 8.3 CronJob | ⬜ | | |
| ch9 | 9.1 저장소 분석 | ⬜ | | |
| ch9 | 9.2 회고 | ⬜ | | |
| ch9 | 9.3 온보딩 문서 | ⬜ | | |
| ch9 | 9.4 GitAIOps 분석 | ⬜ | | |
| ch9 | 9.5 마무리 | ⬜ | | |

## 도구 선택 기록

독자가 3-프롬프트 패턴(탐색→비교→실행)에서 실제로 선택한 도구와 이유를 기록한다.

| 영역 | 선택 | 검토한 대안 | 선택 이유 |
|------|------|-----------|----------|
| | | | |

## 현재 버전

| 컴포넌트 | 버전 | 변경 이력 |
|---------|------|----------|
| Go | 1.25 | 2026-07-04 최초 설정 (ch6 valkey-go, ch8 OTel SDK 호환을 위해 처음부터 1.25) |
| Notiflex 이미지 | v0.1.0 | 2026-07-04 최초 빌드 |
| ArgoCD | | |
| Kafka | | |
| OTel SDK | | |

## 현재 리소스

| 노드풀 | 머신 타입 | 노드 수 | 주요 워크로드 |
|--------|----------|---------|-------------|
| default-pool | e2-medium (Spot) | 2 | notiflex-api (replicas: 2) |

## 트러블슈팅 이력

독자가 겪은 문제와 해결 방법을 기록한다. 같은 문제를 다시 겪지 않도록 한다.

| 챕터 | 문제 | 해결 |
|------|------|------|
| ch2.3 | `gcloud auth application-default login` 브라우저 인증 시 cloud-platform 스코프 미동의 에러 | 재시도 시 동의 화면에서 모든 권한 항목 체크 후 허용 |
| ch2.3 | 신규 프로젝트에 결제 계정이 연결되지 않아 Compute API 활성화 실패 | `gcloud billing projects link`로 결제 계정 연결 후 재시도 |
| ch2.5 | `gke-gcloud-auth-plugin` 미설치로 kubectl 인증 경고 | `gcloud components install gke-gcloud-auth-plugin` 설치, `USE_GKE_GCLOUD_AUTH_PLUGIN=True`를 `~/.zshrc`에 등록 |
| ch2.5 | 클러스터 생성 시 `--gateway-api=standard`가 반영되지 않음 (GatewayClass 없음) | `gcloud container clusters update --gateway-api=standard`로 재적용 (2~3분 소요) |
| ch2.6 | Cloud Build API 비활성화로 이미지 빌드 실패 | `gcloud services enable cloudbuild.googleapis.com` 후 서비스 계정 전파 대기(약 45초) 후 재시도 |

 

 

7. /update-docs 스킬 만들기

각 장의 실습이 끝나면 지금까지 작업한 내용을 문서로 정리하는 작업이 필요합니다. 프롬프트 대신 클로드 스킬을 만들어서 모든 장에서 재사용할 수 있게 스킬을 만들겠습니다.

/update-docs라는 커스텀 스킬을 만들어줘. 각 장 마지막에 저장소 문서의 신규 추가와 기존 내용 변경을 모두 감지해 그 시점까지의 작업 기준으로 갱신하고 변경 사항을 머킷해야해 
ㅇ이후 장에서 새 문서가 추가되어도 같은 스킬이 동작하도록 설계해줘 

 

 

궁금증. 실습 예제 시나리오는 하네스 엔지니어링인가?

 

소감

클로드코드를 통해 신규 클러스터를 구성하여 애플리케이션을 배포하였고, 개발 내용을 깃허브에 업로드하였습니다. 확실히 자연어로만 편하지만, 정확도 측면에서 책과는 맞지가 않은 경우가 있었습니다.

또한, 저자님의 지침대로 실행하는 면이 있어 나중에 gitops영역 외 업무 영역을 적용하는데 지침을 따로 만들어야하는 생각이 듭니다.