Kubernetes 명령어 요약

1. `kubectl get`: 리소스 목록 조회

하나 이상의 리소스 정보를 조회합니다. 출력 형식을 지정할 수 있습니다.

# 파드 내 컨테이너 이름 조회 (init 컨테이너 제외)
kubectl get pods <POD_NAME> -o jsonpath='{.spec.containers[*].name}' -n <namespace>

# init 컨테이너 이름 조회
kubectl get pods <POD_NAME> -o jsonpath='{.spec.initContainers[*].name}' -n <namespace>

# 모든 컨테이너 이름 조회
kubectl get pod <POD_NAME> -o jsonpath="{.spec['containers','initContainers'][*].name}" -n <namespace>

# 특정 노드에서 실행 중인 모든 파드 조회 (상세 정보 포함)
kubectl get pod -o wide --field-selector=spec.nodeName=<node_name> -A

# 컴포넌트 상태 조회
kubectl get cs

# 파드 목록 상세 정보 조회 (노드명 포함)
kubectl get pods -n <namespace> -o wide
kubectl get pods -A -o wide # 모든 네임스페이스

# 클러스터 노드 정보 조회
kubectl get nodes

# 클러스터 네임스페이스 조회
kubectl get ns

# 특정 네임스페이스의 서비스 조회
kubectl get svc -n kube-system

# 모든 레플리카 컨트롤러 및 서비스 조회
kubectl get rc,services -A

# 모든 데몬셋 조회 (미초기화된 데몬셋 포함)
kubectl get daemonsets -A

# 특정 파드의 레이블 정보 조회
kubectl get pod <pod-name> --show-labels -n <namespace>

# 특정 레이블을 가진 파드 조회
kubectl get pods -l app=<example> -n <namespace>
  

2. `kubectl describe`: 리소스 상세 정보 조회

지정된 리소스의 상세 상태를 표시합니다.

# 특정 노드의 상세 정보 조회
kubectl describe nodes <node-name>

# 특정 파드의 상세 정보 조회
kubectl describe pods <pod-name> -n <namespace>

# 특정 서비스의 상세 정보 조회
kubectl describe svc <svc-name> -n <namespace>
  

3. `kubectl delete`: 리소스 삭제

파일, 레이블 선택기, 이름 등으로 리소스를 삭제합니다.

# pod.yaml 파일로 파드 삭제
kubectl delete -f pod.yaml

# 특정 레이블을 가진 모든 파드 및 서비스 삭제
kubectl delete pods,services -l name=<label-name> -n <namespace>

# 모든 파드 삭제 (미초기화된 파드 포함)
kubectl delete pods -A
  

4. `kubectl exec`: 컨테이너 명령 실행

실행 중인 파드의 컨테이너 내에서 명령을 실행합니다.

# 파드에서 'date' 명령 실행 결과 조회
kubectl exec -it <pod-name> -n <namespace> -- date

# 특정 컨테이너에서 'date' 명령 실행 결과 조회
kubectl exec -it <pod-name> -c <container-name> -n <namespace> -- date

# 파드에서 bash 쉘 실행 (대화형)
kubectl exec -it <pod-name> -n <namespace> -- /bin/bash
  

5. `kubectl logs`: 리소스 로그 조회

파드 내 컨테이너의 로그를 조회합니다. `-f` 옵션으로 실시간 로그 스트리밍이 가능합니다.

# 특정 파드의 로그 조회
kubectl logs <pod-name> -n <namespace>

# 로그 스트리밍 및 최근 1000줄 조회
kubectl logs <pod-name> -n <namespace> -f --tail=1000
  

6. `kubectl run`: 컨테이너 이미지 실행

클러스터 내에 컨테이너 이미지를 생성하고 실행합니다.

# nginx 컨테이너 3개 생성 (app=example 레이블, 80 포트)
kubectl run nginx --replicas=3 --labels="app=example" --image=nginx:1.10 --port=80

# 특정 노드(k8s-node1)에 nginx 컨테이너 3개 생성
kubectl run nginx --image=nginx:1.10 --replicas=3 --labels="app=example" --port=80 --overrides='{"apiVersion":"apps/v1","spec":{"template":{"spec":{"nodeSelector":{"kubernetes.io/hostname":"k8s-node1"}}}}}'
  

7. `kubectl expose`: 서비스 생성

파드 또는 다른 리소스를 외부에서 접근 가능하도록 서비스로 노출합니다.

# nginx 배포판을 NodePort 타입 서비스로 노출 (내부 80포트 -> 외부 88포트)
kubectl expose deployment nginx --port=88 --type=NodePort --target-port=80 --name=nginx-service

