Проверка состояния кластера kubernetes

Kate

Administrator
Команда форума
Итак, вы наконец-то стали счастливым обладателем k8s-кластера: получили его в наследство, в подарок на Новый год, заказали в DataLine) и т. п. У новых клиентов и даже у опытных пользователей часто возникает вопрос, как оценить кластер и проверить его работоспособность?

В ответ мы написали этот мануал: при выполнении всех пунктов можно закрыть 95% вопросов о состоянии здоровья кластера. Поскольку проверка такой многокомпонентной системы может стать нетривиальной задачей, подойдем к процессу как можно проще.

Не только посмотрим в зубы нашему дареному коню, но и проверим температуру.
Не только посмотрим в зубы нашему дареному коню, но и проверим температуру.

Оцениваем общее состояние​

  1. Проверяем, насколько совпадает версия клиента и сервера, чтобы не получить несовместимость функционала при дальнейшей работе:
    kubectl get version
  2. Дальше смотрим основные ресурсы нашего кластера:
    kubectl cluster-info (обращаем внимание на ip-адрес, порт, состояние корднс в кластере)
    kubectl get cs -A (получаем статус основых компонентов k8s)
  3. Оценим состояние наших нод и подов, их статус. Выполним команды:
    kubectl get nodes -A -owide
    kubectl get pods -owide
    Здесь обращаем внимание на время жизни и количество рестартов подов: частые рестарты могут свидетельствовать о проблемах в кластере.
  4. Посмотрим на события в кластере за последний час:
    kubectl get events -owide
    В выводе этой команды обращаем внимание на то:
    • какие поды разворачивались и когда,
    • были ли проблемы с хелсчеками,
    • не заходил ли oom-киллер и т. п.
  5. При установленном metrics-server также можно посмотреть на его нагрузку в кластере:
    kubectl top nodes
    kubectl top pods -A
Оценив общее состояние кластера, перейдем к просмотру состояния всех компонентов: здесь может вскрыться очень-очень много интересного.

Оцениваем состояние компонентов k8s​

  1. Посмотрим на работу сердца нашего кластера – etcd. Для этого обратимся к логам пода (или юнита):
    kubectl logs -n kube-system etcd-cluster-m1 --follow --tail 1000
    Нас интересует:
    • не отваливаются ли реплики,
    • нет ли троттлинга,
    • время сжатия данных.
    • Здесь уже могут вскрыться признаки проблем с производительностью дисков и сети.
  2. Если компоненты k8s стоят на машинах, можно посмотреть логи юнитов:
    journalctl -u etcd -n 1000 --follow
  3. То же самое делаем и с компонентами kubernetes. Cмотрим:
    • логи kube-apiserver,
    • kube-scheduler,
    • kube-controller-manager.
    • Не забываем заглянуть и в логи kubelet на самих воркерах.
    Скорее всего, на этих этапах уже встретятся ошибки. Тут могут вскрыться и признаки проблем с сетью, средой запуска контейнеров, валидностью сертификатов, частой сменой лидеров шедулера и контроллера k8s и т. п. На этом этапе необходимо оценить их критичность и частоту.
    Изучение работы компонентов может занять какое-то время, но в итоге это поможет лучше понять общее состояние кластера.
  4. Не упускаем из виду и функционирование сети в самом кластере. У нас в кластерах в качестве CNI используется calico, так что покажу на его примере.
    Смотрим логи с подов calico. Обращаем внимание на частое изменение маршрутов и пересечения имен.
    kubectl logs -n kube-system calico-kube-controllers-755d84984b-qq9t2 --follow --tail 100
    kubectl logs -n kube-system calico-node-pf6sv --follow --tail 1000
    Также можно поставить утилиту calicoctl и быстренько посмотреть состояние с ее помощью. Запустить ее можно через под или исполняемый файл. Главное – обеспечить аналогичную установленной версию calicoctl.
    Устанавливаем нашу версию в кластере:
    kubectl apply -f https://docs.projectcalico.org/archive/v3.19/manifests/calicoctl.yaml
    kubectl exec -ti -n kube-system calicoctl -- calicoctl get nodes -o wide
    kubectl exec -ti -n kube-system calicoctl -- calicoctl get bgpPeer -o wide
    Или можем использовать ту же утилиту со своей машины:
    calicoctl get nodes
    calicoctl get BGPpers
    Где-нибудь здесь при желании можно измерить скорость сети между самими подами, к примеру, утилитой iperf. В том числе это касается подов, расположенных на разных машинах.

Тестирование кластера на соответствие требованиям CNCF​

Стандарт CNCF позволяет обеспечить ожидаемое поведение от кластера.

Определим, имеет ли наш кластер стандартные настройки. Для этого обратимся к утилите Sonobuoy: мы используем ее для тестирования своих сборок k8s.

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

  1. Важно: определяемся с версией, которая поддерживает релиз нашего кластера. В данном случае скачаем последнюю версию программы
    https://github.com/vmware-tanzu/sonobuoy/releases.
  2. Запустим проверку нашего кластера стандартными тестами:
    sonobuoy run
    Если хотим ожидать завершения, можно использовать ключ --wait. Проверка кластера занимает около полутора часов.
    Смотреть прогресс тестирования можно командой:
    sonobuoy status
  3. По завершении скачиваем архив с отчетом и смотрим ошибки:
    results=$(sonobuoy retrieve)
    sonobuoy results $results
    Вот один из примеров того, с чем столкнулись мы:
    [sig-api-machinery] AdmissionWebhook [Privileged:ClusterAdmin] should be able to deny attaching pod [Conformance]
    [sig-api-machinery] AdmissionWebhook [Privileged:ClusterAdmin] should deny crd creation [Conformance]
    [sig-api-machinery] CustomResourcePublishOpenAPI [Privileged:ClusterAdmin] works for CRD with validation schema [Conformance]
    [sig-api-machinery] CustomResourcePublishOpenAPI [Privileged:ClusterAdmin] works for CRD without validation schema [Conformance]
    [sig-cli] Kubectl client Guestbook application should create and stop a working application [Conformance]
    [sig-network] DNS should provide DNS for pods for Subdomain [Conformance]
    [sig-network] Ingress API should support creating Ingress API operations [Conformance]
    Следующей командой можно более подробно посмотреть на проблемы:
    sonobuoy results $results --mode detailed | jq '. | select(.status == "failed") | .details'
    Для соответствия рекомендациям нам пришлось поправить параметры запуска компонентов k8s, внести изменения в настройку ingress и API кластера.
    После устранения неисправности, чтобы не ждать прохождения полного теста, можно запустить только конкретный:
sonobuoy run --e2e-focus "Ingress API should support creating Ingress API operations" --e2e-skip "" --wait

***​

Теперь у нас на руках есть базовое представление о состоянии нашего кластера. Дальше при желании можно углубиться в работу самих компонентов, обратиться к метрикам из prometheus-operator, устроить тест etcd, балансировщика и проверить iops на сторадже. Главное – четко понимать, что вы хотите получить в итоге.

 
Сверху