Post

K8s 명령어 치트시트

K8s 명령어 치트시트

목차

  1. 기본 kubectl 명령어
  2. 파드(Pod) 관련 명령어
  3. 배포(Deployment) 관련 명령어
  4. 레플리카셋(ReplicaSet) 관련 명령어
  5. 서비스(Service) 관련 명령어
  6. 컨피그맵(ConfigMap)과 시크릿(Secret) 관련 명령어
  7. 네임스페이스(Namespace) 관련 명령어
  8. 노드(Node) 관련 명령어
  9. 테인트와 톨러레이션(Taints & Tolerations)
  10. 노드 셀렉터와 어피니티(Node Selector & Affinity)
  11. 데몬셋(DaemonSet) 관련 명령어
  12. 정적 파드(Static Pods)
  13. 스케줄러(Scheduler) 관련 명령어
  14. 퍼시스턴트 볼륨(PV)과 퍼시스턴트 볼륨 클레임(PVC)
  15. 롤(Role)과 롤바인딩(RoleBinding) 관련 명령어
  16. 클러스터 관리 명령어
  17. 네트워킹 관련 명령어
  18. 트러블슈팅 및 디버깅 명령어
  19. 리소스 요구사항과 제한(Resource Requirements and Limits)
  20. ETCD 관련 명령어
  21. YAML 파일 생성 및 관리
  22. 컨텍스트 및 구성 관리
  23. 자주 사용되는 kubectl 옵션

기본 kubectl 명령어

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# kubectl 버전 확인
kubectl version

# 클러스터 정보 확인
kubectl cluster-info

# API 리소스 확인
kubectl api-resources

# kubectl 도움말 보기
kubectl --help
kubectl [command] --help

# 모든 리소스 확인하기
kubectl get all
kubectl get all --all-namespaces

# kubectl 완료 설정 (bash)
source <(kubectl completion bash)

# kubectl 별칭 설정
alias k=kubectl
complete -F __start_kubectl k

