Интеграция Kubernetes Dashboard и пользователей GitLab
Kubernetes Dashboard — простой в работе инструмент для получения актуальных сведений о работающем кластере и минимального управления им. Начинаешь его ценить ещё больше, когда доступ к этим возможностям нужен не только администраторам/DevOps-инженерам, но и тем, кто меньше привык к консоли и/или не намерен разбираться со всеми тонкостями взаимодействия с kubectl и другими утилитами. Так случилось и у нас: разработчикам захотелось быстрого доступа к веб-интерфейсу Kubernetes, а поскольку мы используем GitLab, решение напросилось само собой.
Зачем это?
Непосредственные разработчики могут быть заинтересованы в инструменте вроде K8s Dashboard для задач по отладке. Иногда хочется просматривать логи и ресурсы, а порой и убивать pod’ы, масштабировать Deployments/StatefulSets и даже заходить в консоль контейнеров (случаются и такие запросы, для решения которых, впрочем, есть другой путь — например, через kubectl-debug).
Кроме того, есть и психологический момент для руководителей, когда они хотят посмотреть на кластер — увидеть, что «всё зелененькое», и таким образом успокоиться, что «всё работает» (что, конечно, весьма относительно… но это уже выходит за рамки статьи).
В качестве стандартной CI-системы у нас применяется GitLab: ей пользуются и все разработчики. Поэтому, чтобы предоставить им доступ, было логично сделать интеграцию Dashboard с аккаунтами в GitLab.
Также отмечу, что мы используем NGINX Ingress. Если же вы работаете с другими ingress-решениями, потребуется самостоятельно найти аналоги аннотаций для авторизации.
Пробуем интеграцию
Установка Dashboard
Внимание: Если вы собираетесь повторять описанные ниже шаги, то — во избежание лишних операций — сначала дочитайте до следующего подзаголовка.
Поскольку эта интеграция используется нами во множестве инсталляций, мы автоматизировали её установку. Исходники, которые потребуются для этого, опубликованы в специальном GitHub-репозитории. В их основе — незначительно модифицированные YAML-конфигурации из официального репозитория Dashboard, а также Bash-скрипт для быстрого развёртывания.
Скрипт устанавливает Dashboard в кластер и настраивает его на интеграцию с GitLab:
$ ./ctl.sh
Usage: ctl.sh [OPTION]... --gitlab-url GITLAB_URL --oauth2-id ID --oauth2-secret SECRET --dashboard-url DASHBOARD_URL
Install kubernetes-dashboard to Kubernetes cluster.
Mandatory arguments:
-i, --install install into 'kube-system' namespace
-u, --upgrade upgrade existing installation, will reuse password and host names
-d, --delete remove everything, including the namespace
--gitlab-url set gitlab url with schema (https://gitlab.example.com)
--oauth2-id set OAUTH2_PROXY_CLIENT_ID from gitlab
--oauth2-secret set OAUTH2_PROXY_CLIENT_SECRET from gitlab
--dashboard-url set dashboard url without schema (dashboard.example.com)
Optional arguments:
-h, --help output this message
Однако перед его использованием необходимо зайти в GitLab: Admin area → Applications — и добавить новое приложение для будущей панели. Назовём его «kubernetes dashboard»:
В результате его добавления GitLab предоставит хэши:
Именно они и используются в качестве аргументов к скрипту. В результате, установка выглядит следующим образом:
$ kubectl -n kube-system get pod | egrep '(dash|oauth)'
kubernetes-dashboard-76b55bc9f8-xpncp 1/1 Running 0 14s
oauth2-proxy-5586ccf95c-czp2v 1/1 Running 0 14s
Рано или поздно всё запустится, однако сразу авторизация работать не будет! Дело в том, что в используемом образе (ситуация в других образах аналогична) некорректно реализован процесс ловли редиректа в callback. Это обстоятельство приводит к тому, что oauth стирает cookie, которую сам же (oauth) нам предоставляет…
Проблема решается сборкой своего образа oauth с патчем.
diff --git a/dist.sh b/dist.sh
index a00318b..92990d4 100755
--- a/dist.sh
+++ b/dist.sh
@@ -14,25 +14,13 @@ goversion=$(go version | awk '{print $3}')
sha256sum=()
echo "... running tests"
-./test.sh
+#./test.sh
-for os in windows linux darwin; do
- echo "... building v$version for $os/$arch"
- EXT=
- if [ $os = windows ]; then
- EXT=".exe"
- fi
- BUILD=$(mktemp -d ${TMPDIR:-/tmp}/oauth2_proxy.XXXXXX)
- TARGET="oauth2_proxy-$version.$os-$arch.$goversion"
- FILENAME="oauth2_proxy-$version.$os-$arch$EXT"
- GOOS=$os GOARCH=$arch CGO_ENABLED=0
- go build -ldflags="-s -w" -o $BUILD/$TARGET/$FILENAME || exit 1
- pushd $BUILD/$TARGET
- sha256sum+=("$(shasum -a 256 $FILENAME || exit 1)")
- cd .. && tar czvf $TARGET.tar.gz $TARGET
- mv $TARGET.tar.gz $DIR/dist
- popd
-done
+os='linux'
+echo "... building v$version for $os/$arch"
+TARGET="oauth2_proxy-$version.$os-$arch.$goversion"
+GOOS=$os GOARCH=$arch CGO_ENABLED=0
+ go build -ldflags="-s -w" -o ./dist/oauth2_proxy || exit 1
checksum_file="sha256sum.txt"
cd $DIR/dists
diff --git a/oauthproxy.go b/oauthproxy.go
index 21e5dfc..df9101a 100644
--- a/oauthproxy.go
+++ b/oauthproxy.go
@@ -381,7 +381,9 @@ func (p *OAuthProxy) SignInPage(rw http.ResponseWriter, req *http.Request, code
if redirect_url == p.SignInPath {
redirect_url = "/"
}
-
+ if req.FormValue("rd") != "" {
+ redirect_url = req.FormValue("rd")
+ }
t := struct {
ProviderName string
SignInMessage string
Теперь можно осуществить сборку образа и за’push’ить его в наш же GitLab. Далее в manifests/kube-dashboard-oauth2-proxy.yaml укажем использование нужного образа (замените его на свой):
image: docker.io/colemickens/oauth2_proxy:latest
Если у вас закрытый авторизацией registry — не забудьте добавить использование секрета для pull’а образов:
Настало время зайти в Dashboard и найти довольно архаичную кнопку авторизации:
После нажатия на неё нас встретит GitLab, предлагая авторизоваться на своей привычной странице (конечно же, если мы не были предварительно авторизованы там):
Авторизуемся с учётными данными GitLab — и всё свершилось:
О возможностях Dashboard
Если вы разработчик, который прежде не работал с Kubernetes, или же просто по какой-то причине не сталкивались прежде с Dashboard — проиллюстрирую некоторые его возможности.
Во-первых, можно посмотреть, что «всё зелененькое»:
По pod’ам доступны и более детальные данные, такие как переменные окружения, выкаченный образ, аргументы запуска, их состояние:
У deployment’ов видны статусы:
… и другие подробности:
… а также есть возможность отмасштабировать deployment:
Результат этой операции:
Среди прочих полезных возможностей, уже упомянутых в начале статьи, — просмотр логов:
… и функция входа в консоль контейнеров выбранного pod’а:
Ещё, например, можно посмотреть и limit’ы/request’ы на узлах:
Конечно, это не все возможности панели, но надеюсь, что общее представление сложилось.
Недостатки интеграции и Dashboard
В описанной интеграции нет никакого разграничения доступа. С ней все пользователи, имеющие какой-либо доступ к GitLab, получают доступ в Dashboard. Доступ в самом Dashboard у них одинаковый, соответствующий правам самой Dashboard, которые определяются в RBAC. Очевидно, что это подойдёт не всем, но для нашего случая оказалось достаточным.
Из заметных минусов в самой панели Dashboard отмечу следующие:
невозможно попасть в консоль init-контейнера;
невозможно редактировать Deployments и StatefulSets, хотя это поправимо в ClusterRole;
совместимость Dashboard с последними версиями Kubernetes и будущее проекта вызывает вопросы.
Последняя проблема заслуживает особого внимания.
Статус и альтернативы Dashboard
Таблица совместимости Dashboard с релизами Kubernetes, представленная в последней версии проекта (v1.10.1), не очень-то радует:
Несмотря на это, существует (уже принятый в январе) PR #3476, который объявляет о поддержке K8s 1.13. Вдобавок, среди issues проекта можно найти упоминания пользователей, работающих с панелью в K8s 1.14. Наконец, коммиты в кодовую базу проекта не прекращаются. Так что (как минимум!) фактический статус проекта не настолько плох, как может сперва показаться из официальной таблицы совместимости.
Наконец, у Dashboard существуют альтернативы. Среди них:
K8Dash — молодой интерфейс (первые коммиты датируются мартом этого года), уже предлагающий неплохие возможности, такие как визуальное представление текущего статуса кластера и управление его объектами. Позиционируется как «интерфейс реального времени», т.к. автоматически актуализирует показываемые данные, не требуя обновлять страницу в браузере.
OpenShift Console — веб-интерфейс от Red Hat OpenShift, который, впрочем, принесёт в ваш кластер и другие наработки проекта, что не всем подходит.
Kubernator — интересный проект, созданный как более низкоуровневый (чем Dashboard) интерфейс с возможностью просмотра всех объектов кластера. Однако всё выглядит так, что его разработка прекратилась.
Polaris — буквально на днях анонсированный проект, который совмещает в себе функции панели (показывает текущее состояние кластера, но не управляет его объектами) и автоматической «валидации лучших практик» (проверяет кластер на корректность конфигураций запущенных в нём Deployments).
Вместо выводов
Dashboard — стандартный инструмент для кластеров Kubernetes, которые мы обслуживаем. Его интеграция с GitLab тоже стала частью нашей «инсталляции по умолчанию», поскольку многие разработчики рады тем возможностям, которые у них появляются с этой панелью.
У Kubernetes Dashboard периодически появляются альтернативы от Open Source-сообщества (и мы рады их рассмотреть), однако на данном этапе остаёмся с этим решением.