K8s 명령어 치트시트
K8s 명령어 치트시트
목차
- 기본 kubectl 명령어
- 파드(Pod) 관련 명령어
- 배포(Deployment) 관련 명령어
- 레플리카셋(ReplicaSet) 관련 명령어
- 서비스(Service) 관련 명령어
- 컨피그맵(ConfigMap)과 시크릿(Secret) 관련 명령어
- 네임스페이스(Namespace) 관련 명령어
- 노드(Node) 관련 명령어
- 테인트와 톨러레이션(Taints & Tolerations)
- 노드 셀렉터와 어피니티(Node Selector & Affinity)
- 데몬셋(DaemonSet) 관련 명령어
- 정적 파드(Static Pods)
- 스케줄러(Scheduler) 관련 명령어
- 퍼시스턴트 볼륨(PV)과 퍼시스턴트 볼륨 클레임(PVC)
- 롤(Role)과 롤바인딩(RoleBinding) 관련 명령어
- 클러스터 관리 명령어
- 네트워킹 관련 명령어
- 트러블슈팅 및 디버깅 명령어
- 리소스 요구사항과 제한(Resource Requirements and Limits)
- ETCD 관련 명령어
- YAML 파일 생성 및 관리
- 컨텍스트 및 구성 관리
- 자주 사용되는 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
시험에서는 kubectl bash 완료 기능이 설정되어 있으므로 탭 완성을 활용하세요.
- 에일리어스를 사용하면 시간을 절약할 수 있습니다:
1 2
alias k=kubectl complete -F __start_kubectl k
명령형 명령어보다는 선언적 YAML 파일 사용을 권장합니다. 명령형 명령어로 YAML 파일을 생성한 후 편집하는 방식이 효율적입니다.
- 필요한 정보를 쉽게 찾기 위해 공식 문서를 활용하세요:
1 2 3
# 시험에서는 다음 URL이 북마크되어 있습니다 https://kubernetes.io/docs/ https://kubernetes.io/docs/reference/kubectl/cheatsheet/
- 필요한 리소스의 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.