Post

Kubernetes Command Cheat Sheet

Kubernetes를 사용하며 알게된 CLI 명령어들을 공유합니다.

기본 설정 및 컨텍스트

1
2
3
4
5
6
7
kubectl config view                                  # kubeconfig 설정 확인
kubectl config get-contexts                          # 사용 가능한 컨텍스트 목록
kubectl config current-context                       # 현재 컨텍스트 확인
kubectl config use-context <context-name>            # 컨텍스트 변경
kubectl config set-context --current --namespace=<namespace>  # 기본 네임스페이스 설정
kubectl cluster-info                                 # 클러스터 정보 확인
kubectl version                                      # kubectl 및 클러스터 버전 확인

네임스페이스 관리

1
2
3
4
5
kubectl get namespaces                               # 네임스페이스 목록
kubectl get ns                                       # 네임스페이스 목록 (축약)
kubectl create namespace <namespace-name>            # 네임스페이스 생성
kubectl delete namespace <namespace-name>            # 네임스페이스 삭제
kubectl describe namespace <namespace-name>          # 네임스페이스 상세 정보

Pod 관리

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# Pod 조회
kubectl get pods                                     # 현재 네임스페이스의 Pod 목록
kubectl get pods -A                                  # 모든 네임스페이스의 Pod 목록
kubectl get pods -o wide                             # Pod 상세 정보 (IP, 노드 등)
kubectl get pods --show-labels                       # 라벨과 함께 Pod 목록
kubectl get pods -l app=nginx                        # 라벨 셀렉터로 Pod 필터링
kubectl get pods --field-selector status.phase=Running  # 필드 셀렉터로 필터링

# Pod 생성 및 실행
kubectl run nginx --image=nginx                      # Pod 생성 및 실행
kubectl run busybox --image=busybox --rm -it -- sh   # 임시 Pod 생성 및 접속
kubectl create -f pod.yaml                           # YAML 파일로 Pod 생성
kubectl apply -f pod.yaml                            # YAML 파일로 Pod 적용

# Pod 상세 정보 및 로그
kubectl describe pod <pod-name>                      # Pod 상세 정보
kubectl logs <pod-name>                              # Pod 로그 확인
kubectl logs <pod-name> -f                           # Pod 로그 실시간 확인
kubectl logs <pod-name> -c <container-name>          # 멀티 컨테이너 Pod의 특정 컨테이너 로그
kubectl logs <pod-name> --previous                   # 이전 컨테이너 로그

# Pod 접속 및 명령 실행
kubectl exec -it <pod-name> -- /bin/bash             # Pod에 접속
kubectl exec -it <pod-name> -c <container-name> -- /bin/bash  # 특정 컨테이너에 접속
kubectl exec <pod-name> -- ls /                      # Pod에서 명령 실행

# Pod 삭제
kubectl delete pod <pod-name>                        # Pod 삭제
kubectl delete pod <pod-name> --force --grace-period=0  # 강제 삭제
kubectl delete pods --all                            # 모든 Pod 삭제

Deployment 관리

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# Deployment 조회
kubectl get deployments                              # Deployment 목록
kubectl get deploy                                   # Deployment 목록 (축약)
kubectl describe deployment <deployment-name>        # Deployment 상세 정보

# Deployment 생성 및 관리
kubectl create deployment nginx --image=nginx        # Deployment 생성
kubectl create deployment nginx --image=nginx --replicas=3  # 레플리카 수 지정
kubectl apply -f deployment.yaml                     # YAML 파일로 Deployment 적용

# 스케일링
kubectl scale deployment <deployment-name> --replicas=5  # 레플리카 수 변경
kubectl autoscale deployment <deployment-name> --min=2 --max=10 --cpu-percent=80  # HPA 설정

# 롤아웃 관리
kubectl rollout status deployment/<deployment-name>   # 롤아웃 상태 확인
kubectl rollout history deployment/<deployment-name>  # 롤아웃 히스토리 확인
kubectl rollout undo deployment/<deployment-name>     # 이전 버전으로 롤백
kubectl rollout restart deployment/<deployment-name>  # Deployment 재시작

# 이미지 업데이트
kubectl set image deployment/<deployment-name> <container-name>=<new-image>  # 이미지 업데이트

Service 관리

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# Service 조회
kubectl get services                                 # Service 목록
kubectl get svc                                      # Service 목록 (축약)
kubectl describe service <service-name>              # Service 상세 정보

