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