Привет, Хабр!

На моей работе мы пользуемся Kubernetes, для наших задач это очень полезный инструмент, который снимает с DevOps-ов и разработчиков много головной боли (хотя про DevOps-ов не уверен, но в любом случае, мне с ним жить точно проще). Как и многие, мы используем микросерверный подход, наш продукт состоит из большого количества компонентов, и Kubernetes позволяет ими удобно управлять. К сожалению, специфика нашего продукта такова, что разворачивать приложение только на одном кластере не предоставляется возможным (данные пользователей обрабатываются на другом кластере). Я не уверен, насколько сильно я могу распространяться про нюансы, поэтому оставлю описание на этом уровне, хотя, конечно, хочу рассказать больше.

Исходя из этого, для запуска и работы приложения нам нужно 2 кластера. Сейчас мы на этапе создания MVP, поэтому пока что мы имеем только два набора кластеров:

  1. Dev - для разработчиков, чтобы можно было развернуть определённый коммит какого-то сервиса и проверить его.

  2. Stage - для демо, разработчиков и тестировщиков, на нём разворачиваются только последние коммиты из веток main.

Вскоре добавиться третий набор - production. И того получается 6 кластеров в сумме.

Для работы с кластерами я в основном использую 2 программы:

  1. kubectl

  2. k9s

Пока что мне их хватает, но в интернете можно найти намного больше приложений для работы с Kubernetes кластером. И все они для подключения к кластеру требуют один конфиг, который обычно находится в файле YAML формата$HOME/.kube/config

Соответственно, если вдруг вы захотите подключиться к другому кластеру, вам просто достаточно заменить этот конфиг на конфиг другого кластера. И вот уже на моменте взаимодействия с 4 кластерами я столкнулся с проблемой переключения между этими кластерами. В принципе, решение этой проблемы уже есть внутри команды - заранее готовый bash-скрипт, вызов которого позволяет менять местами конфиги. Я мог бы на этом и остановиться.

Но совсем недавно начал активно изучать Rust, и в качестве тестового проекта решил сделать замену внутреннему bash-скрипту - полноценное CLI приложение, которое управляет конфигами Kubernetes: KubEnv.

В общем-то вся это статья - это попытка рассказать о приложении и просьба о ревью. Ниже я распишу, как установить и взаимодействовать с приложением и как оно работает.

Установка

Установка возможна двумя способами:

  1. Сборка из исходников.

  2. Установка готового бинарника.

Готовый бинарник собирал и тестировал тольно на Linux Fedora 37, поэтому, если хотите попоробовать и у вас другая операционная система, то более правильным вариантом будет сборка из исходников.

Сборка из исходников

Для сборки на вашем компьютере должен быть доступ в Интернет и должен быть установлен Rust и Git.

git clone https://github.com/OlegYurchik/kubenv
cd kubenv
cargo build --release
sudo cp ./target/release/kubenv /usr/local/bin/kubenv

Бинарник

wget -c https://github.com/OlegYurchik/kubenv/releases/latest/download/kubenv.tar.gz -O - | tar -xz
sudo mv ./kubenv /usr/local/bin/kubenv

Быстрый старт

Сейчас приложение имеет небольшой набор стандартных команд:

  • list

  • apply

  • add

  • remove

  • show

  • export

С помощью list можно посмотреть список конфигов, которые доступны:

bash-5.2$ kubenv list
  dev-cp
  dev-dp
  keppel-dev-cp
  keppel-dev-dp
* stage-cp
bash-5.2$ 

С помощью apply можно применить определённый конфиг:

bash-5.2$ kubenv apply dev-cp
Apply config 'dev-cp' succesfully
bash-5.2$ kubenv list
* dev-cp
  dev-dp
  keppel-dev-cp
  keppel-dev-dp
  stage-cp
bash-5.2$ 

С помощью add можно добавить новый конфиг:

kubenv add --name tmp_config --file ~/kubeconfigs/tmp_config

С помощью remove - удалить конфиг:

kubenv remove tmp_config

С помощью show - вывести конфиг на экран:

