Kubernetes 소개
Kubernetes 개념 소개입니다. control plane, worker node, Pod, Deployment, Service, 선언형 apply, 기본 YAML 구조와 학습 순서를 정리했습니다.
Kubernetes는 컨테이너화된 애플리케이션을 여러 서버 위에서 선언적으로 배포하고 운영하기 위한 오픈소스 플랫폼입니다. 단순히 컨테이너를 실행하는 도구가 아니라, 원하는 상태를 API에 선언하면 컨트롤 플레인이 현재 상태를 계속 맞춰 가는 시스템입니다.
처음 배울 때는 설치 명령보다 구조를 먼저 잡는 편이 좋습니다. Kubernetes에서 중요한 질문은 “컨테이너를 어떻게 띄우나”가 아니라 “어떤 객체로 상태를 선언하고, 장애가 났을 때 누가 복구하나”입니다.
기본 구성요소
- API Server: 모든 요청이 들어오는 Kubernetes API 진입점입니다.
- etcd: 클러스터 상태를 저장하는 key-value 저장소입니다.
- Scheduler: 새 Pod를 어느 Node에 배치할지 결정합니다.
- Controller Manager: Deployment, Node, Job 같은 객체의 desired state를 맞춥니다.
- kubelet: 각 Node에서 Pod 실행 상태를 관리합니다.
- kube-proxy/CNI: Service 네트워크와 Pod 네트워크 연결을 담당합니다.
자주 쓰는 객체
Pod: 하나 이상의 컨테이너를 묶는 최소 실행 단위입니다.Deployment: Pod 복제본과 rolling update를 관리합니다.Service: Pod가 바뀌어도 접근 가능한 고정 endpoint를 제공합니다.Ingress: HTTP/HTTPS 외부 진입 규칙을 정의합니다.ConfigMap,Secret: 설정값과 민감값을 애플리케이션에 주입합니다.PersistentVolumeClaim: Pod가 사용할 스토리지를 요청합니다.
가장 작은 배포 예시
kubectl create deployment web --image=nginx:1.27 --replicas=2
kubectl expose deployment web --port=80 --target-port=80 --type=ClusterIP
kubectl get deployment,pod,svc
명령형으로 시작할 수는 있지만 운영에서는 YAML을 Git에 두고 kubectl apply로 반영하는 선언형 방식이 더 추적하기 좋습니다.
kubectl create deployment web --image=nginx:1.27 --replicas=2 --dry-run=client -o yaml > web-deployment.yaml
kubectl apply -f web-deployment.yaml
kubectl rollout status deployment/web
YAML을 읽는 기준
apiVersion: apps/v1
kind: Deployment
metadata:
name: web
spec:
replicas: 2
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: nginx
image: nginx:1.27
ports:
- containerPort: 80
metadata.name은 객체 이름이고, spec은 원하는 상태입니다. Deployment의 selector와 Pod template의 label이 맞지 않으면 Deployment가 Pod를 제대로 관리하지 못합니다.
운영에서 먼저 확인할 명령
kubectl cluster-info
kubectl get nodes -o wide
kubectl get pods -A
kubectl get events -A --sort-by=.lastTimestamp
kubectl top nodes
kubectl top pods -A
kubectl top은 metrics-server가 있어야 동작합니다. 값이 안 나온다고 바로 장애로 보지 말고 metrics-server 배포 여부를 확인합니다.
학습 순서
- Docker나 containerd로 컨테이너 기본을 이해합니다.
- Minikube, kind 같은 로컬 클러스터에서 Pod/Deployment/Service를 실습합니다.
- kubectl get/describe/logs/exec/apply/rollout 명령을 손에 익힙니다.
- Kustomize나 Helm으로 환경별 배포 구성을 분리합니다.
- 운영 단계에서는 모니터링, 로그, 백업, 네트워크 정책, 권한 관리를 함께 설계합니다.
주의할 점
- Kubernetes는 애플리케이션 설계를 대신해 주지 않습니다. readiness/liveness probe, graceful shutdown, 외부 DB 연결 정책은 애플리케이션이 맞춰야 합니다.
- Secret은 base64 인코딩일 뿐 암호화가 아닙니다. Git에 실제 값이나 인코딩 값을 올리지 않습니다.
- Node 장애, control plane 장애, storage 장애는 서로 다른 복구 절차가 필요합니다.
- 학습용 단일 노드와 운영용 HA 클러스터는 요구사항이 다릅니다.