본문 바로가기
DevOps/Kubernetes

[1] 쿠버네티스 확장 - kubectl plugin

by 비어원 2023. 10. 29.
728x90

kubectl 도구는 내부적으로 쿠버네티스 API를 사용하여 쿠버네티스 클러스터와 통신하여 쿠버네티스 클러스터와 리소스를 조회하고 변경하기 위해 사용하는 CLI 툴이다. kubectl에서는 쿠버네티스 리소스를 조회하거나 변경하기 위한 여러가지 명령어들을 제공하고 있다.

 

 

그런데 kubectl에서 제공하는 명령어 외에도 사용자가 직접 쿠버네티스 클러스터에 관련된 기능들을 개발하여 명령어를 추가할 수 있다. kubectl 커맨드라인 도구 자체에서 플러그인을 사용할 수 있도록 확장성 있게 개발되었기 때문에 추가 명령어 개발이 가능하다.

 

kubectl plugin

kubectl에서 사용하는 plugin을 개발하려면 kubectl-로 시작되는 독립적인 실행 파일을 개발하기만 하면 된다.kubectl-xxx 이라는 이름으로 작성하면 실제 명령어는 kubectl xxx 으로 명령어를 사용할 수 있다. plugin은 쉘 스크립트를 포함하여 커맨드-라인 명령을 작성할 수 있는 프로그래밍 언어나 스크립트로 개발할 수 있다.

 

대신 실행 가능한 파일 이름에는 몇 가지 제약사항이 있다.

  1. kubectl에서 기본적으로 제공해주는 명령어 이름으로 플러그인을 만들 수 없다. 예를 들어 kubectl-version 이라는 이름으로 플러그인을 만들 수 없다. 즉, 기존 명령어를 오버라이딩하는 것은 불가능하다.
  2. kubectl에서 기본적으로 제공해주는 명령어에 새로운 하위 명령어를 추가할 수도 없다. 예를 들어 kubectl-create-foo 라는 이름으로 kubectl create foo 명령어를 추가해도 kubectl create 가 기본으로 제공해주는 명령어이기 때문에 실제로 하위 명령어가 먹히지 않는다.

 

플러그인을 개발 완료하였다면 플러그인 실행 파일을 $PATH 환경변수에 위치시키면 플러그인을 실행할 준비가 완료된다.

 

예시

플러그인의 예시로 쿠버네티스 워커노드 이름을 입력하면 해당 노드로 ssh 접근을 하는 플러그인 명령어를 개발해보자. 플러그인 이름은 kubectl-ssh로 짓자.

 

kubectl-ssh

#!/bin/bash

# --help 옵션 처리
for arg in "$@"
do
    if [[ "$arg" == "--help" ]] || [[ "$arg" == "-h" ]]; then
        echo -e "Try ssh access to a specific node.\n"
        echo -e "Examples:\n\n  # Shows the names and IPs of all nodes in the cluster.\n  kubectl ssh\n\n  # Try ssh access to worker-1 node.\n  kubectl ssh worker-1\n"
        exit 0
    fi
done

# version 처리
if [[ "$1" == "version" ]]
then
    echo "1.0.0"
    exit 0
fi

# 아무것도 입력 안했을 경우 노드의 정보를 보여준다.
if [[ "$1" == "" ]]; then
    kubectl get no -o jsonpath='NAME{"\t"}INTERNAL_IP{"\n"}{range .items[*]}{.metadata.name}{"\t"}{.status.addresses[?(@.type == "InternalIP")].address} {"\n"}{end}'

else
    IP=$(kubectl get no -o jsonpath='NAME{"\t"}INTERNAL_IP{"\n"}{range .items[*]}{.metadata.name}{"\t"}{.status.addresses[?(@.type == "InternalIP")].address} {"\n"}{end}' | grep $1 | awk '{print $2}')

    if [[ "$IP" == "" ]]; then
        echo "$1 은 존재하는 노드가 아닙니다."
        exit 1
    fi
    ssh beer1@$IP
fi
  • $1kubectl ssh 뒤에 나타나는 인자로 보면 된다. 여기서는 $1은 쿠버네티스 노드의 이름으로 간주한다.
  • 어떤 인자가 와도 --help 또는 -h 옵션이 온다면 명령어 사용 방법을 보여주도록 한다.
  • $1 뒤에 version이 온다면 해당 플러그인의 버전을 보여주도록 조건문을 넣을 수 있다. 그 외에도 특수한 인자를 예약하고 싶다면 조건문을 넣으면 된다.
  • 아무런 인자를 입력하지 않았을 경우에는 예외로 클러스터의 모든 노드의 이름과 IP를 보여준다. 접속하고자 하는 노드 이름을 더 쉽게 찾을 수 있도록 편의를 제공하자.
  • 인자를 입력했을 경우에는 kubectl 명령어를 통해 노드의 IP를 조회한 후 ssh 접속을 시도한다. 만약 IP가 조회가 되지 않는다면 클러스터에 존재하지 않은 워커노드를 조회한 것이기 때문에 에러 메시지를 보여준다.

 

플러그인을 개발한 후에는 플러그인을 실행 가능한 파일로 만들어야 한다.

$ chmod +x kubectl-ssh

 

그 후 해당 플러그인 파일을 $PATH 경로 중 하나에 위치시켜야 한다. 또는 플러그인을 저장하는 디렉터리를 별도로 만든 다음에 해당 디렉터리를 $PATH 환경변수에 추가하면 된다. 자신의 쉘 프로그램이 bash이면 ~/.bashrc를, zsh이라면 ~/.zshrc$PATH를 추가하는 명령어를 넣은 후 터미널을 재시작하면 된다.

PATH=$PATH:${플러그인 관리 디렉터리 경로}

 

플러그인 실행

모든 구성이 완료되었다면 플러그인을 실행시키기 전에 실행 가능한지를 확인해보자. kubectl plugin list 명령어를 통해 실행 가능한 플러그인들을 조회할 수 있다.

$ kubectl plugin list
The following compatible plugins are available:

/Users/user/Documents/myProjects/k8s-manifests/plugin/kubectl-password
/Users/user/Documents/myProjects/k8s-manifests/plugin/kubectl-ssh

 

이렇게 available list가 뜨면 정상이다. 정상적으로 떴다면 실제로 실행시켜보자.

 

--help 옵션, version 하위 명령어와 아무런 인자를 주지 않았을 때 의도했던 대로 동작이 되는 것을 확인할 수 있다. 그러면 실제로 노드 이름을 입력하여 ssh 접속이 되는지 확인해보자.

 

정상적으로 되는 것을 확인할 수 있다.

728x90

댓글