# Service 생성
kubectl expose deployment <deployment-name> --port=80 --target-port=8080  # Deployment를 Service로 노출
kubectl expose pod <pod-name> --port=80 --target-port=8080 --type=NodePort  # Pod를 NodePort Service로 노출
kubectl create service clusterip <service-name> --tcp=80:8080  # ClusterIP Service 생성
kubectl create service nodeport <service-name> --tcp=80:8080   # NodePort Service 생성
kubectl create service loadbalancer <service-name> --tcp=80:8080  # LoadBalancer Service 생성

# 포트 포워딩
kubectl port-forward service/<service-name> 8080:80  # Service 포트 포워딩
kubectl port-forward pod/<pod-name> 8080:80          # Pod 포트 포워딩

ConfigMap 및 Secret 관리

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# ConfigMap
kubectl get configmaps                               # ConfigMap 목록
kubectl get cm                                       # ConfigMap 목록 (축약)
kubectl create configmap <configmap-name> --from-literal=key1=value1 --from-literal=key2=value2
kubectl create configmap <configmap-name> --from-file=<file-path>  # 파일에서 ConfigMap 생성
kubectl create configmap <configmap-name> --from-env-file=<env-file>  # 환경 파일에서 생성
kubectl describe configmap <configmap-name>          # ConfigMap 상세 정보

# Secret
kubectl get secrets                                  # Secret 목록
kubectl create secret generic <secret-name> --from-literal=username=admin --from-literal=password=secret
kubectl create secret generic <secret-name> --from-file=<file-path>  # 파일에서 Secret 생성
kubectl create secret docker-registry <secret-name> --docker-server=<server> --docker-username=<username> --docker-password=<password>  # Docker 레지스트리 Secret
kubectl describe secret <secret-name>                # Secret 상세 정보
kubectl get secret <secret-name> -o yaml            # Secret YAML 형식으로 출력

Volume 및 PersistentVolume 관리

1
2
3
4
5
6
7
8
# PersistentVolume
kubectl get pv                                       # PersistentVolume 목록
kubectl describe pv <pv-name>                        # PV 상세 정보

# PersistentVolumeClaim
kubectl get pvc                                      # PVC 목록
kubectl describe pvc <pvc-name>                      # PVC 상세 정보
kubectl delete pvc <pvc-name>                        # PVC 삭제

Ingress 관리

1
2
3
4
kubectl get ingress                                  # Ingress 목록
kubectl get ing                                      # Ingress 목록 (축약)
kubectl describe ingress <ingress-name>              # Ingress 상세 정보
kubectl create ingress <ingress-name> --rule="host/path=service:port"  # Ingress 생성

노드 관리

1
2
3
4
5
6
7
8
9
kubectl get nodes                                    # 노드 목록
kubectl get nodes -o wide                            # 노드 상세 정보
kubectl describe node <node-name>                    # 노드 상세 정보
kubectl top nodes                                    # 노드 리소스 사용량 (metrics-server 필요)
kubectl cordon <node-name>                           # 노드 스케줄링 비활성화
kubectl uncordon <node-name>                         # 노드 스케줄링 활성화
kubectl drain <node-name>                            # 노드에서 Pod 제거 (유지보수 시)
kubectl taint nodes <node-name> key=value:NoSchedule  # 노드에 Taint 추가
kubectl taint nodes <node-name> key:NoSchedule-      # 노드에서 Taint 제거

리소스 모니터링 및 디버깅

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 리소스 사용량 확인 (metrics-server 필요)
kubectl top nodes                                    # 노드 리소스 사용량
kubectl top pods                                     # Pod 리소스 사용량
kubectl top pods -A                                  # 모든 네임스페이스 Pod 리소스 사용량

# 이벤트 확인
kubectl get events                                   # 이벤트 목록
kubectl get events --sort-by=.metadata.creationTimestamp  # 시간순 정렬
kubectl get events --field-selector involvedObject.name=<pod-name>  # 특정 객체 이벤트

# 디버깅
kubectl describe <resource-type> <resource-name>     # 리소스 상세 정보
kubectl logs <pod-name> --previous                   # 이전 컨테이너 로그
kubectl get pods --show-labels                       # 라벨과 함께 Pod 목록
kubectl get all                                      # 모든 리소스 목록
kubectl api-resources                                # 사용 가능한 API 리소스 목록
kubectl explain <resource-type>                      # 리소스 타입 설명

YAML 파일 관리

1
2
3
4
5
6
7
8
9
10
11
kubectl apply -f <file.yaml>                         # YAML 파일 적용
kubectl apply -f <directory>/                        # 디렉토리 내 모든 YAML 파일 적용
kubectl apply -k <kustomization-directory>           # Kustomize 적용
kubectl delete -f <file.yaml>                        # YAML 파일로 리소스 삭제
kubectl create -f <file.yaml>                        # YAML 파일로 리소스 생성
kubectl replace -f <file.yaml>                       # YAML 파일로 리소스 교체

