주녁, DevNote
article thumbnail

1. 개요

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

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

2. 상황별 명령어 모음

2.1. Pod, Node 조회

<bash />
# 마스터 노드에서만 실행가능 # 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

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

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

<bash />
# 노드 상태 확인 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

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

<bash />
# 노드 초기화 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 명령어 실행

2.2.3. 클러스터 Join 토큰 재발행

<bash />
# 마스터 노드에서 # 토큰 리스트 확인 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로 뜬다면 # 워커노드를 재부팅하자

2.3. 죽지않는 Pod, Namespace 삭제

<bash />
# 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 -

2.4. Label 추가/삭제/필터링

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

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

<bash />
# 라벨 부여 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 쌍으로 조회

2.5. 프록시 & 포트 포워딩

<bash />
# 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 [&]

2.6. 클러스터 내 설정 조회

<bash />
# podCIDR 확인 kubectl get nodes -o jsonpath='{.items[*].spec.podCIDR}' ;echo # API 그룹 확인 kubectl api-resources --api-group='rbac.authorization.k8s.io/v1'

2.7. PV, PVC 삭제

<bash />
# 방법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}}'

2.8. Context 추가

<bash />
# 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 파일경로}

2.9. ConfigMap, Secret 생성

<bash />
# 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

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

<bash />
# 찾으려는 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

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