주녁, DevNote
article thumbnail

개요

자주 쓰이는 상황별 쿠버네티스 명령어를 정리한 글입니다. (수시로 업데이트 됩니다. 2023/04/16)

더 자세한 내용은 공식 문서를 참조하시면 좋습니다. (kubectl 치트 시트 | 명령줄 도구 (kubectl))

상황별 명령어 모음

Pod, Node 조회

# 마스터 노드에서만 실행가능

# Nodes
sudo kubectl get nodes 
sudo kubectl get nodes -o wide # + 상세정보

# Pods
 # 모두 조회
sudo kubectl get pods -n kube-system # 특정 네임스페이스 조회

# 특정 노드 상세
sudo kubectl describe nodes ${노드명}

 # 클러스터 정보 조회
sudo kubectl cluster-info

WorkerNode를 클러스터에 삭제/재 등록

노드 삭제(마스터 노드에서)

# 노드 상태 확인
sudo kubectl get nodes

# 노드 스케줄링 비활성화
sudo kubectl cordon ${nodeName}

# 노드 회수
sudo kubectl drain ${nodeName} --ignore-daemonsets --delete-emptydir-data

# 노드 삭제
sudo kubectl delete node ${nodeName}

# ---
# 워커 노드에서 초기화 후 등록

# 스케줄링 활성화
sudo kubectl uncordon

노드 재등록(워커 노드에서)

# 노드 초기화
sudo kubeadm reset -f --cri-socket /var/run/cri-dockerd.sock

sudo rm -rf /etc/cni/net.d
sudo rm -rf /etc/kubernetes

# master에서 생성된 join 명령어 실행

클러스터 Join 토큰 재발행

# 마스터 노드에서
# 토큰 리스트 확인
sudo kubeadm token list

# 토큰이 invalid 되어 있다면 재생성
sudo kubeadm token create --print-join-command

# 워커노드에서
# 출력된 join 명령어 + 아래 옵션 추가 후 실행
# sudo kubeadm join ... 
--cri-socket="var/run/crio/crio.sock" --ignore-preflight-errors=cri

# 정상 등록 확인
kubectl get node -A

# 상태가 계속 NotReady로 뜬다면
# 워커노드를 재부팅하자

죽지않는 Pod, Namespace 삭제

# deployment가 살아있으면 계속 살아남
kubectl get deployemnt -n ${네임스페이스 명} 
kubectl delete deployment ${이름} 

# 좀비처럼 살아나는 Pod들 삭제
kubectl get daemonset -A # 데몬셋이 살아있으면 계속 살아남
kubectl delete ${RESOURCE_TYPE} ${NAME} --grace-period=0 --force

# 네임스페이스로 묶어서 삭제
# 첫번째 all : Pod 종류
# 두번째 all : 해당 종류의 모든 리소스
# 지우지 못하는 것 : configmaps, rolebindings, roles, secrets
kubectl delete all --all -n ${네임스페이스}

# 네임스페이스 강제삭제
kubectl get namespace "$namespace" -o json \
  | tr -d "\n" | sed "s/\"finalizers\": \[[^]]\+\]/\"finalizers\": []/" \
  | kubectl replace --raw /api/v1/namespaces/"$namespace"/finalize -f -

Label 추가/삭제/필터링

라벨은 YAML의 metadata 항목에도 정의할 수 있으며,

kubectl run 커맨드 실행 시 자동으로 run=<NAME>의 label이 추가된다.

# 라벨 부여
sudo kubectl label pod <POD_NAME> <KEY>=<VALUE>
sudo kubectl label ns <NAMESPACE> <KEY>=<VALUE>

# 라벨 수정 및 삭제
sudo kubectl label --overwrite ns <NAMESPACE> <KEY>=<NEW_VALUE> # 라벨 덮어씌우기
sudo kubectl label --overwrite ns <NAMESPACE> <KEY>- # 라벨 삭제

# 라벨 확인
kubectl get pod <NAME> --show-labels

# 라벨 조건 필터링
kubectl get pod <NAME> -l <KEY> # key 값으로 조회
kubectl get pod <NAME> -l <KEY>=<VALUE> # key=value 쌍으로 조회

프록시 & 포트 포워딩

# Proxy를 통한 외부노출
kubectl proxy --port ${PORT} --address ${마스터 노드 IP} --accept-hosts='^*$' [&]

# 포트포워딩을 통한 외부 노출
kubectl port-forward --address 0.0.0.0 ${deployment 이름} ${PORT} [&]

# ex) 대시보드 포트포워딩
kubectl port-forward --address 0.0.0.0 deployment/prometheus-grafana 3000 [&]

클러스터 내 설정 조회

# podCIDR 확인 
kubectl get nodes -o jsonpath='{.items[*].spec.podCIDR}' ;echo

# API 그룹 확인
kubectl api-resources --api-group='rbac.authorization.k8s.io/v1'

PV, PVC 삭제

# 방법1 : finalizers 필드 항목 삭제
kubectl edit pv ${pv name}

# 방법2 : 강제 삭제
kubectl delete pv ${pv name} --grace-period=0 --force

kubectl patch pod <pod name> -p '{"metadata":{"finalizers":null}}'
kubectl get pv,pvc -n kubeflow --no-headers=true | awk '{print $1}' | xargs kubectl patch -n kubeflow -p '{"metadata":{"finalizers":null}}'

Context 추가

# kubeconfig에 등록할 토큰 생성
kubectl create token ${생성한 Service Account 이름}
...토큰내용...

# Service Account를 Config에 등록
kubectl config set-credentials ${생성한 Service Account 이름} \
--token=${...토큰내용...} \
--kubeconfig=${적용할 Config 파일경로}

# Context는 
kubectl config set-context ${사용할 Context 이름} \
--cluster=${대상 Cluster 이름} \
--user=${Service Account 이름} \
--kubeconfig=${적용할 Config 파일경로}

ConfigMap, Secret 생성

# Create a new secret named my-secret with keys for each file in folder bar
kubectl create secret generic my-secret --from-file=path/to/bar

# Create a new secret named my-secret with specified keys instead of names on disk
kubectl create secret generic my-secret --from-file=ssh-privatekey=~/.ssh/id_rsa --from-file=ssh-publickey=~/.ssh/id_rsa.pub

# Create a new secret named my-secret with key1=supersecret and key2=topsecret
kubectl create secret generic my-secret --from-literal=key1=supersecret --from-literal=key2=topsecret

Istio 상에서 Pod와 연결된 DNS, 서비스 찾기

# 찾으려는 Pod 명 확인
kubectl get pod -n kubeflow-user-example-com
# elyra-0

# istio 상에서 Pod에 연결된 Endpoint IP, DNS 확인
istioctl proxy-config endpoint pod/elyra-0 -n kubeflow-user-example-com

# Endpoint IP와 일치하는 Endpoint 확인
k get endpoints -n kubeflow

# Endpoint와 연결된 Service 확인
k edit endpoints -n kubeflow ml-pipeline
...
subsets: ...

# 실제 통신이 가능한지 확인
kubectl get pods -n istio-system
# cluster-local-gateway-6955b67f54-zs6wd 
k exec -it cluster-local-gateway-6955b67f54-zs6wd -n istio-system -- /bin/bash
curl ${도메인 주소}

 

profile

주녁, DevNote

@junwork

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!