# ReplicationController 'streamer'가 관리하는 파드를 UDP 4100 포트로 노출
kubectl expose rc streamer --port=4100 --protocol=UDP --name=video-stream
  

8. `kubectl set`: 리소스 설정 변경

리소스의 환경 변수, 이미지, 리소스 요청/제한 등을 설정하거나 수정합니다.

# deployment 'nginx'의 컨테이너 'nginx' CPU 제한 200m, 메모리 512Mi 설정
kubectl set resources deployment nginx -c=nginx --limits=cpu=200m,memory=512Mi

# 모든 'nginx' 컨테이너의 요청 및 제한 설정
kubectl set resources deployment nginx --limits=cpu=200m,memory=512Mi --requests=cpu=100m,memory=256Mi

# 컨테이너 리소스 제한/요청 삭제
kubectl set resources deployment nginx --limits=cpu=0,memory=0 --requests=cpu=0,memory=0

# Service 리소스의 selector 설정 (주의: 현재 Service 객체에만 적용 가능)
kubectl set selector service my-service app=new-label

# deployment 'nginx'의 컨테이너 'nginx' 이미지 업데이트
kubectl set image deployment/nginx nginx=nginx:1.9.1

# 모든 deployment 및 rc의 'nginx' 컨테이너 이미지 업데이트
kubectl set image deployments,rc nginx=nginx:1.9.1 --all

# daemonset 'abc'의 모든 컨테이너 이미지 업데이트
kubectl set image daemonset abc *=nginx:1.9.1

# 로컬 파일로 이미지 업데이트
kubectl set image -f path/to/file.yaml nginx=nginx:1.9.1 --local -o yaml
  

9. `kubectl explain`: 리소스 문서 조회

Kubernetes 리소스의 구조 및 속성에 대한 문서를 조회합니다.

# ReplicaSet(rs) 리소스 설명 조회
kubectl explain rs

# apps/v1 API 버전의 Deployment 설명 조회
kubectl explain deployments --api-version=apps/v1
  

10. `kubectl edit`: 리소스 편집

지정된 리소스를 YAML 형식으로 편집합니다.

# Deployment 'nginx' 편집
kubectl edit deployment nginx -n <namespace>

# Service 타입의 'nginx' 편집
kubectl edit service/nginx -n <namespace>
  

11. `kubectl label`: 리소스 레이블 수정

리소스에 레이블을 추가, 수정 또는 삭제합니다. `--overwrite` 옵션으로 기존 값을 덮어쓸 수 있습니다.

# 파드 'foo'에 'unhealthy=true' 레이블 추가
kubectl label pods foo unhealthy=true

# 파드 'foo'의 'status' 레이블 값을 'unhealthy'로 변경 (기존 값 덮어쓰기)
kubectl label --overwrite pods foo status=unhealthy

# 모든 파드에 'status=unhealthy' 레이블 추가
kubectl label pods --all status=unhealthy

# 특정 리소스 버전('1')일 때만 레이블 업데이트
kubectl label pods foo status=unhealthy --resource-version=1
  

12. `kubectl annotate`: 리소스 주석 수정

리소스에 주석(Annotation)을 추가, 수정 또는 삭제합니다.

# 파드 'foo'에 'description=my frontend' 주석 추가
kubectl annotate pods foo description='my frontend'

# pod.json 파일로 파드 주석 업데이트
kubectl annotate -f pod.json description='my frontend'

# 파드 'foo'의 'description' 주석 값을 'my frontend running nginx'로 변경 (덮어쓰기)
kubectl annotate --overwrite pods foo description='my frontend running nginx'

# 네임스페이스 내 모든 파드에 주석 추가
kubectl annotate pods --all description='my frontend running nginx'

# 특정 리소스 버전('1')일 때만 주석 업데이트
kubectl annotate pods foo description='my frontend running nginx' --resource-version=1
  

13. `kubectl completion`: 자동 완성 설정

Bash 또는 Zsh 쉘에서 `kubectl` 명령어 자동 완성을 설정합니다.

# Bash: 현재 쉘에서 자동 완성 활성화
source <(kubectl completion bash)

# Bash: 영구적으로 자동 완성 설정 (~/.bashrc에 추가)
echo "source <(kubectl completion bash)" >> ~/.bashrc

# Zsh: 현재 쉘에서 자동 완성 활성화
source <(kubectl completion zsh)

# Zsh: 영구적으로 자동 완성 설정 (~/.zshrc에 추가)
echo "source <(kubectl completion zsh)" >> ~/.zshrc
  

14. `kubectl rollout`: 리소스 배포 관리

Deployment, DaemonSet, StatefulSet 등의 배포판을 관리합니다. (history, pause, resume, status, undo)

