☸️
컨테이너 오케스트레이션 · 기초

Kubernetes 기초 가이드

👥 방문자 수

현대 인프라의 표준, Kubernetes의 핵심 개념부터 기본 리소스까지 체계적으로 학습합니다. 아키텍처, Pod, Deployment, Service 등 필수 리소스 관리 기법을 실무 예제로 정리했습니다.

K8s 1.30 kubectl 기초 클라우드 네이티브

1. Kubernetes란?

Kubernetes(K8s)는 컨테이너화된 애플리케이션의 배포, 확장, 자가 치유를 자동화하는 오픈소스 오케스트레이션 플랫폼입니다. Google이 내부 시스템 Borg를 기반으로 개발하고 CNCF에 기부했습니다.

기능설명
자동 배포 & 롤백선언적 설정으로 롤링 업데이트, 문제 시 자동 롤백
자가 치유Pod 비정상 종료 시 자동 재시작, 노드 장애 시 재스케줄링
수평 스케일링CPU/메모리 기반 Pod 수 자동 조정 (HPA)
서비스 디스커버리DNS 기반 서비스 간 통신, 로드 밸런싱
설정 관리ConfigMap/Secret으로 환경 설정 분리

2. 아키텍처

구성 요소역할
Control Plane
kube-apiserver모든 요청의 진입점. kubectl과 통신
etcd클러스터 상태 저장소 (분산 key-value)
kube-schedulerPod를 어떤 노드에 배치할지 결정
kube-controller-manager원하는 상태 유지 (ReplicaSet, Deployment 등)
Worker Node
kubelet노드 에이전트. Pod 실행 및 상태 보고
kube-proxy네트워크 규칙 관리 (Service 라우팅)
Container Runtimecontainerd / CRI-O (실제 컨테이너 실행)

3. kubectl 설치 & 기본 명령어

# 설치 (macOS)
brew install kubectl
kubectl version --client

# 로컬 개발 클러스터
brew install minikube
minikube start
minikube dashboard  # 웹 UIbash
# ── 자주 쓰는 kubectl 명령어 ────────────────────────
kubectl get pods                           # 현재 네임스페이스 Pod
kubectl get pods -n kube-system            # 특정 네임스페이스
kubectl get pods -A                        # 전체 네임스페이스
kubectl get pods -o wide                   # 노드 정보 포함
kubectl get all                            # Pod,Service,Deployment 한 번에

kubectl describe pod                 # 상세 이벤트 확인
kubectl logs  -f --tail=100          # 로그 스트리밍
kubectl logs  -c          # 멀티컨테이너 Pod 특정 컨테이너
kubectl exec -it  -- bash            # 컨테이너 접속

kubectl apply  -f manifest.yaml           # 선언적 적용 (생성/업데이트)
kubectl delete -f manifest.yaml           # 삭제
kubectl delete pod  --grace-period=0 # 강제 삭제

kubectl port-forward pod/ 8080:80   # 로컬 포트 포워딩

# 컨텍스트 관리
kubectl config get-contexts
kubectl config use-context prod-clusterbash

4. Pod

Pod는 K8s의 최소 배포 단위입니다. 하나 이상의 컨테이너를 묶어 같은 네트워크와 스토리지를 공유합니다. 직접 Pod를 만들기보다 Deployment를 통해 관리합니다.

apiVersion: v1
kind: Pod
metadata:
  name: myapp
  labels:
    app: myapp
    version: "1.0"
spec:
  containers:
  - name: app
    image: myapp:1.0.0
    ports:
    - containerPort: 3000
    resources:
      requests:               # 스케줄러가 노드 선택에 사용
        cpu: "100m"           # 0.1 vCPU
        memory: "128Mi"
      limits:                 # 초과 시 OOMKilled / CPU Throttle
        cpu: "500m"
        memory: "512Mi"
    env:
    - name: NODE_ENV
      value: production
    livenessProbe:            # 비정상이면 재시작
      httpGet:
        path: /health
        port: 3000
      initialDelaySeconds: 10
      periodSeconds: 15
    readinessProbe:           # 준비 완료 전 트래픽 차단
      httpGet:
        path: /ready
        port: 3000
      initialDelaySeconds: 5
      periodSeconds: 5yaml

5. Deployment & 롤링 업데이트

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp
  namespace: production
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1          # 최대 초과 Pod (1개 추가 생성)
      maxUnavailable: 0    # 최대 중단 Pod (무중단 배포)
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: app
        image: myapp:2.0.0  # 이미지 버전만 바꾸면 롤링 업데이트
        resources:
          requests: { cpu: "100m", memory: "128Mi" }
          limits:   { cpu: "500m", memory: "512Mi" }
        livenessProbe:
          httpGet: { path: /health, port: 3000 }
          periodSeconds: 10yaml
# 롤링 업데이트 & 롤백
kubectl set image deployment/myapp app=myapp:2.1.0  # 이미지 업데이트
kubectl rollout status deployment/myapp             # 업데이트 상태 확인
kubectl rollout history deployment/myapp            # 히스토리
kubectl rollout undo deployment/myapp               # 이전 버전으로 롤백
kubectl rollout undo deployment/myapp --to-revision=2  # 특정 버전으로bash

6. Service

Service는 Pod 그룹에 안정적인 DNS 이름과 IP를 부여하고 로드 밸런싱을 담당합니다.

# ClusterIP (기본): 클러스터 내부에서만 접근
apiVersion: v1
kind: Service
metadata:
  name: myapp
spec:
  selector:
    app: myapp      # 이 라벨을 가진 Pod로 트래픽 전달
  ports:
  - port: 80        # Service 포트
    targetPort: 3000 # Pod 포트
  type: ClusterIP

---
# NodePort: 노드 IP + 포트로 외부 접근
spec:
  type: NodePort
  ports:
  - port: 80
    targetPort: 3000
    nodePort: 30080   # 30000-32767 범위

---
# LoadBalancer: 클라우드 LB 자동 생성 (AWS ELB, GCP LB 등)
spec:
  type: LoadBalancer
  ports:
  - port: 443
    targetPort: 3000yaml

7. 다음 단계

🚀
기초를 마쳤다면?

ConfigMap/Secret, Ingress, HPA, Helm 등 프로덕션 배포에 필요한 내용은 Kubernetes 실전/심화 가이드에서 이어집니다.

연계 가이드: Docker 가이드 · Linux 가이드 · 📊 Prometheus+Grafana 가이드