TIL

쿠버네티스 기본기 (공식 인터랙티브 튜토리얼 정리)

1. 클러스터 생성

kubectl cluster-info      # API 서버 및 addons 엔드포인트
kubectl get nodes         # 클러스터 노드 목록과 상태

2. 앱 배포 — Deployment

3. 앱 탐색 — Pod와 Node

4. 앱 노출 — Service

Service Type

Type 용도
ClusterIP 클러스터 내부 전용 가상 IP (기본값)
NodePort 각 노드의 지정된 포트를 통해 외부에 노출
LoadBalancer 클라우드 LB를 자동 프로비저닝. GKE에선 GCP 네트워크 LB가 생성됨
ExternalName 외부 DNS 이름에 대한 CNAME 별칭
kubectl expose deployment <name> --type=LoadBalancer --port=8080
kubectl get services

5. 앱 스케일 — Replica

kubectl scale deployment <name> --replicas=4

6. 앱 업데이트 — Rolling Update

kubectl set image deployment/<name> <container>=<new-image>  # 새 버전 배포
kubectl rollout status deployment/<name>                     # 진행 상태 확인
kubectl rollout undo deployment/<name>                       # 직전 리비전으로 롤백

부록: 명령형 vs 선언형 — 실무는 YAML 기반

방식 예시 권장 환경
명령형 커맨드 kubectl create deployment nginx --image=nginx 학습, 일회성 작업
명령형 오브젝트 설정 kubectl create -f nginx.yaml, kubectl replace -f nginx.yaml 소규모 프로덕션
선언형 오브젝트 설정 kubectl apply -f configs/ 프로덕션 운영 (실무 표준)

Deployment + Service 최소 YAML

Deployment 하나와 그 앞에 붙는 Service 하나를 한 파일에 묶은 전형적인 최소 예시. --- 로 두 오브젝트를 구분한다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 3                       # Pod 복제본 개수 (ReplicaSet이 유지)
  selector:
    matchLabels:
      app: nginx                    # 관리 대상 Pod를 고르는 조건
  template:                         # 이 템플릿으로 Pod 생성
    metadata:
      labels:
        app: nginx                  # selector와 반드시 일치해야 함
    spec:
      containers:
        - name: nginx
          image: nginx:1.14.2
          ports:
            - containerPort: 80     # 컨테이너가 실제로 리스닝하는 포트
---
apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  # type 생략 시 ClusterIP(내부 전용). 외부 노출엔 NodePort / LoadBalancer
  selector:
    app: nginx                      # 위 Deployment가 만든 Pod와 같은 라벨 → 트래픽 전달 대상
  ports:
    - port: 80                      # Service가 수신 (클라이언트가 붙는 포트)
      targetPort: 80                # Pod의 containerPort로 전달

필드 계층

Deployment
├─ metadata
│  └─ name
└─ spec                        # Deployment의 원하는 상태
   ├─ replicas                 # 유지할 Pod 개수
   ├─ selector                 # "어떤 Pod를 내 것으로 관리할지"
   │  └─ matchLabels
   └─ template                 # "새 Pod를 어떻게 만들지" = Pod 정의 그 자체
      ├─ metadata              #   └ 생성될 Pod의 식별 정보
      │  └─ labels             #     selector가 매칭할 라벨
      └─ spec                  #   └ 생성될 Pod의 spec
         └─ containers[]       #     컨테이너 리스트 (image, ports 등)

Service
├─ metadata
│  └─ name
└─ spec                        # Service의 원하는 상태
   ├─ type                     # 생략 시 ClusterIP
   ├─ selector                 # "어떤 Pod로 트래픽을 보낼지"
   └─ ports[]
      ├─ port                  # Service 수신 포트
      └─ targetPort            # Pod 수신 포트 (= containerPort)

참고 자료

부록: Namespace

네임스페이스 용도
default 네임스페이스를 지정하지 않으면 여기로 간다. 프로덕션에선 사용 지양
kube-system 쿠버네티스 시스템이 생성한 오브젝트 (kube-dns, kube-proxy 등)
kube-public 모든 클라이언트(미인증 포함)가 읽을 수 있는 공개 공간
kube-node-lease 노드 헬스체크용 Lease 오브젝트

참고 자료

부록: ECS 경험자를 위한 개념 매핑

ECS Kubernetes 역할
Cluster Cluster 컨테이너 실행 환경 전체
Container Instance (EC2) / Fargate Node 태스크·Pod가 실제로 도는 머신
Task Pod 컨테이너 1~N개의 실행 단위
Task Definition Deployment의 spec.template 어떤 이미지·자원으로 띄울지 청사진
Service Deployment 원하는 개수 유지, 롤링 업데이트 담당
Target Group Service (k8s) Pod 집합에 대한 안정적 네트워크 엔드포인트
ALB + 리스너 규칙 Ingress (or Gateway API) 경로·호스트 기반 L7 라우팅

“Service” 용어 함정

참고 자료