ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 쉽고 간단한 kubectl plugin 개발 하기 (1) - 기초 구현
    Cloud/Kubernetes 2019. 1. 20. 22:20
    1. kubectl plugin 이란?


    kubectl 은 kubernetes 를 CLI(command line interface)로 관리하기 도구 입니다.


    kubectl 을 사용하다 보면 너무 긴 명령을 반복해서 자주 입력해야 하거나,
    부족한 기능을 직접 개발한 script 나 tool, open-source tool 들로 보완할 경우가 많은데
    매번 명령어를 바꿔가며 작업하려면 여간 번거로운게 아닙니다.

    쿠버네티스 관련 명령어를 칠 때마다 prefix를 생각해서 다르게 입력해야하는게 완전 귀찮았습니다.
    kubectl 블라블라  / kubectx 블라블라  / kubens 블라블라  / stern 블라블라..
    또한, 기존 기능이나 명령어를 커스텀해서 사용하고 싶을 때도 있구요.

    kubectl describe pod xxxx~
    개발할 때 자주 안쓰는 단어라 그런지 저 단어가 엄청 안쳐집니다. (디스크라아아이브으~ 하면서 칩니다.)
    저는 그냥 show (오픈스택의 영향인가;) 나 list, get 이 좋아요..

    바로 이럴 때 kubectl plugin으로 만들어 넣으면 내가 만든 명령어 또는 기존 명령어를 kubectl 커스텀 명령어로 만들 수 있습니다.
    (*kubectl 버전 v1.12.0 이상 권장)


    2. kubectl plugin 구현


    kubectl plugin 은 소스 코드 수정 후 build 를 새로 한다거나 설정을 넣는다거나 하는 과정이 필요 없습니다.

    kubectl 이 설치된 동일 path 에 kubectl-<내명령어> 파일명을 가진 실행가능한 파일을 넣어두기만 하면 끝입니다.

    shell script, golang, python, java 등 어떤 언어이든지 상관 없습니다.

    쉘스크립트로 동작하는 간단한 hi 라는 플러그인을 만들어 봅시다.

    1) 플러그인 스크립트 만들기
    kubectl 이 설치된 동일 path 에 kubectl-hi 파일명의 쉘스크립트를 만듭니다.
    1
    vi $(which kubectl)-hi
    cs


    스크립트 내용은 아래 내용을 넣고 저장합니다. (wq)

    1
    2
    #!/usr/bin/env bash
    echo "hi $@"
    cs

    2) 실행권한 주기
    1
    chmod +$(which kubectl)-hi
    cs
    플러그인 만들기 끝!

    3) 확인
    아래 명령어로 플러그인이 제대로 인식되는지 확인 할 수 있습니다.
    1
    2
    3
    $ kubectl plugin list
    The following kubectl-compatible plugins are available:
    /usr/local/bin/kubectl-hi
    cs

    제대로 동작하는 지도 테스트해 봅시다.
    1
    2
    $ kubectl hi
    hi
    cs

    $@ 로 넘겨준 나머지 args 도 제대로 표시되는지 확인해봅니다.
    1
    2
    $ kubectl hi dennis
    hi dennis
    cs
    echo "hi $@" 동작이 제대로 작동하는군요.

    3. kubectl plugin 동작 구조

    kubectl plugin 구현 코드를 살펴보면,

    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
    41
    func handleEndpointExtensions(pluginHandler PluginHandler, cmdArgs []string) error {
        remainingArgs := []string{} // all "non-flag" arguments
     
        for idx := range cmdArgs {
            if strings.HasPrefix(cmdArgs[idx], "-") {
                break
            }
            remainingArgs = append(remainingArgs, strings.Replace(cmdArgs[idx], "-""_"-1))
            // 만약에 kubectl my-plugin 처럼 만들고 싶은 명령어에 - 이 들어간 경우는
            // 파일명에 kubectl-my_plugin 이렇게 _ (언더바) 를 넣어주면 - 으로 치환해서 사용할 수 있도록 구현되어 있네요.
        }
     
        foundBinaryPath := ""
     
        // attempt to find binary, starting at longest possible name with given cmdArgs
        for len(remainingArgs) > 0 {
            path, err := pluginHandler.Lookup(fmt.Sprintf("kubectl-%s", strings.Join(remainingArgs, "-")))
            if err != nil || len(path) == 0 {
                remainingArgs = remainingArgs[:len(remainingArgs)-1]
                // 받은 Args 1개(명령어)만 빼고 전부 그대로 넘겨줍니다.
                continue
            }
     
            foundBinaryPath = path
            break
        }
     
        if len(foundBinaryPath) == 0 {
            return nil
        }
     
        // invoke cmd binary relaying the current environment and args given
        // remainingArgs will always have at least one element.
        // execve will make remainingArgs[0] the "binary name".
        // OS 환경변수도 그대로 넘겨주네요~
        if err := pluginHandler.Execute(foundBinaryPath, append([]string{foundBinaryPath}, cmdArgs[len(remainingArgs):]...), os.Environ()); err != nil {
            return err
        }
     
        return nil
    }
    cs
    특정 인터페이스의 구현체를 만들어서 같이 빌드해야 하거나
    별도 설정 파일에 플러그인을 추가해주던가 하는 방법에 비해
    매우 심플하고 마음에 드는 방법이네요..

    그냥 system call로 실행시켜주는 방식이라 shell 스크립트이든 python 이든 바이너리든 언어도 가리지 않고 ㅋㅋ
    1
    return syscall.Exec(executablePath, cmdArgs, environment)

    c

    "응~ 너 하고 싶은거 다 해~"


    (김부선씨보다는 홍진영씨 팬이라 홍진영씨 버전으로..)
    물론 보안이나 성능을 따지자면 당연히 좋은 방법이라고는 못하겠지만
    이 정도면 개발자가 해줄 수 있는 최고의 자유도가 아닐까 싶습니다..

    다음 포스팅에서는 kubectl plugin 응용한 use case 에 대해서 소개해보도록 하겠습니다.

    # Reference




    'Cloud > Kubernetes' 카테고리의 다른 글

    Cloud Native CI/CD 구축하기 실습  (0) 2023.02.13
    쿠버네티스 배포 실습  (0) 2023.02.12
Designed by Tistory.