# Deployment 'abc' 이전 버전으로 롤백
kubectl rollout undo deployment/abc

# DaemonSet 'foo' 상태 확인
kubectl rollout status daemonset/foo

# app=nginx 레이블을 가진 Deployment 재시작
kubectl rollout restart deployment --selector=app=nginx
  

15. `kubectl scale`: 리소스 확장/축소

Deployment, ReplicaSet, Replication Controller, Job 등의 파드 복제본 수를 조정합니다.

# ReplicaSet 'foo'의 파드 복제본 수를 3으로 설정
kubectl scale --replicas=3 rs/foo

# foo.yaml 파일에 정의된 리소스의 파드 복제본 수를 3으로 설정
kubectl scale --replicas=3 -f foo.yaml

# 현재 복제본 수가 2일 때 3으로 확장
kubectl scale --current-replicas=2 --replicas=3 deployment/mysql

# 여러 RC의 파드 복제본 수 동시 설정
kubectl scale --replicas=5 rc/example1 rc/example2 rc/example3
  

16. `kubectl autoscale`: 리소스 자동 확장

CPU 사용량 등을 기반으로 파드 수를 자동으로 조절합니다.

# Deployment 'foo'의 파드 수를 2~10개 사이로 자동 조절 (기본 CPU 사용률 기준)
kubectl autoscale deployment foo --min=2 --max=10

# RC 'foo'의 파드 수를 1~5개 사이로 자동 조절 (CPU 사용률 80% 유지)
kubectl autoscale rc foo --max=5 --cpu-percent=80
  

17. `kubectl certificate`: 인증서 관리

인증서 서명 요청(CSR)을 승인하거나 거부합니다.

# 노드 CSR 승인 (예시)
kubectl certificate approve node-csr-81F5uBehyEyLWco5qavBsxc1GzFcZk3aFM3XW5rT3mw node-csr-Ed0kbFhc_q7qx14H3QpqLIUs0uKo036O2SnFpIheM18
  

18. `kubectl top`: 리소스 사용량 조회

노드 또는 파드의 CPU/메모리 사용량을 조회합니다.

# 특정 노드의 리소스 사용량 조회
kubectl top node <NODE_NAME>

# 특정 파드들의 리소스 사용량 조회
kubectl top pod | grep -E "<podname1>|<podname2>|…"
  

19. `kubectl cordon`/`uncordon`: 노드 예약 가능/불가 설정

노드를 새로운 파드가 스케줄링되지 않도록 설정하거나, 다시 스케줄링 가능하게 설정합니다.

# 노드 k8s-node02를 예약 불가능(cordon) 상태로 설정
kubectl cordon k8s-node02

# 노드를 예약 가능(uncordon) 상태로 설정
kubectl uncordon <NODE_NAME>
  

20. `kubectl drain`: 노드 파드 이전

특정 노드의 모든 파드를 안전하게 다른 노드로 이전(evict) 시킵니다.

# 노드 'foo'의 파드들을 이전 (강제 옵션 사용 시)
# kubectl drain foo --force
  

21. `kubectl taint`: 노드 오염 설정/제거

노드에 'taint'를 설정하여 특정 파드만 해당 노드에 스케줄링되도록 하거나, 기존 taint를 제거합니다.

# 노드 'foo'에 'dedicated=special-user:NoSchedule' taint 설정
kubectl taint nodes foo dedicated=special-user:NoSchedule

# 노드 'foo'에서 'dedicated:NoSchedule' taint 제거
kubectl taint nodes foo dedicated:NoSchedule-

# 노드 'foo'에서 'dedicated' 키를 가진 모든 taint 제거
kubectl taint nodes foo dedicated-

# 노드 'foo'에 'bar:NoSchedule' taint 설정 (값 없음)
kubectl taint nodes foo bar:NoSchedule
  

22. `kubectl attach`: 컨테이너/파드 연결

실행 중인 컨테이너의 표준 입력(stdin)에 연결합니다.

# 파드 'mypod'의 'ruby-container' 컨테이너에 연결
kubectl attach mypod -c ruby-container

# 파드 'mypod'의 'ruby-container' 컨테이너에서 bash 실행 (대화형)
kubectl attach mypod -c ruby-container -i -t
  

23. `kubectl port-forward`: 파드로 포트 포워딩

로컬 머신의 포트를 파드의 특정 포트로 포워딩합니다.

# 로컬 5000 포트를 파드 'mypod'의 6000 포트로 포워딩
kubectl port-forward pod/mypod 5000:6000

# 로컬 8888 포트 및 지정 IP를 파드 'mypod'의 5000 포트로 포워딩
kubectl port-forward --address localhost,10.19.21.23 pod/mypod 8888:5000

