Dev/DevOps

kubernetes 운영에 도움을 줄 몇 가지 명령

newtype 2023. 2. 23. 11:01

kubernetes를 운영하면서, 도움이 될만한 몇가지 alias를 만들었습니다.

alias 뒤에 pod명의 일부를 넣으면 해당 pod를 찾아서 명령을 수행합니다.

매칭되는 pod가 여러개면 후보 목록을 출력합니다.

usage

kexecti

컨테이너 안에서 명령을 실행합니다.

kubectl exec -ti -n my-namespace my-pod -- ls -l 명령과 동일합니다.

host> $ kexecti my-pod ls -l
total 4
-rw-r--r-- 1 root root 82  Feb 23 10:32 README.md

kexecsh

컨테이너 안에 bash로 접속합니다.

kubectl exec -ti -n my-namespace my-pod -- bash --login 명령과 동일합니다.

host> $ kexecsh my-pod
pod> $ 

klogf

컨테이너 로그를 tail 겁니다.

kubectl logs -f -n my-namespace my-pod 명령과 동일합니다.

host> $ klogf my-pod

install

.kubeutil 파일을 home에 올리고, .bash_profile에 아래 내용을 추가합니다.

source .kubeutil

code review

_KUBECTL=/usr/local/bin/kubectl

_kube_get_pod_name() {
  _podname=""
  _namespace=""
  local num=`$_KUBECTL get pods -A --no-headers -o custom-columns=":metadata.name" | grep ^$1 | wc -l`

  if [ $num -eq 1 ]; then
    _podname=`$_KUBECTL get pods -A --no-headers -o custom-columns=":metadata.name" | grep ^$1`
    _namespace=`$_KUBECTL get pods -A --no-headers -o custom-columns=":metadata.namespace" --field-selector metadata.name=$_podname`
  elif [ $num -eq 0 ]; then
    echo "not found podname [$1]"
  else
    # prefix 검색결과가 여러개면, equal 검색해보고 없으면 에러 처리
    num=`$_KUBECTL get pods -A --no-headers -o custom-columns=":metadata.name" --field-selector metadata.name=$1 | wc -l`
    if [ $num -eq 1 ]; then
      _podname=`$_KUBECTL get pods -A --no-headers -o custom-columns=":metadata.name" --field-selector metadata.name=$1`
      _namespace=`$_KUBECTL get pods -A --no-headers -o custom-columns=":metadata.namespace" --field-selector metadata.name=$_podname`
      return
    fi
    echo "multiple pods named [$1]"
    $_KUBECTL get pods -A --no-headers -o custom-columns=":metadata.name" | grep ^$1
  fi
}

_kube_exec_ti() {
  _kube_get_pod_name $1

  if [ "$_podname" != "" ]; then
    $_KUBECTL exec -ti -n $_namespace $_podname -- ${*: 2:99}
  fi
}

_kube_exec_sh() {
  _kube_get_pod_name $1

  if [ "$_podname" != "" ]; then
    $_KUBECTL exec -ti -n $_namespace $_podname -- bash --login
  fi
}

_kube_exec_logf() {
  _kube_get_pod_name $1

  if [ "$_podname" != "" ]; then
    $_KUBECTL logs -f -n $_namespace $_podname
  fi
}

alias kexecti=_kube_exec_ti
alias kexecsh=_kube_exec_sh
alias klogf=_kube_exec_logf

ref

최종 코드는 github에 있습니다.

https://github.com/lmk/kubeutil

반응형