Skip to Content
Infra & DevOpsK8s kubectl 실전 명령어 치트시트
☁️ Infra & DevOps2019년 3월 6일

K8s kubectl 실전 명령어 치트시트

#kubernetes#k8s#kubectl#cheatsheet#devops

kubectl은 Kubernetes 클러스터를 제어하는 CLI 도구입니다. 초창기에는 명령어가 생소해서 하나씩 적어가며 익혔는데, 지금 보면 추억이 새록새록합니다.

1. 빠른 장애 대응을 위한 CLI 치트시트 필요성

인프라 팀 유관부서와 백엔드 개발자들이 쿠버네티스(K8s) 위에서 빅데이터/AI 통합 플랫폼 마이크로서비스를 운영하면서, 대시보드(Web UI)만으로는 해결할 수 없는 즉각적인 쉘 레벨의 디버깅 커맨드들이 필요했습니다. 특히 K8s 시스템 내부 설정(ConfigMap)을 라이브로 변경하거나, 파드 내부의 데이터베이스(ex. Cassandra 등) 상태를 점검하기 위해 매번 구글링을 하는 시간을 아끼고자 사내 위키에 자주 쓰는 kubectl 명령어를 기록해두었던 것을 블로그로 정리합니다.

아무리 훌륭한 GitOps 툴체인(ArgoCD 등)이나 랜치(Rancher) 같은 웹 UI가 도입되더라도, K8s 관리자에게 kubectl은 리눅스의 bash나 다름없는 기본기입니다. 인프라 데브옵스는 describe 로 뿜어지는 Event 내용과 exec 명령 하나만으로 컨테이너 내부 네트워크 핑을 때려보는 직관을 가져야 합니다.


2. 기본 조회

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 -w

3. Pod 상세 정보 & 로그

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=100

4. Pod 내부 접속 & 명령 실행

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

5. 리소스 생성 / 수정 / 삭제

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=0

6. Deployment 롤아웃 관리

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>

7. 스케일링

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 hpa

8. ConfigMap & 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

9. 네트워크 & 서비스

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

10. 네임스페이스

shell
# 네임스페이스 목록 $ kubectl get namespaces # 특정 네임스페이스 리소스 전체 조회 $ kubectl get all -n <namespace> # 기본 네임스페이스 변경 (매번 -n 안 붙여도 되게) $ kubectl config set-context --current --namespace=<namespace>

11. 리소스 사용량 확인

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:"

12. 자주 쓰는 플래그 요약

플래그의미
-n <namespace>네임스페이스 지정
-o wide추가 정보 포함 출력
-o yamlYAML 형식으로 출력
-o jsonpath='{...}'JSON 경로로 특정 값 추출
-l key=value라벨 셀렉터 필터
-w실시간 변화 감지 (watch)
--all-namespaces / -A전체 네임스페이스
--dry-run=client실제 적용 없이 검증만
Last updated on