company_banner

Консольные помощники для работы с Kubernetes через kubectl

    image
    Kubectl — основной консольный интерфейс для взаимодействия с Kubernetes и, безусловно, важный инструмент в руках любого администратора/DevOps-инженера, причастного к эксплуатации таких кластеров. Если вы пользуетесь им каждый день и делаете это по-настоящему активно, то, как это свойственно ИТ-специалистам, наверняка задумывались о способах упрощения/автоматизации своих манипуляций. Благо, это мир сисадминов, Open Source и консоли, так что в нём, конечно, уже нашлись и те, кто не только задумывался об этом, но и воплотил свои потребности в жизнь — в виде утилит, доступных теперь и всем «коллегам по цеху». О них и пойдёт речь в этом небольшом обзоре.

    kube-shell


    • GitHub
    • Язык: Python*
    • Лицензия: Apache 2.0

    Интерактивная оболочка для kubectl, в основе которой — библиотека prompt-toolkit для Python, служащая «заменой для GNU readline и гораздо большим». Эта библиотека реализует автоматическое дополнение вводимых команд с выпадающими пояснениями, подсветку синтаксиса и ряд других возможностей, которые по сути и делают всю «интерактивность» в kube-shell. Тот случай, когда проще один раз увидеть:



    Среди других возможностей этой оболочки:

    • автоматические подсказки, появляющиеся по мере ввода команд в стиле fish shell;
    • история введённых команд с поиском по частичным совпадениям;
    • расширенные фичи автодополнения: fuzzy-поиск, подстановка значений из полученных с сервера данных;
    • удобное переключение между кластерами и пространствами имён (висит тикет на добавление аналогичного переключения между пользователям);
    • режим редактирования vi.

    В непонятном будущем ожидается также появление поддержки SQL-подобного языка для выполнения через kubectl команд такого вида:

    ls <resource-name> select (property1, property2, property3) where (propery1=value1 and property2=value2) order by property3

    Вдохновением для kube-shell послужили похожие оболочки для работы с API в AWS: aws-shell и saws.

    * В проекте также используется вспомогательная программа на Go (она забавно называется — python_eats_cobra.go) для генерации JSON-файла с доступными в kubectl командами, аргументами и т.п. В дальнейшем с этим файлом работает основное приложение на Python.

    kube-prompt


    • GitHub
    • Язык: Go
    • Лицензия: MIT License

    Ещё одна интерактивная оболочка, очень похожая по своей сути на описанную ранее kube-shell и появившаяся на месяц позже (согласно первому коммиту в GitHub, который случился в июле против июня 2017 года). Её главное отличие — использование «родного» для Kubernetes-сообщества языка программирования Go вместо Python. Однако своего prompt-toolkit у Go не было, поэтому… автор (Masashi Shibata из Японии) взял и написал go-prompt, а уже на её основе реализовал новую оболочку. И результатам получился весьма схожим:


    (Набор символов справа снизу — последовательность нажатий на клавиатуре для достижения такого результата. Более наглядно — в этой GIF-анимации на 16 Мб.)

    Если сравнивать kube-prompt с его Python-собратом глазами конечного пользователя, то дополнительных фишек у него меньше (например, отсутствует постоянный вывод текущего кластера/пространства имён и быстрое переключение между ними). Зато в нём нет необходимости вводить «kubectl» в начале всех команд и этом сохранена возможность добавления других shell-команд через pipe («|») — например, grep при получении списка подов.

    Тем не менее, несмотря на то, что kube-prompt разрабатывается единственным человеком и чуть меньше по времени, по количеству звёздочек на GitHub он уже немного впереди, так что перспективы дальнейшего развития у этих конкурентных решений не столь очевидны.

    kubectl-repl


    • GitHub
    • Язык: Go
    • Лицензия: Apache 2.0

    «REPL» в названии этого приложения — тот самый цикл Read–Eval–Print Loop, реализующий простую интерактивную среду внутри shell. По сути же kubectl-repl представляет собой оригинальную «обёртку», которая после своего запуска предлагает вводить дальнейшие команды без упоминания kubectl и упрощает взаимодействие с этой утилитой благодаря двум возможностям:

    1. Переключение пространств имён (одной командой выбирается текущее, которое затем показывается как актуальное в приглашении и добавляется ко всем последующим вызовам kubectl);
    2. «Номерной» выбор элементов из списков, возвращаемых kubectl get.

    Вторая фича реализована таким образом, что всем элементам списков — например, для списка подов, вернувшихся по команде kubectl get pods | grep foobar, — добавляется столбец с переменными вида $1, $2, $3… Эти переменные доступны для использования в дальнейших командах kubectl или shell. Пример из документации:

    # kube-system get pods
    + kubectl -n kube-system get pods
       	NAME                        READY     STATUS    RESTARTS   AGE
    $1 	kube-dns-3945342221-mwdh6   3/3       Running   0          9d
    $2 	kube-dns-3945342221-x3fhn   3/3       Running   0          9d
    # kube-system ; echo $(whoami) $2
    +  echo $(whoami) kube-dns-3945342221-x3fhn
    mikulas kube-dns-3945342221-x3fhn

    Утилита kubectl-repl — совсем молодая, разрабатывается одним энтузиастом меньше месяца.

    k8sh


    • GitHub
    • Язык: Bash
    • Лицензия: Apache 2.0

    Ещё одна попытка сделать простую обёртку вокруг kubectl — на сей раз на обычном Bash. После запуска отображает в своём приглашении текущий контекст (kubectl config current-context) и пространство имён, предлагая короткие команды для их смены (ct и ns соответственно), а также набор из других алиасов. Например:

    • kubectl describek describe
    • kubectl get podspods
    • kubectl get persistentvolumeclaimspvc



    Подгружаемые с запуском k8sh алиасы можно расширять, создав файл ~/.k8sh_extensions со своим Bash-кодом (в репозитории есть пример, как этим воспользоваться).

    kubectl-aliases


    • GitHub
    • Язык: Python, Bash
    • Лицензия: Apache 2.0

    Более «хардкорный» вариант Bash/zsh-алиасов для kubectl. Его автор написал скрипт на Python, который автоматически генерирует файл .kubectl_aliases, содержащий сотни(!) строчек следующего вида:

    alias k='kubectl'
    …
    alias ka='kubectl apply -f'
    …
    alias ksyslo='kubectl --namespace=kube-system logs -f'
    …
    alias ksysgdep='kubectl --namespace=kube-system get deployment'
    …
    alias kgno='kubectl get nodes'
    …
    alias ksysgdepojson='kubectl --namespace=kube-system get deployment -o=json'
    …

    Как отмечает сам автор, анонсировавший своё детище менее 2 недель назад, «это может выглядеть по-настоящему глупо, однако ОЧЕНЬ ПОЛЕЗНО для меня; [благодаря этим алиасам] я действительно существенно экономлю время в своём ежедневном рабочем процессе».

    Другие


    • О kubectx для удобного переключения между кластерами мы уже писали в этом обзоре, а с тех пор утилита была дополнена kubens (см. тот же репозиторий) для аналогичного переключения между пространствами имён.
    • kubeplay — ещё одна реализация REPL, но предлагающая использовать синтаксис Ruby.
    • zsh-kubectl-prompt — простой скрипт для отображения в приглашении zsh текущего контекста и пространства имён Kubernetes.

    P.S.


    Читайте также в нашем блоге:

    • +20
    • 4,6k
    • 2
    Флант
    285,00
    Специалисты по DevOps и высоким нагрузкам в вебе
    Поделиться публикацией

    Комментарии 2

      0
      Эм… Последнее слабо тянет на утилиту IMHO. А первые две однозначный must-have. Спасибо.
        0
        Вот ещё появилась: kube-ps1 — Kubernetes prompt info for bash and zsh.

        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

        Самое читаемое