파드(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
31
32
33
34
35
36
# 파드 목록 보기
kubectl get pods
kubectl get po -A  # 모든 네임스페이스
kubectl get pods -n <namespace>
kubectl get pods -o wide  # 자세한 정보

# 특정 파드 상세 정보 보기
kubectl describe pod <pod-name> -n <namespace>

# 파드 생성
kubectl run <pod-name> --image=<image-name> --restart=Never
kubectl run nginx --image=nginx --restart=Never

# 상세 YAML로 파드 생성
kubectl run nginx --image=nginx --restart=Never --dry-run=client -o yaml > pod.yaml
kubectl apply -f pod.yaml

# 파드 삭제
kubectl delete pod <pod-name> -n <namespace>
kubectl delete pod <pod-name> --grace-period=0 --force  # 강제 삭제

# 파드 로그 보기
kubectl logs <pod-name> -n <namespace>
kubectl logs <pod-name> -c <container-name>  # 다중 컨테이너 파드
kubectl logs -f <pod-name>  # 실시간 로그

# 파드 내 셸 실행
kubectl exec -it <pod-name> -- /bin/bash
kubectl exec -it <pod-name> -c <container-name> -- /bin/sh

# 파드에 파일 복사
kubectl cp <local-file> <pod-name>:<path>
kubectl cp <pod-name>:<path> <local-file>

# 임시 파드로 디버깅
kubectl run debug --image=busybox --rm -it --restart=Never -- sh

배포(Deployment) 관련 명령어

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
31
32
33
34
35
36
37
38
39
40
# 배포 목록 보기
kubectl get deployments
kubectl get deploy -A
kubectl get deploy -n <namespace>

# 배포 상세 정보 보기
kubectl describe deployment <deployment-name> -n <namespace>

# 배포 생성
kubectl create deployment <name> --image=<image>
kubectl create deployment nginx --image=nginx

# 상세 YAML로 배포 생성
kubectl create deployment nginx --image=nginx --dry-run=client -o yaml > deploy.yaml
kubectl apply -f deploy.yaml

# 레플리카 수 조정
kubectl scale deployment <name> --replicas=<count>
kubectl scale deployment nginx --replicas=3

# 배포 롤아웃 상태 확인
kubectl rollout status deployment/<name>

# 배포 롤아웃 기록 확인
kubectl rollout history deployment/<name>

# 배포 롤백
kubectl rollout undo deployment/<name>
kubectl rollout undo deployment/<name> --to-revision=<revision>

# 배포 재시작
kubectl rollout restart deployment/<name>

# 배포 일시 중지/재개
kubectl rollout pause deployment/<name>
kubectl rollout resume deployment/<name>

# 배포 이미지 업데이트
kubectl set image deployment/<name> <container>=<image>
kubectl set image deployment/nginx nginx=nginx:1.19

서비스(Service) 관련 명령어

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
# 서비스 목록 보기
kubectl get services
kubectl get svc -A
kubectl get svc -n <namespace>

# 서비스 상세 정보
kubectl describe service <name> -n <namespace>

# 서비스 생성
kubectl expose pod <pod-name> --port=<port> --target-port=<target-port> --type=<type>
kubectl expose deployment <deploy-name> --port=<port> --target-port=<target-port> --type=<type>

# 예시
kubectl expose pod nginx --port=80 --target-port=80 --type=ClusterIP
kubectl expose deployment nginx --port=80 --target-port=80 --type=NodePort

# NodePort 서비스 생성 (YAML로)
kubectl create service nodeport <name> --tcp=<port>:<target-port> --dry-run=client -o yaml > svc.yaml
kubectl apply -f svc.yaml

# ClusterIP 서비스 생성
kubectl create service clusterip <name> --tcp=<port>:<target-port>

# 서비스 삭제
kubectl delete service <name> -n <namespace>

컨피그맵(ConfigMap)과 시크릿(Secret) 관련 명령어

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
31
32
33
34
# 컨피그맵 목록 보기
kubectl get configmaps
kubectl get cm -A
kubectl get cm -n <namespace>

# 컨피그맵 상세 정보
kubectl describe configmap <name> -n <namespace>

# 컨피그맵 생성 (literal 값)
kubectl create configmap <name> --from-literal=key1=value1 --from-literal=key2=value2
kubectl create cm app-config --from-literal=DB_HOST=mysql --from-literal=DB_PORT=3306

# 컨피그맵 생성 (파일로부터)
kubectl create configmap <name> --from-file=<path-to-file>
kubectl create cm app-config --from-file=config.properties

# 시크릿 목록 보기
kubectl get secrets
kubectl get secrets -A
kubectl get secrets -n <namespace>

# 시크릿 상세 정보
kubectl describe secret <name> -n <namespace>

# 시크릿 생성 (literal 값)
kubectl create secret generic <name> --from-literal=key1=value1 --from-literal=key2=value2
kubectl create secret generic db-creds --from-literal=username=admin --from-literal=password=p@ssw0rd

# 시크릿 생성 (파일로부터)
kubectl create secret generic <name> --from-file=<path-to-file>
kubectl create secret generic tls-cert --from-file=tls.crt --from-file=tls.key

# TLS 시크릿 생성
kubectl create secret tls <name> --cert=<path-to-cert> --key=<path-to-key>

네임스페이스(Namespace) 관련 명령어

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 네임스페이스 목록 보기
kubectl get namespaces
kubectl get ns

# 네임스페이스 생성
kubectl create namespace <name>
kubectl create ns dev

# 네임스페이스 삭제
kubectl delete namespace <name>
kubectl delete ns dev

# 특정 네임스페이스 사용
kubectl config set-context --current --namespace=<namespace>
kubectl config set-context --current --namespace=dev

노드(Node) 관련 명령어

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
# 노드 목록 보기
kubectl get nodes
kubectl get nodes -o wide

# 노드 상세 정보
kubectl describe node <node-name>

# 노드 레이블 확인
kubectl get nodes --show-labels

# 노드에 레이블 추가
kubectl label node <node-name> key=value
kubectl label node worker1 disktype=ssd
kubectl label node node1 size=Large

# 노드에서 레이블 제거
kubectl label node <node-name> key-

# 노드 cordon (스케줄링 비활성화)
kubectl cordon <node-name>

# 노드 uncordon (스케줄링 활성화)
kubectl uncordon <node-name>

# 노드 drain (파드 이전)
kubectl drain <node-name> --ignore-daemonsets --delete-emptydir-data

테인트와 톨러레이션(Taints & Tolerations)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 노드에 테인트 설정
kubectl taint nodes <node-name> <key>=<value>:<effect>
kubectl taint nodes node1 app=blue:NoSchedule

# 노드의 테인트 확인
kubectl describe node <node-name> | grep Taint

# 노드의 테인트 제거
kubectl taint nodes <node-name> <key>-
kubectl taint nodes node1 app-

# 테인트 효과(Effect) 종류
# - NoSchedule: 톨러레이션이 없는 파드는 노드에 스케줄링되지 않음
# - PreferNoSchedule: 가능하면 톨러레이션이 없는 파드를 스케줄링하지 않음
# - NoExecute: 톨러레이션이 없는 파드는 스케줄링되지 않고, 기존 파드도 퇴출됨

노드 셀렉터와 어피니티(Node Selector & Affinity)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 노드 셀렉터가 있는 파드 생성 (YAML 예시)
# spec:
#   nodeSelector:
#     size: Large

# 노드 어피니티가 있는 파드 생성 (YAML 예시)
# spec:
#   affinity:
#     nodeAffinity:
#       requiredDuringSchedulingIgnoredDuringExecution:
#         nodeSelectorTerms:
#         - matchExpressions:
#           - key: size
#             operator: In
#             values:
#             - Large
#             - Medium

퍼시스턴트 볼륨(PV)과 퍼시스턴트 볼륨 클레임(PVC)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# PV 목록 보기
kubectl get persistentvolumes
kubectl get pv

# PV 상세 정보
kubectl describe pv <pv-name>

# PVC 목록 보기
kubectl get persistentvolumeclaims
kubectl get pvc -A
kubectl get pvc -n <namespace>

# PVC 상세 정보
kubectl describe pvc <pvc-name> -n <namespace>

# 스토리지 클래스 목록
kubectl get storageclasses
kubectl get sc

# 스토리지 클래스 상세 정보
kubectl describe sc <name>

롤(Role)과 롤바인딩(RoleBinding) 관련 명령어

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
31
32
33
34
35
36
37
# 롤 목록 보기
kubectl get roles -A
kubectl get roles -n <namespace>

# 롤 상세 정보
kubectl describe role <name> -n <namespace>

# 롤 생성
kubectl create role <name> --verb=<verbs> --resource=<resources> -n <namespace>
kubectl create role pod-reader --verb=get,list,watch --resource=pods -n default

# 롤바인딩 목록 보기
kubectl get rolebindings -A
kubectl get rolebindings -n <namespace>

# 롤바인딩 상세 정보
kubectl describe rolebinding <name> -n <namespace>

# 롤바인딩 생성
kubectl create rolebinding <name> --role=<role-name> --user=<user-name> -n <namespace>
kubectl create rolebinding pod-reader-binding --role=pod-reader --user=jane -n default

# 클러스터롤 목록 보기
kubectl get clusterroles

# 클러스터롤 상세 정보
kubectl describe clusterrole <name>

# 클러스터롤바인딩 목록 보기
kubectl get clusterrolebindings

# 클러스터롤바인딩 상세 정보
kubectl describe clusterrolebinding <name>

# 사용자 권한 확인
kubectl auth can-i <verb> <resource> --as=<user> -n <namespace>
kubectl auth can-i create pods --as=jane -n default

클러스터 관리 명령어

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
31
32
# 컴포넌트 상태 확인
kubectl get componentstatuses
kubectl get cs

# 이벤트 목록
kubectl get events -A
kubectl get events -n <namespace>

# 클러스터 상태 확인
kubectl top nodes
kubectl top pods -A

# etcd 백업
ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 \
  --cacert=/etc/kubernetes/pki/etcd/ca.crt \
  --cert=/etc/kubernetes/pki/etcd/server.crt \
  --key=/etc/kubernetes/pki/etcd/server.key \
  snapshot save /tmp/etcd-backup.db

# etcd 복구
ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 \
  --cacert=/etc/kubernetes/pki/etcd/ca.crt \
  --cert=/etc/kubernetes/pki/etcd/server.crt \
  --key=/etc/kubernetes/pki/etcd/server.key \
  snapshot restore /tmp/etcd-backup.db

# 인증서 확인
kubeadm certs check-expiration

# API 서버 접근
kubectl proxy --port=8001
# 그 후 http://localhost:8001/api/v1/namespaces 등으로 접근 가능

네트워킹 관련 명령어

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 네트워크 정책 목록 보기
kubectl get networkpolicies
kubectl get netpol -A
kubectl get netpol -n <namespace>

# 네트워크 정책 상세 정보
kubectl describe netpol <name> -n <namespace>

# 인그레스 목록 보기
kubectl get ingress -A
kubectl get ing -n <namespace>

# 인그레스 상세 정보
kubectl describe ingress <name> -n <namespace>

# DNS 디버깅
kubectl run nslookup --image=busybox:1.28 --rm -it --restart=Never -- nslookup kubernetes.default

# 네트워크 연결 테스트
kubectl run test-connection --image=busybox --rm -it --restart=Never -- wget -O- http://service-name:port

트러블슈팅 및 디버깅 명령어

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
31
32
# 파드 이벤트 확인
kubectl describe pod <pod-name>

# 컨테이너 로그 확인
kubectl logs <pod-name> -c <container-name>
kubectl logs <pod-name> -c <container-name> --previous  # 이전 컨테이너 로그

# 리소스 사용량 확인
kubectl top pods -n <namespace>
kubectl top pod <pod-name> -n <namespace> --containers

# 노드 리소스 사용량 확인
kubectl top nodes

# 임시 디버깅 파드 실행
kubectl run debug --image=busybox --rm -it --restart=Never -- sh
kubectl run debug-net --image=nicolaka/netshoot --rm -it --restart=Never -- bash

# API 서버 호출 디버깅
kubectl get pods -v=6  # 상세 출력 레벨(1-9)

# 특정 경로로 API 서버 직접 호출
kubectl get --raw /api/v1/namespaces

# 리소스 검증
kubectl apply -f manifest.yaml --validate=true --dry-run=client

# DNS 디버깅
kubectl run nslookup --image=busybox:1.28 --rm -it --restart=Never -- nslookup kubernetes.default

# 네트워크 연결 테스트
kubectl run test-connection --image=busybox --rm -it --restart=Never -- wget -O- http://service-name:port

리소스 요구사항과 제한(Resource Requirements and Limits)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 리소스 요청과 제한이 있는 파드 생성 (YAML 예시)
# spec:
#   containers:
#   - name: container
#     resources:
#       requests:
#         memory: "64Mi"
#         cpu: "250m"
#       limits:
#         memory: "128Mi"
#         cpu: "500m"

# 리소스 쿼터 확인
kubectl get resourcequotas -A
kubectl describe resourcequota <quota-name> -n <namespace>

# 리밋레인지 확인
kubectl get limitranges -A
kubectl describe limitrange <limitrange-name> -n <namespace>

# 노드의 리소스 용량 및 할당량 확인
kubectl describe node <node-name> | grep -A 8 Capacity
kubectl describe node <node-name> | grep -A 8 Allocatable

YAML 파일 생성 및 관리

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 리소스의 YAML 형식으로 출력
kubectl get pod <pod-name> -o yaml
kubectl get deployment <name> -o yaml

# 리소스 편집
kubectl edit pod <pod-name> -n <namespace>
kubectl edit deployment <name> -n <namespace>

# 마니페스트 적용
kubectl apply -f <filename.yaml>
kubectl apply -f <directory/>
kubectl apply -f <filename.yaml> --record  # 변경 기록 저장

# dry-run으로 YAML 생성
kubectl run nginx --image=nginx --restart=Never --dry-run=client -o yaml > pod.yaml
kubectl create deployment nginx --image=nginx --dry-run=client -o yaml > deploy.yaml
kubectl create service clusterip nginx --tcp=80:80 --dry-run=client -o yaml > svc.yaml

# 명령형 명령어를 YAML로 변환
kubectl create secret generic my-secret --from-literal=key1=value1 --dry-run=client -o yaml > secret.yaml

컨텍스트 및 구성 관리

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# kubeconfig 파일 위치 (기본값)
# $HOME/.kube/config

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

# 컨텍스트 목록 보기
kubectl config get-contexts

# 컨텍스트 전환
kubectl config use-context <context-name>

# 컨텍스트 설정 (네임스페이스 등)
kubectl config set-context --current --namespace=<namespace>

# kubeconfig 병합
export KUBECONFIG=~/.kube/config:~/.kube/another-config
kubectl config view --merge --flatten > ~/.kube/merged-config
export KUBECONFIG=~/.kube/merged-config

ETCD 관련 명령어

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
31
32
33
34
35
36
# ETCD 버전 확인
etcdctl version

# API 버전 설정
export ETCDCTL_API=3

# ETCD 엔드포인트 상태 확인
etcdctl --endpoints=https://127.0.0.1:2379 endpoint health

# ETCD 클러스터 멤버 목록 보기
etcdctl --endpoints=https://127.0.0.1:2379 member list

# 인증서로 ETCD 접근
etcdctl --endpoints=https://127.0.0.1:2379 \
  --cacert=/etc/kubernetes/pki/etcd/ca.crt \
  --cert=/etc/kubernetes/pki/etcd/server.crt \
  --key=/etc/kubernetes/pki/etcd/server.key \
  <command>

# ETCD 데이터 조회
etcdctl --endpoints=https://127.0.0.1:2379 \
  --cacert=/etc/kubernetes/pki/etcd/ca.crt \
  --cert=/etc/kubernetes/pki/etcd/server.crt \
  --key=/etc/kubernetes/pki/etcd/server.key \
  get / --prefix --keys-only

# ETCD 백업
ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 \
  --cacert=/etc/kubernetes/pki/etcd/ca.crt \
  --cert=/etc/kubernetes/pki/etcd/server.crt \
  --key=/etc/kubernetes/pki/etcd/server.key \
  snapshot save /tmp/etcd-backup.db

# ETCD 복구
ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 \
  snapshot restore /tmp/etcd-backup.db --data-dir=/var/lib/etcd-restore

자주 사용되는 kubectl 옵션

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 출력 형식 옵션
-o wide     # 추가 정보 표시
-o yaml     # YAML 형식
-o json     # JSON 형식
-o name     # 리소스 이름만
-o jsonpath='{...}'  # JSONPath 형식
-o custom-columns=<spec>  # 사용자 지정 칼럼

# 필터링 옵션
--selector, -l       # 레이블 선택자 (예: -l app=nginx)
--field-selector     # 필드 선택자 (예: --field-selector=metadata.name=my-pod)

# 네임스페이스 옵션
--namespace, -n      # 네임스페이스 지정
--all-namespaces, -A # 모든 네임스페이스

# 실행 관련 

## 시험 팁

1. 명령어를 기억하지 못할 경우 도움말을 이용하세요:
   ```bash
   kubectl --help
   kubectl <command> --help
  1. 시험에서는 kubectl bash 완료 기능이 설정되어 있으므로 탭 완성을 활용하세요.

  2. 에일리어스를 사용하면 시간을 절약할 수 있습니다:
    1
    2
    
    alias k=kubectl
    complete -F __start_kubectl k
    
  3. 명령형 명령어보다는 선언적 YAML 파일 사용을 권장합니다. 명령형 명령어로 YAML 파일을 생성한 후 편집하는 방식이 효율적입니다.

  4. 필요한 정보를 쉽게 찾기 위해 공식 문서를 활용하세요:
    1
    2
    3
    
    # 시험에서는 다음 URL이 북마크되어 있습니다
    https://kubernetes.io/docs/
    https://kubernetes.io/docs/reference/kubectl/cheatsheet/
    
  5. 필요한 리소스의 YAML 템플릿이 기억나지 않는다면 아래와 같이 생성할 수 있습니다:
    1
    2
    
    # 빈 파드 YAML 템플릿 생성
    kubectl run pod-name --image=nginx --restart=Never --dry-run=client -o yaml > pod.yaml
    
This post is licensed under CC BY 4.0 by the author.