kubectl cluster-info # API 서버 및 addons 엔드포인트
kubectl get nodes # 클러스터 노드 목록과 상태
kubectl create deployment <name> --image=<image> 로 앱을 올리면 다음 계층이 자동 구성된다.
kubectl get <resource> — 리소스 목록kubectl describe <resource> <name> — 상세 상태와 이벤트 기록kubectl logs <pod> — 컨테이너 stdout 로그kubectl exec <pod> -- <cmd> — Pod 내부 명령 실행 (Docker exec와 같은 감각)app=frontend 라벨이 붙은 Pod 전체)| Type | 용도 |
|---|---|
ClusterIP |
클러스터 내부 전용 가상 IP (기본값) |
NodePort |
각 노드의 지정된 포트를 통해 외부에 노출 |
LoadBalancer |
클라우드 LB를 자동 프로비저닝. GKE에선 GCP 네트워크 LB가 생성됨 |
ExternalName |
외부 DNS 이름에 대한 CNAME 별칭 |
kubectl expose deployment <name> --type=LoadBalancer --port=8080
kubectl get services
replicas 값을 조정하면 ReplicaSet이 그 개수만큼 Pod를 맞춘다.kube-proxy가 iptables/IPVS 규칙을 관리kubectl scale deployment <name> --replicas=4
rollout history로 리비전 스펙 확인 및 특정 리비전으로 롤백 가능maxSurge: 초과 허용 개수maxUnavailable: 동시에 죽일 수 있는 개수kubectl set image deployment/<name> <container>=<new-image> # 새 버전 배포
kubectl rollout status deployment/<name> # 진행 상태 확인
kubectl rollout undo deployment/<name> # 직전 리비전으로 롤백
kubectl create deployment, kubectl expose, kubectl scale 같은 명령형(imperative) 커맨드 위주다.
kubectl apply -f로 적용
| 방식 | 예시 | 권장 환경 |
|---|---|---|
| 명령형 커맨드 | kubectl create deployment nginx --image=nginx |
학습, 일회성 작업 |
| 명령형 오브젝트 설정 | kubectl create -f nginx.yaml, kubectl replace -f nginx.yaml |
소규모 프로덕션 |
| 선언형 오브젝트 설정 | kubectl apply -f configs/ |
프로덕션 운영 (실무 표준) |
kubectl create vs kubectl apply
create: 처음만 가능. 이미 있으면 에러. 외부 변경분 손실apply: 멱등(idempotent). 생성/업데이트 모두 처리. 외부 변경분 보존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로 전달
apiVersion — API 그룹/버전kind — 리소스 종류metadata — 오브젝트 자신의 식별 정보 (이름, 라벨, 네임스페이스)spec — 원하는 상태. 내용은 리소스 종류마다 다름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)
spec.template 안에 또 metadata와 spec이 나타난다.
spec = Deployment의 원하는 상태spec (= template.spec) = Pod의 원하는 상태template은 Pod 매니페스트 한 덩어리가 통째로 들어가는 자리다.selector 매칭 규칙
spec.selector.matchLabels == Pod template.metadata.labelsspec.selector == 붙잡을 Pod의 metadata.labels| 네임스페이스 | 용도 |
|---|---|
default |
네임스페이스를 지정하지 않으면 여기로 간다. 프로덕션에선 사용 지양 |
kube-system |
쿠버네티스 시스템이 생성한 오브젝트 (kube-dns, kube-proxy 등) |
kube-public |
모든 클라이언트(미인증 포함)가 읽을 수 있는 공개 공간 |
kube-node-lease |
노드 헬스체크용 Lease 오브젝트 |
kubectl get pods -n <namespace>kubectl config set-context --current --namespace=<namespace><service>.<namespace>.svc.cluster.local 로 등록됨<service> 만으로 호출 가능| 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 라우팅 |