kubectl 실전 명령어 치트시트 (Kubernetes 클러스터 운영)
kubectl은 Kubernetes 클러스터를 제어하는 CLI 도구입니다. 초창기에는 명령어가 생소해서 하나씩 적어가며 익혔는데, 지금 보면 추억이 새록새록합니다. 자주 쓰는 명령어를 카테고리별로 정리합니다.
기본 조회
shell
# 노드 상태 확인
$ kubectl get nodes
$ kubectl get nodes -o wide # IP, OS 등 상세 정보 포함
# 전체 Pod 목록 (특정 네임스페이스)
$ kubectl get pods -n <namespace>
$ kubectl get pods --all-namespaces # 전체 네임스페이스
# 특정 라벨의 Pod만 필터
$ kubectl get pods -l app=web-portal
# 실시간 모니터링 (watch)
$ kubectl get pods -wPod 상세 정보 & 로그
shell
# Pod 상세 이벤트 조회 (오류 디버깅 핵심!)
$ kubectl describe pod <POD_NAME>
$ kubectl describe pod <POD_NAME> -n <namespace>
# 로그 출력
$ kubectl logs <POD_NAME>
# 실시간 로그 스트리밍 (-f = follow)
$ kubectl logs -f <POD_NAME>
# 여러 컨테이너가 있는 Pod에서 특정 컨테이너 로그
$ kubectl logs <POD_NAME> -c <CONTAINER_NAME>
# 이전에 죽은 컨테이너의 로그 (재시작 원인 분석)
$ kubectl logs <POD_NAME> --previous
# 최근 100줄만 출력
$ kubectl logs <POD_NAME> --tail=100Pod 내부 접속 & 명령 실행
shell
# Pod 쉘 접속 (bash 또는 sh)
$ kubectl exec -it <POD_NAME> -- /bin/bash
$ kubectl exec -it <POD_NAME> -- /bin/sh
# 특정 컨테이너 지정
$ kubectl exec -it <POD_NAME> -c <CONTAINER_NAME> -- /bin/bash
# 단일 명령어 실행 (Cassandra nodetool 등)
$ kubectl exec -it cassandra-0 -- nodetool status
# 파일 복사 (로컬 ↔ Pod)
$ kubectl cp <POD_NAME>:/path/to/file ./local-file
$ kubectl cp ./local-file <POD_NAME>:/path/to/file리소스 생성 / 수정 / 삭제
shell
# YAML로 리소스 생성
$ kubectl apply -f deployment.yaml # apply: 있으면 업데이트, 없으면 생성
$ kubectl create -f deployment.yaml # create: 이미 있으면 오류
# 여러 파일 한번에 (디렉터리 적용)
$ kubectl apply -f ./manifests/
# 실시간 리소스 수정 (에디터 열림)
$ kubectl edit deployment <DEPLOY_NAME>
$ kubectl edit configmap coredns -n kube-system
# 리소스 삭제
$ kubectl delete pod <POD_NAME>
$ kubectl delete -f deployment.yaml # YAML 기반 삭제
# Pod 강제 삭제 (Terminating 상태 해제)
$ kubectl delete pod <POD_NAME> --force --grace-period=0Deployment 롤아웃 관리
shell
# 롤아웃 상태 확인
$ kubectl rollout status deployment/<DEPLOY_NAME>
# 롤아웃 히스토리 조회
$ kubectl rollout history deployment/<DEPLOY_NAME>
# 이전 버전으로 즉시 롤백
$ kubectl rollout undo deployment/<DEPLOY_NAME>
# 특정 리비전으로 롤백
$ kubectl rollout undo deployment/<DEPLOY_NAME> --to-revision=2
# 이미지 버전 업데이트 (무중단 롤링 배포 시작)
$ kubectl set image deployment/<DEPLOY_NAME> \
<CONTAINER_NAME>=myregistry/app:2.1
# Deployment 재시작 (Pod 순차 재기동)
$ kubectl rollout restart deployment/<DEPLOY_NAME>스케일링
shell
# 수동 스케일 (Pod 수 조정)
$ kubectl scale deployment <DEPLOY_NAME> --replicas=5
# HPA (자동 스케일) 설정
$ kubectl autoscale deployment <DEPLOY_NAME> \
--cpu-percent=70 --min=2 --max=10
# HPA 상태 확인
$ kubectl get hpaConfigMap & Secret
shell
# ConfigMap 조회
$ kubectl get configmap
$ kubectl describe configmap <NAME>
# ConfigMap 수정
$ kubectl edit configmap <NAME> -n kube-system
# Secret 조회 (Base64 인코딩 상태)
$ kubectl get secret <NAME> -o yaml
# Secret 값 디코딩하여 조회
$ kubectl get secret <NAME> \
-o jsonpath='{.data.password}' | base64 -d
# 서비스 어카운트 토큰 추출
$ kubectl get secrets \
-o jsonpath="{.items[?(@.metadata.annotations['kubernetes\.io/service-account\.name']=='default')].data.token}" \
| base64 -d네트워크 & 서비스
shell
# 서비스 목록 및 포트 확인
$ kubectl get svc
$ kubectl get svc -o wide
# 서비스 상세 정보 (엔드포인트 확인)
$ kubectl describe svc <SERVICE_NAME>
# 로컬에서 특정 Pod/Service로 포트 포워딩 (임시 접속 테스트)
$ kubectl port-forward pod/<POD_NAME> 8080:8080
$ kubectl port-forward svc/<SERVICE_NAME> 8080:80
# 클러스터 내부 DNS 테스트 (임시 디버깅 Pod 실행)
$ kubectl run debug --image=busybox --rm -it --restart=Never \
-- nslookup web-portal-svc네임스페이스
shell
# 네임스페이스 목록
$ kubectl get namespaces
# 특정 네임스페이스 리소스 전체 조회
$ kubectl get all -n <namespace>
# 기본 네임스페이스 변경 (매번 -n 안 붙여도 되게)
$ kubectl config set-context --current --namespace=<namespace>리소스 사용량 확인
shell
# Node별 CPU/Memory 사용량 (metrics-server 필요)
$ kubectl top nodes
# Pod별 사용량
$ kubectl top pods
$ kubectl top pods --sort-by=memory # 메모리 순 정렬
# 특정 컨테이너 리소스 제한 확인
$ kubectl describe pod <POD_NAME> | grep -A5 "Limits:\|Requests:"자주 쓰는 플래그 요약
| 플래그 | 의미 |
|---|---|
-n <namespace> | 네임스페이스 지정 |
-o wide | 추가 정보 포함 출력 |
-o yaml | YAML 형식으로 출력 |
-o jsonpath='{...}' | JSON 경로로 특정 값 추출 |
-l key=value | 라벨 셀렉터 필터 |
-w | 실시간 변화 감지 (watch) |
--all-namespaces / -A | 전체 네임스페이스 |
--dry-run=client | 실제 적용 없이 검증만 |
Last updated on