# YAML 생성 및 출력
kubectl create deployment nginx --image=nginx --dry-run=client -o yaml  # YAML 생성 (실행하지 않음)
kubectl get deployment nginx -o yaml                 # 기존 리소스를 YAML로 출력
kubectl get deployment nginx -o json                 # 기존 리소스를 JSON으로 출력

라벨 및 어노테이션 관리

1
2
3
4
5
6
7
8
9
# 라벨 관리
kubectl label pods <pod-name> env=production          # Pod에 라벨 추가
kubectl label pods <pod-name> env-                    # Pod에서 라벨 제거
kubectl get pods -l env=production                    # 라벨로 Pod 필터링
kubectl get pods -l 'env in (production,staging)'     # 여러 라벨 값으로 필터링

# 어노테이션 관리
kubectl annotate pods <pod-name> description="My pod"  # Pod에 어노테이션 추가
kubectl annotate pods <pod-name> description-         # Pod에서 어노테이션 제거

네트워크 정책 및 보안

1
2
3
4
5
6
7
8
9
10
11
kubectl get networkpolicies                          # NetworkPolicy 목록
kubectl get netpol                                   # NetworkPolicy 목록 (축약)
kubectl describe networkpolicy <policy-name>         # NetworkPolicy 상세 정보

# RBAC
kubectl get roles                                    # Role 목록
kubectl get rolebindings                             # RoleBinding 목록
kubectl get clusterroles                             # ClusterRole 목록
kubectl get clusterrolebindings                      # ClusterRoleBinding 목록
kubectl auth can-i create pods                       # 권한 확인
kubectl auth can-i create pods --as=system:serviceaccount:default:default  # 특정 사용자 권한 확인

Helm 관련 명령어

1
2
3
4
5
6
7
8
helm list                                            # 설치된 Helm 차트 목록
helm list -A                                         # 모든 네임스페이스의 Helm 차트
helm install <release-name> <chart>                  # Helm 차트 설치
helm upgrade <release-name> <chart>                  # Helm 차트 업그레이드
helm uninstall <release-name>                        # Helm 차트 제거
helm rollback <release-name> <revision>              # Helm 차트 롤백
helm status <release-name>                           # Helm 릴리스 상태 확인
helm get values <release-name>                       # Helm 릴리스 값 확인

유용한 별칭 및 단축키

1
2
3
4
5
6
7
8
9
10
11
12
13
# kubectl 별칭 설정
alias k=kubectl
alias kg='kubectl get'
alias kd='kubectl describe'
alias kd='kubectl delete'
alias kl='kubectl logs'
alias kla='kubectl logs --all-containers'
alias kexec='kubectl exec -it'

# 자주 사용하는 조합
kubectl get pods -o wide --sort-by=.spec.nodeName    # 노드별로 정렬된 Pod 목록
kubectl get pods --field-selector status.phase!=Running  # 실행 중이 아닌 Pod 목록
kubectl get events --sort-by=.metadata.creationTimestamp | tail  # 최근 이벤트

고급 모니터링 및 실시간 감시

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 실시간 Pod 모니터링
watch -n2 'kubectl get pods -A --sort-by=.metadata.creationTimestamp | tail -20'  # 2초마다 최근 Pod 20개
watch -n2 'kubectl get pods -A -o wide --sort-by=.metadata.creationTimestamp | tail -20'  # Pod IP, Node 정보 포함
watch -n2 'kubectl get pods -A | grep -v Running'    # Running이 아닌 Pod 실시간 모니터링
watch -n1 'kubectl top pods -A --sort-by=cpu | head -20'  # CPU 사용량 상위 20개 Pod

# 실시간 Node 모니터링
watch -n2 'kubectl get nodes --sort-by=.metadata.creationTimestamp'  # 생성 시간순 Node 조회
watch -n2 'kubectl get nodes -L topology.ebs.csi.aws.com/zone -L node.kubernetes.io/app --sort-by=.metadata.creationTimestamp'  # AZ, NodeGroup 라벨 표시
watch -n2 'kubectl get nodes | grep -v Ready'        # Ready가 아닌 Node 실시간 모니터링
watch -n1 'kubectl top nodes --sort-by=cpu'          # CPU 사용량 기준 Node 정렬
watch -n1 'kubectl top nodes --sort-by=memory'       # 메모리 사용량 기준 Node 정렬