# 로컬 임의 포트를 파드 'mypod'의 5000 포트로 포워딩
kubectl port-forward pod/mypod :5000
  

24. `kubectl proxy`: API 서버 프록시

로컬 머신과 Kubernetes API 서버 사이에 프록시를 생성합니다.

# 모든 Kubernetes API 프록시
kubectl proxy --api-prefix=/

# 일부 Kubernetes API 및 정적 파일 프록시 (예: curl http://localhost:8001/api/v1/pods)
kubectl proxy --www=/my/files --www-prefix=/static/ --api-prefix=/api/

# 8011 포트에서 API 서버 프록시 실행 (예: curl http://localhost:8011/api/v1/pods)
kubectl proxy --port=8011 --www=./local/www/
  

25. `kubectl cp`: 파일 복사 (호스트 <-> 컨테이너)

로컬 호스트와 컨테이너 간에 파일 또는 디렉토리를 복사합니다.

# 로컬 /tmp/foo 디렉토리를 파드 /tmp/bar 디렉토리로 복사
tar cf - /tmp/foo | kubectl exec -i -n <some-namespace> <some-pod> -- tar xf - -C /tmp/bar

# 로컬 /tmp/foo 파일을 파드 /tmp/bar 로 복사
kubectl cp /tmp/foo <some-namespace>/<some-pod>:/tmp/bar

# 파드 /tmp/foo 파일을 로컬 /tmp/bar 로 복사
kubectl cp <some-namespace>/<some-pod>:/tmp/foo /tmp/bar
  

26. `kubectl config`: kubeconfig 설정 관리

kubeconfig 파일을 관리하고 클러스터 접근 설정을 변경합니다.

# 병합된 kubeconfig 설정 보기
$ kubectl config view

# 병합된 kubeconfig 설정 보기 (원본 데이터 포함)
$ kubectl config view --raw

# 'e2e' 사용자 비밀번호 조회
$ kubectl config view -o jsonpath='{.users[?(@.name == "e2e")].user.password}'

# 현재 컨텍스트(context) 보기
$ kubectl config current-context

# 기본 컨텍스트를 'my-cluster-name'으로 설정
$ kubectl config use-context my-cluster-name

# 'cluster-admin' 사용자 인증 정보 설정 (사용자명/비밀번호)
$ kubectl config set-credentials cluster-admin --username=admin --password=uXFGweU9l35qcif
  

27. `kubectl apply`: 설정 파일 적용

YAML 또는 JSON 형식의 설정 파일을 Kubernetes 리소스에 적용합니다. 리소스가 없으면 생성하고, 있으면 업데이트합니다.

# pod.json 파일의 설정을 파드에 적용
$ kubectl apply -f ./pod.json

# 표준 입력으로 받은 JSON 설정을 파드에 적용
$ cat pod.json | kubectl apply -f -

# manifest.yaml의 설정을 적용하고, 파일에 없는 리소스는 삭제 (ConfigMap 제외)
$ kubectl apply --prune -f manifest.yaml --all --prune-allowlist=core/v1/ConfigMap
  

28. `kubectl patch`: 리소스 부분 업데이트

JSON merge patch, strategic merge patch, JSON patch 등을 사용하여 리소스의 특정 필드를 업데이트합니다.

# 노드 'k8s-node-1'을 스케줄링 불가능(unschedulable) 상태로 부분 업데이트
$ kubectl patch node k8s-node-1 -p '{"spec":{"unschedulable":true}}'

# 파드 'valid-pod'의 컨테이너 이미지 업데이트 (JSON Patch 사용)
$ kubectl patch pod valid-pod --type='json' -p='[{"op": "replace", "path": "/spec/containers/0/image", "value":"newimage"}]'
  

29. `kubectl replace`: 리소스 교체

기존 리소스를 파일 또는 표준 입력으로 받은 내용으로 완전히 교체합니다. `--force` 옵션은 삭제 후 재생성을 의미합니다.

# pod.json 파일의 내용으로 파드 교체
$ kubectl replace -f ./pod.json

# 표준 입력으로 받은 JSON으로 파드 교체
$ cat pod.json | kubectl replace -f -

# 파드 이미지 버전을 v4로 업데이트 (get -> sed -> replace)
$ kubectl get pod mypod -o yaml | sed 's/\(image: myimage\):.*$/\1:v4/' | kubectl replace -f -

# 강제로 리소스 교체 (삭제 후 재생성)
$ kubectl replace --force -f ./pod.json
  

태그: kubernetes kubectl cli command reference management

7월 25일 21:20에 게시됨