- PVSM.RU - https://www.pvsm.ru -
Рады анонсировать новую Open Source-разработку компании «Флант» для DevOps-специалистов и не только — kubedog [1]. Это написанная на Go библиотека и CLI на её основе для отслеживания событий ресурсов Kubernetes и сбора их логов.

На данный момент библиотека поддерживает слежение за следующими ресурсами: Pod (и Container), Job, Deployment, StatefulSet и DaemonSet. События и логи передаются через callback’и.
CLI в kubedog имеет два режима работы:
tail -f.Зачем мы стали писать новую библиотеку, если подобные проекты уже существуют (см. «Работу с логами» в этом обзоре [2])? Kubedog используется в нашей DevOps-утилите dapp [3] для слежения за ходом выката Helm-чартов. Сам Helm не умеет следить за состоянием ресурсов, которые он же добавляет, а передача логов не предусмотрена на уровне GRPC-взаимодействия между Helm и tiller. По этому поводу есть наш issue 3481 [4], в рамках которого нами же было реализовано отслеживание добавленных ресурсов… Однако проект Helm сейчас неохотно добавляет новые функции в Helm 2, поскольку все силы сосредоточены на новой версии Helm 3 [5]. По этой причине мы решили выделить kubedog в отдельный проект.
Что же нужно от библиотеки слежения за ресурсами?
rollout в режим ready. И у каждого ресурса свои условия для этого.Как легко догадаться, в kubedog мы постарались учесть всё вышеперечисленное.
По-хорошему, в начале работы над чем-то новым проводят анализ существующих решений. Но оказалось, что хотя решений в виде CLI много, то Go-библиотеки попросту нет. Поэтому нам остаётся лишь привести небольшое сравнение основных особенностей существующих CLI-утилит для слежения за ресурсами Kubernetes.
→ GitHub [7]
→ GitHub [8]
→ GitHub [9]
→ GitHub [10]
→ GitHub [11]
→ GitHub [1]
Если приглядеться, то можно сказать, что каждая утилита в чём-то обыгрывает своих соперников и нет однозначного победителя, который бы умел делать всё, что и остальные.
Суть работы kubedog в следующем: для указанного ресурса запустить Watcher’ы на Event’ы и на Pod’ы, принадлежащие ресурсу, а при появлении Pod’а запустить сборщик его логов. Всё, что происходит с ресурсом, транслируется клиенту с помощью вызова callback’ов.
Рассмотрим на примере DaemonSet, что доступно для кода, использующего библиотеку. Интерфейс callback’ов для Deployment, StatefulSet и DaemonSet одинаков* — это ControllerFeed [12]:
type ControllerFeed interface {
Added(ready bool) error
Ready() error
Failed(reason string) error
EventMsg(msg string) error
AddedReplicaSet(ReplicaSet) error
AddedPod(ReplicaSetPod) error
PodLogChunk(*ReplicaSetPodLogChunk) error
PodError(ReplicaSetPodError) error
}
* Исключение составляет AddedReplicaSet, который имеет смысл только для Deployment (для слежения за DaemonsSet можно не определять этот метод).
Пояснения к другим методам интерфейса:
Added соответствует событию watch.Added наблюдателя за выбранным ресурсом;Ready вызывается, когда ресурс перешёл в состояние Ready (например, для DaemonSet это момент, когда количество обновлённых и доступных Pod’ов совпало с «желаемым» количеством Pod’ов);Failed — этот метод вызывается в случае удаления ресурса или в случае получения Event’а с причиной и описанием ошибки (например, FailedCreate);EventMsg вызывается для каждого полученного Event’а от ресурса или его Pod’ов: это события о создании ресурса, о закачке образа и т.д. В том числе и сообщения об ошибке;AddedPod — метод, которым можно ловить моменты создания новых Pod’ов;PodLogChunk вызывается, когда от Kubernetes API приходит очередной кусок логов;PodError будет вызван в случае ошибки Pod’а.
Каждый callback может вернуть ошибку типа StopTrack и слежение будет завершено. Так, например, сделано в rollout tracker — Ready возвращает StopTrack [13] и CLI завершает свою работу.
Для облегчения определения callback’ов есть структура ControllerFeedProto, при создании объекта которой можно определить нужный callback метод.
Вот так, например, будет выглядеть бесконечный вывод логов DaemonSet’а без дополнительной информации о событиях и состоянии:
// kubedog может подключаться как снаружи Kubernetes'а, так и внутри
// (см. https://github.com/flant/kubedog/blob/b34d9aba92cd6f7909222e8935f64b31f1cc8deb/pkg/kube/kube.go">kube.go</a>
kubeClient, err := kubernetes.NewForConfig(config)
if err != nil {
return err
}
feed := &tracker.ControllerFeedProto{
PodLogChunkFunc: func(chunk *tracker.ReplicaSetPodLogChunk) error {
for _, line := range chunk.LogLines {
fmt.Printf(">> po/%s %s: %sn", chunk.PodName, chunk.ContainerName, line)
}
return nil
},
}
// Опциями можно задать timeout ответа от API сервера и время, начиная с которого показывать логи. Если время пусто, то логи будут выведены все, начиная от старта Pod'а.
opts := tracker.Options{
Timeout: time.Second * time.Duration(300),
LogsFromTime: time.Now(),
}
tracker.TrackDaemonSet(dsName, dsNamespace, kubeClient, feed, opts)
Последний вызов — блокирующий: он запускает бесконечный цикл получения событий от Kubernetes и вызов соответствующих callback’ов. Программно прервать этот цикл можно с помощью возврата StopTrack из callback’а.
Применение kubedog в качестве библиотеки можно увидеть [14] в утилите dapp. Здесь запускаются готовые rollout Tracker’ы для проверки ресурсов, которые создаёт или обновляет Helm.
Kubedog CLI способен помочь с выкатом в системе CI/CD, причём вне зависимости от того, что используется: kubectl, Helm или что-то другое. Ведь можно запустить kubectl apply, а следом — kubedog rollout track, и в логах выката будет видно ошибку, если с ресурсом что-то не то. Такое применение kubedog поможет сократить время на диагностику проблем с выкатом.
В наших планах развивать библиотеку в сторону поддержки большего количества ресурсов — например, очень хочется следить за Service и Ingress. Помимо этого предполагается провести работу по классификации reason в Event’ах, чтобы точнее определять момент, когда можно считать, что выкат ресурса не удался. Ещё один вектор развития библиотеки — слежение за несколькими ресурсами сразу, например, по labelSelector или по имени namespace. Также хочется поддерживать разные аннотации, которые могут изменять характер слежения, например, за хукам Helm’а, но это пока больше актуально для dapp.
В ближайшем будущем фокус будет именно на библиотеке, но и для CLI планируются улучшения: более удобные команды и флаги, раскраска логов, сообщения про удаление Pod’ов, как в stern. Также мы рассматриваем возможность создания интерактивного режима с таблицей состояния Deployment и событиями в одном окне и с логами — в другом.
Сборки kubedog CLI под Linux и macOS доступны на bintray [15].
Очень ждём ваших отзывов и issues в GitHub [1]!
Читайте также в нашем блоге:
Автор: diafour
Источник [20]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/open-source/303198
Ссылки в тексте:
[1] kubedog: https://github.com/flant/kubedog
[2] этом обзоре: https://habr.com/company/flant/blog/426985/
[3] DevOps-утилите dapp: https://habr.com/company/flant/blog/333682/
[4] наш issue 3481: https://github.com/helm/helm/issues/3481
[5] Helm 3: https://habr.com/company/flant/blog/417079/
[6] Event’ами: https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.13/#event-v1-core
[7] GitHub: https://github.com/pulumi/kubespy
[8] GitHub: https://github.com/johanhaleby/kubetail
[9] GitHub: https://github.com/wercker/stern/
[10] GitHub: https://github.com/boz/kail
[11] GitHub: https://github.com/dtan4/k8stail
[12] ControllerFeed: https://github.com/flant/kubedog/blob/b34d9aba92cd6f7909222e8935f64b31f1cc8deb/pkg/tracker/controller.go
[13] возвращает StopTrack: https://github.com/flant/kubedog/blob/b34d9aba92cd6f7909222e8935f64b31f1cc8deb/pkg/trackers/rollout/daemonset.go#L28
[14] можно увидеть: https://github.com/flant/dapp/blob/master/pkg/deploy/helm.go
[15] bintray: https://bintray.com/dapp/dapp/Kubedog/0.1.0-alpha#files/kubedog
[16] kubebox и другие консольные оболочки для Kubernetes: https://habrahabr.ru/company/flant/blog/426985/
[17] Представляем loghouse — Open Source-систему для работы с логами в Kubernetes: https://habr.com/company/flant/blog/341386/
[18] Официально представляем dapp — DevOps-утилиту для сопровождения CI/CD: https://habrahabr.ru/company/flant/blog/333682/
[19] Инфраструктура с Kubernetes как доступная услуга: https://habr.com/company/flant/blog/341760/
[20] Источник: https://habr.com/post/434160/?utm_campaign=434160
Нажмите здесь для печати.