# 실시간 Event 모니터링
watch -n2 'kubectl get events -A --sort-by=.metadata.managedFields[].time | tail -20'  # 시간순 이벤트 조회
watch -n2 'kubectl get events -A --field-selector type!=Normal --sort-by=.metadata.managedFields[].time | tail -20'  # 비정상 이벤트만
watch -n2 'kubectl get events --field-selector involvedObject.kind=Pod --sort-by=.lastTimestamp | tail -15'  # Pod 관련 이벤트만

# Pod 상태별 개수 모니터링
watch -n2 'kubectl get pods -A --no-headers | awk "{print \$4}" | sort | uniq -c'  # Pod 상태별 개수
watch -n2 'kubectl get pods -A --no-headers | awk "{print \$1}" | sort | uniq -c'  # 네임스페이스별 Pod 개수

API 리소스 및 고급 쿼리

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# API 리소스 탐색
kubectl api-resources                                # 사용 가능한 모든 API 리소스 목록
kubectl api-resources --verbs=list --namespaced -o name  # 네임스페이스 리소스 중 list 가능한 것들
kubectl api-resources --api-group=apps              # 특정 API 그룹의 리소스
kubectl api-resources --namespaced=false            # 클러스터 레벨 리소스만
kubectl api-resources --namespaced=true             # 네임스페이스 레벨 리소스만
kubectl api-resources --verbs=get,list,create,update,patch,watch,delete  # 모든 CRUD 동작 가능한 리소스

# API 버전 확인
kubectl api-versions                                 # 사용 가능한 API 버전 목록
kubectl explain <resource>                           # 리소스 스키마 설명
kubectl explain pod.spec                             # 특정 필드 설명
kubectl explain pod.spec.containers                  # 중첩된 필드 설명

# 모든 리소스 조회 (고급)
kubectl api-resources --verbs=list --namespaced -o name | xargs -n 1 kubectl get --show-kind --ignore-not-found -A  # 모든 네임스페이스 리소스
kubectl api-resources --verbs=list --namespaced=false -o name | xargs -n 1 kubectl get --show-kind --ignore-not-found  # 모든 클러스터 리소스
kubectl get all -A                                   # 기본 리소스들만 (pod, service, deployment 등)
kubectl get $(kubectl api-resources --namespaced=true --verbs=list -o name | tr '\n' ',' | sed 's/,$//') -A  # 모든 네임스페이스 리소스 한번에

컨테이너 재시작 및 로그 분석

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 재시작된 컨테이너 찾기
kubectl get pods -A -o jsonpath='{range .items[*]}{.metadata.namespace}{"\t"}{.metadata.name}{"\t"}{range .status.containerStatuses[*]}{.name}{"\t"}{.restartCount}{"\n"}{end}{end}' | sort -k4 -nr  # 재시작 횟수 기준 정렬
kubectl get pods -A --field-selector=status.phase=Running -o jsonpath='{range .items[*]}{.metadata.namespace}{"\t"}{.metadata.name}{"\t"}{range .status.containerStatuses[*]}{if gt .restartCount 0}{.name}{"\t"}{.restartCount}{"\n"}{end}{end}{end}'  # 재시작된 컨테이너만

# 이전 컨테이너 로그 (재시작된 경우)
kubectl logs -n <namespace> <pod-name> -c <container-name> --previous  # 이전 컨테이너 로그
kubectl logs -n <namespace> <pod-name> -c <container-name> --previous --tail=100  # 이전 컨테이너 로그 100줄
kubectl logs -n <namespace> <pod-name> --all-containers --previous  # 모든 컨테이너의 이전 로그

# 로그 스트리밍 및 필터링
kubectl logs -n <namespace> <pod-name> -f --tail=50  # 실시간 로그 스트리밍 (최근 50줄부터)
kubectl logs -n <namespace> <pod-name> -f | grep ERROR  # 에러 로그만 필터링
kubectl logs -n <namespace> <pod-name> --since=1h    # 최근 1시간 로그만
kubectl logs -n <namespace> <pod-name> --since-time=2023-01-01T10:00:00Z  # 특정 시간 이후 로그

노드 그룹 및 라벨 기반 필터링

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 노드 그룹별 필터링 (AWS EKS 환경)
kubectl get nodes -l node.kubernetes.io/app=my-nodegroup  # 특정 NodeGroup 필터링
kubectl get pods -A --field-selector spec.nodeName=<node-name>  # 특정 노드의 Pod들
kubectl get nodes -L topology.ebs.csi.aws.com/zone -L node.kubernetes.io/app  # AZ, NodeGroup 라벨 표시
kubectl get nodes -l topology.ebs.csi.aws.com/zone=us-west-2a  # 특정 AZ의 노드들

