Привет, Хабр!
На моей работе мы пользуемся Kubernetes, для наших задач это очень полезный инструмент, который снимает с DevOps-ов и разработчиков много головной боли (хотя про DevOps-ов не уверен, но в любом случае, мне с ним жить точно проще). Как и многие, мы используем микросерверный подход, наш продукт состоит из большого количества компонентов, и Kubernetes позволяет ими удобно управлять. К сожалению, специфика нашего продукта такова, что разворачивать приложение только на одном кластере не предоставляется возможным (данные пользователей обрабатываются на другом кластере). Я не уверен, насколько сильно я могу распространяться про нюансы, поэтому оставлю описание на этом уровне, хотя, конечно, хочу рассказать больше.
Исходя из этого, для запуска и работы приложения нам нужно 2 кластера. Сейчас мы на этапе создания MVP, поэтому пока что мы имеем только два набора кластеров:
Dev - для разработчиков, чтобы можно было развернуть определённый коммит какого-то сервиса и проверить его.
Stage - для демо, разработчиков и тестировщиков, на нём разворачиваются только последние коммиты из веток main.
Вскоре добавиться третий набор - production. И того получается 6 кластеров в сумме.
Для работы с кластерами я в основном использую 2 программы:
Пока что мне их хватает, но в интернете можно найти намного больше приложений для работы с Kubernetes кластером. И все они для подключения к кластеру требуют один конфиг, который обычно находится в файле YAML формата$HOME/.kube/config
Соответственно, если вдруг вы захотите подключиться к другому кластеру, вам просто достаточно заменить этот конфиг на конфиг другого кластера. И вот уже на моменте взаимодействия с 4 кластерами я столкнулся с проблемой переключения между этими кластерами. В принципе, решение этой проблемы уже есть внутри команды - заранее готовый bash-скрипт, вызов которого позволяет менять местами конфиги. Я мог бы на этом и остановиться.
Но совсем недавно начал активно изучать Rust, и в качестве тестового проекта решил сделать замену внутреннему bash-скрипту - полноценное CLI приложение, которое управляет конфигами Kubernetes: KubEnv.
В общем-то вся это статья - это попытка рассказать о приложении и просьба о ревью. Ниже я распишу, как установить и взаимодействовать с приложением и как оно работает.
Установка
Установка возможна двумя способами:
Сборка из исходников.
Установка готового бинарника.
Готовый бинарник собирал и тестировал тольно на 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)
Evgenym
27.01.2023 11:21Я после того, как случайно забыл переключить контекст, теперь всегда добавляю ключ --context к kubectl. Да, возможно, громоздко, но в большинстве случаев помогает контролировать, что команда выполнится там, где надо. Ну а в плане экономии времени для разных манипуляций с ресурсами очень выручает OpenLens.
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 "
lllamnyp
29.01.2023 21:19+1Что только люди не делают, лишь бы не
kubectl config use-context dev
Кстати,
export KUBECONFIG=/path/to/kubecfg1:/path/to/kubecfg2
Тоже работает.
DesertEagle
30.01.2023 05:36Даже если не брать во внимание kubectx, то переключение между конфигами можно забить в алиасы. Я пользовался и тем, и другим. Не вижу, чтобы было дольше создать конфиг руками, закинуть в алиас контекст и вызывать нужный лёгким движением руки.
Да, список не под рукой, но у меня блок алиасов для k8s в .bashrc вынесен отдельно, поэтому grep'ом удобно посмотреть. (При желании и это тоже можно запихать в алиас, некоторые коллеги так и делают).
dmitriylyalyuev
Чем kubectx не подошел?
Ryder95 Автор
Тем, что я про него не знал и не нагуглил( Сейчас попробовал, он работает в рамках одного конфига, в принципе, можно слить все конфиги в один и переключаться между контекстами, но пока подход с файлами мне кажется более удобным, так как нет необходимости лезть в сам конфиг
Gutt
Тем, что перезаписывает файлы, и одному юзеру на одной машине не получится одновременно рулить разными кластерами. Kubech в этом смысле много лучше. И гигантский конфиг готовить не нужно, он умеет кушать из отдельных файлов.