kubenv show dev-cp

С помощью export - сохранить конфиг на жёстком диске:

kubenv export dev-cp --file /kubeconfigs/dev_cp

Как это работает

Все конфиги для KubEnv по умолчанию хранятся в папке $HOME/.kube/kubenv с именем файла name.kubeconfig, где name - это имя конфига. Это позволяет хранить все данные, связанные с Kubernetes в одном месте. То есть если вы решите переехать с одного компьютера на другой или переустановить систему, вам достаточно просто сделать бэкап папки .kube. Но если такой вариант не подходит, в приложении есть возможность задать свой путь для хранения конфигов с помощью параметра --dir.

Конфиги хранятся в оригинальном виде - это позволяет пользователю при необходимости безболезненно редактировать их.

Плагин для kubectl

Приложение можно настроить как плагин к kubectl. Для этого достаточно после установки выполнить команду:

sudo ln -sf /usr/local/bin/kubenv /usr/local/bin/kubectl-env

После этого приложением можно пользоваться, вызывая kubectl env вместо kubenv.

Например:

bash-5.2$ kubectl env list
* dev-cp
  dev-dp
  keppel-dev-cp
  keppel-dev-dp
  stage-cp
bash-5.2$ 

Под конец

Я буду очень рад, если это приложение будет решать не только мою боль, но и боль многих людей. Также буду благодарен за комментарии, за критику, за ревью и за найденные issues. Спасибо, что дочитали до конца.

Комментарии (9)


  1. dmitriylyalyuev
    27.01.2023 10:16
    +6

    Чем kubectx не подошел?


    1. Ryder95 Автор
      27.01.2023 10:24

      Тем, что я про него не знал и не нагуглил( Сейчас попробовал, он работает в рамках одного конфига, в принципе, можно слить все конфиги в один и переключаться между контекстами, но пока подход с файлами мне кажется более удобным, так как нет необходимости лезть в сам конфиг


    1. Gutt
      27.01.2023 21:56

      Тем, что перезаписывает файлы, и одному юзеру на одной машине не получится одновременно рулить разными кластерами. Kubech в этом смысле много лучше. И гигантский конфиг готовить не нужно, он умеет кушать из отдельных файлов.


  1. Evgenym
    27.01.2023 11:21

    Я после того, как случайно забыл переключить контекст, теперь всегда добавляю ключ --context к kubectl. Да, возможно, громоздко, но в большинстве случаев помогает контролировать, что команда выполнится там, где надо. Ну а в плане экономии времени для разных манипуляций с ресурсами очень выручает OpenLens.


  1. GDXbsv
    27.01.2023 11:40
    +2

    Попробуйте kubie https://github.com/sbstp/kubie


  1. antivoland
    27.01.2023 14:54
    +5

    Почему бы не проще:

    #cat ~/.bash_profile
    alias kkdev="kubectl --kubeconfig /Users/admin/.kube/config.dev "
    alias kkstage="kubectl --kubeconfig /Users/admin/.kube/config.stage "
    alias kkprod="kubectl --kubeconfig /Users/admin/.kube/config.prod "


  1. alecx
    27.01.2023 18:39
    +1

    раз уж все равно используете k9s, то в нем можно делать:ctx


  1. lllamnyp
    29.01.2023 21:19
    +1

    Что только люди не делают, лишь бы не

    kubectl config use-context dev

    Кстати,

    export KUBECONFIG=/path/to/kubecfg1:/path/to/kubecfg2

    Тоже работает.


  1. DesertEagle
    30.01.2023 05:36

    Даже если не брать во внимание kubectx, то переключение между конфигами можно забить в алиасы. Я пользовался и тем, и другим. Не вижу, чтобы было дольше создать конфиг руками, закинуть в алиас контекст и вызывать нужный лёгким движением руки.

    Да, список не под рукой, но у меня блок алиасов для k8s в .bashrc вынесен отдельно, поэтому grep'ом удобно посмотреть. (При желании и это тоже можно запихать в алиас, некоторые коллеги так и делают).