# 라벨 기반 고급 필터링
kubectl get pods -A -l 'environment in (production,staging)'  # 여러 라벨 값으로 필터링
kubectl get pods -A -l 'environment!=development'    # 특정 라벨 값 제외
kubectl get pods -A -l 'environment,tier'            # 두 라벨이 모두 있는 Pod
kubectl get pods -A -l '!environment'                # 특정 라벨이 없는 Pod

# 필드 셀렉터 고급 사용
kubectl get pods -A --field-selector=status.phase!=Running,spec.restartPolicy=Always  # 여러 필드 조건
kubectl get events --field-selector involvedObject.kind=Pod,type=Warning  # Pod 관련 경고 이벤트
kubectl get pods --field-selector metadata.namespace!=kube-system  # 특정 네임스페이스 제외

리소스 사용량 및 성능 분석

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 리소스 사용량 상세 분석
kubectl top pods -A --containers                     # 컨테이너별 리소스 사용량
kubectl top pods -A --sort-by=cpu                    # CPU 사용량 기준 정렬
kubectl top pods -A --sort-by=memory                 # 메모리 사용량 기준 정렬
kubectl top nodes --sort-by=cpu                      # 노드 CPU 사용량 정렬
kubectl top nodes --sort-by=memory                   # 노드 메모리 사용량 정렬

# 리소스 제한 및 요청 확인
kubectl describe pods -A | grep -A 5 "Limits\|Requests"  # 모든 Pod의 리소스 제한/요청
kubectl get pods -A -o jsonpath='{range .items[*]}{.metadata.namespace}{"\t"}{.metadata.name}{"\t"}{range .spec.containers[*]}{.resources.requests.cpu}{"\t"}{.resources.requests.memory}{"\t"}{.resources.limits.cpu}{"\t"}{.resources.limits.memory}{"\n"}{end}{end}'  # 리소스 요청/제한 테이블 형식

# 노드 리소스 할당 현황
kubectl describe nodes | grep -A 5 "Allocated resources"  # 노드별 리소스 할당 현황
kubectl get nodes -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.status.allocatable.cpu}{"\t"}{.status.allocatable.memory}{"\n"}{end}'  # 노드별 할당 가능한 리소스

고급 디버깅 및 문제 해결

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 클러스터 전체 상태 점검
kubectl cluster-info dump --output-directory=/tmp/cluster-dump  # 클러스터 전체 정보 덤프
kubectl get componentstatuses                        # 컴포넌트 상태 확인
kubectl get --raw /healthz                           # 클러스터 헬스 체크
kubectl get --raw /metrics                           # 메트릭 엔드포인트 확인

# 네트워킹 디버깅
kubectl get pods -A -o wide | grep -v Running        # 네트워크 문제로 실행되지 않는 Pod
kubectl get endpoints -A                             # 서비스 엔드포인트 확인
kubectl get networkpolicies -A                       # 네트워크 정책 확인
kubectl describe service <service-name> -n <namespace>  # 서비스 상세 정보

# DNS 문제 해결
kubectl get pods -n kube-system -l k8s-app=kube-dns  # CoreDNS Pod 상태
kubectl logs -n kube-system -l k8s-app=kube-dns      # CoreDNS 로그
kubectl run -it --rm debug --image=busybox --restart=Never -- nslookup kubernetes.default.svc.cluster.local  # DNS 해상도 테스트

# RBAC 디버깅
kubectl auth can-i --list --as=system:serviceaccount:<namespace>:<serviceaccount>  # 서비스 계정 권한 확인
kubectl get clusterrolebindings -o wide | grep <user-or-group>  # 클러스터 역할 바인딩 확인
kubectl get rolebindings -A -o wide | grep <user-or-group>  # 역할 바인딩 확인
kubectl describe clusterrole <role-name>             # 클러스터 역할 상세 정보

# 리소스 정리 및 유지보수
kubectl delete pods --field-selector status.phase=Succeeded -A  # 완료된 Pod 삭제
kubectl delete pods --field-selector status.phase=Failed -A     # 실패한 Pod 삭제
kubectl get pods -A --field-selector=status.phase=Evicted       # Evicted Pod 확인
kubectl delete pods -A --field-selector=status.phase=Evicted    # Evicted Pod 삭제

궁금하신 점이나 추가해야 할 부분은 댓글이나 아래의 링크를 통해 문의해주세요.
Written with KKam._.Ji

This post is licensed under CC BY 4.0 by the author.