В этой статье мы рассмотрим самые важные обновления платформы Deckhouse версий 1.45–1.47 — всё то, что появилось за последние три месяца.

Deckhouse 1.45: поддержка K8s 1.26 и модуль loki

Версия Deckhouse 1.45 на канале обновлений Stable появилась 17 мая этого года. Из ключевых изменений можно выделить прекращение поддержки Kubernetes 1.21 и добавление поддержки Kubernetes 1.26, появление нового модуля хранилища логов и включение поддержки ALT Linux. Рассмотрим их подробнее.

  • В платформе появился новый модуль loki. Он позволяет развернуть хранилище логов на базе Grafana Loki и настроить Deckhouse на работу с ним.

  • Прекращена поддержка Kubernetes 1.21 и добавлена поддержка Kubernetes 1.26.

  • В Enterprise Edition добавлена поддержка ALT Linux (p10, 10.1).

  • Улучшен механизм обновления Nginx Ingress-контроллера с помощью использования AdvancedDaemonSet из состава OpenKruise. OpenKruise — это расширенный набор компонентов Kubernetes, который специализируется на автоматизации обновления, развертывания и других операций в кластере. Использование его компонентов позволяет получить больший контроль над обновлением подов, чем при использовании DaemonSet.

  • Добавлен NGINX Ingress Controller версии 1.6, а nginx в нем обновлен до версии 1.21.6. Кроме того, изменились наименования метрик Prometheus, а для повышения безопасности исключены директивы nginx root и alias. Подробности — в нашем GitHub и в changelog'е контроллера.

  • Для повышения безопасности в компонентах Deckhouse при указании образа контейнера используется контрольная сумма, а не тег образа. Это позволяет избежать случаев подмены образа с похожим тегом и гарантирует использование только доверенных образов.

Добавлена возможность включения или отключения модуля через Deckhouse Controller. Пример: kubectl -ti -n d8-system exec deploy/deckhouse -- deckhouse-controller module disable deckhouse-web. Ранее для этого приходилось вручную создавать или редактировать Custom Resource с описанием нужного модуля.

Другие важные изменения

  • Появился удобный интерфейс для работы с модулем descheduler — custom resource Descheduler. Теперь можно гибко настраивать стратегии для разных компонентов, запускать несколько экземпляров descheduler на разных группах узлов. Текущая конфигурация будет сконвертирована автоматически. Этот модуль каждые 15 минут вытесняет поды, которые удовлетворяют включенным в CR Descheduler стратегиям, что приводит к принудительному запуску процесса планирования в отношении вытесненных подов.

  • В модуле log-shipper появилась возможность использовать буфер, rate limit, а также произвольный regex-шаблон для парсинга многострочных логов (параметр spec.multilineParser.custom в ClusterLoggingConfig и PodLoggingConfig). Этот модуль запускает агенты log-shipper на узлах кластера. Они предназначены для отправки с минимальными задержками логов дальше из кластера. Каждый агент — отдельный vector, конфигурацию для которого сгенерировал Deckhouse.

    С помощью rate limit можно настраивать ограничения потока событий, передаваемых в хранилище. Это позволяет защитить хранилище логов от перегрузки в случае непредвиденного увеличения количества отправляемых логов — так, у одного из наших пользователей в облачное хранилище по ошибке лилось очень много логов, и он получил пугающий счет от провайдера. 

    rateLimit:
    linesPerMinute: 500
  • В модуль Grafana добавлен новый дашборд для Cilium, на котором отображаются основные параметры этого сетевого инструмента: использование памяти, ошибки, количество дескрипторов открытых файлов и так далее.

Полный список изменений версии 1.45.

Deckhouse 1.46: просмотр алертов без веб-интерфейса Prometheus

Версия платформы 1.46 вышла на канале Stable 21 июня. Среди основных изменений можно выделить возможность просмотра алертов прямо в кластере, без веб-интерфейса Grafana и появление на сайте раздела «Подготовка к production», в котором описано, как подготовить кластера для реальной работы.

Если у вас есть доступ только к API-серверу кластера, а к веб-интерфейсу Grafana или Prometheus доступа нет, новая фича будет очень полезна. В этом случае просмотреть список алертов можно следующей командой:

# kubectl get clusteralerts
NAME               ALERT                                      SEVERITY   AGE     LAST RECEIVED   STATUS
086551aeee5b5b24   ExtendedMonitoringDeprecatatedAnnotation   4          3h25m   38s             firing
226d35c886464d6e   ExtendedMonitoringDeprecatatedAnnotation   4          3h25m   38s             firing
235d4efba7df6af4   D8SnapshotControllerPodIsNotReady          8          5d4h    44s             firing
27464763f0aa857c   D8PrometheusOperatorPodIsNotReady          7          5d4h    43s             firing
ab17837fffa5e440   DeadMansSwitch                             4          5d4h    41s             firing

Также можно подробно изучить каждый алерт:

kubectl get clusteralerts <ALERT_NAME> -o yaml

Эта команда выведет содержимое алерта:

alert:
  description: |
    The recommended course of action:
    1. Retrieve details of the Deployment: `kubectl -n d8-snapshot-controller describe deploy snapshot-controller`
    2. View the status of the Pod and try to figure out why it is not running: `kubectl -n d8-snapshot-controller describe pod -l app=snapshot-controller`
  labels:
    pod: snapshot-controller-75bd776d76-xhb2c
    prometheus: deckhouse
    tier: cluster
  name: D8SnapshotControllerPodIsNotReady
  severityLevel: "8"
  summary: The snapshot-controller Pod is NOT Ready.
apiVersion: deckhouse.io/v1alpha1
kind: ClusterAlert
metadata:
  creationTimestamp: "2023-05-15T14:24:08Z"
  generation: 1
  labels:
    app: prometheus
    heritage: deckhouse
  name: 235d4efba7df6af4
  resourceVersion: "36262598"
  uid: 817f83e4-d01a-4572-8659-0c0a7b6ca9e7
status:
  alertStatus: firing
  lastUpdateTime: "2023-05-15T18:10:09Z"
  startsAt: "2023-05-10T13:43:09Z"

Другие важные изменения

  • Раньше в Deckhouse были только ClusterAuthorizationRule, которые позволяли управлять RBAC на уровне всего кластера. Теперь у пользователей появилась возможность управлять правами на уровне namespace c помощью нового custom resource AuthorizationRule.

  • Домен для документации изменен с deckhouse на documentation. Модуль deckhouse-web также переименован в documentation. Он позволяет получить доступ к самой свежей документации Deckhouse прямо из кластера — по пути, указанному в шаблоне publicDomainTemplate (например, documentation.company.my).

  • В Security Grafana добавлен дашборд со сводным отчетом о соответствии кластера практикам CIS Kubernetes Benchmark и с возможностью получить детальную информацию о проблемах безопасности. CIS Kubernetes Benchmark — это стандарт от Center for Internet Security. В него входят четкие инструкции о том, как сделать кластер безопасным (вплоть до указания конкретных флагов у API-сервера), и описания правильной настройки control plane, конфигурации, worker-узлов, политик и так далее.

    Вот так выглядит дашборд полностью успешной проверки:

  • Посмотреть все узлы, не прошедшие проверку на соответствие стандарту, можно командой:

    kubectl get clustercompliancereports.aquasecurity.github.io cis -ojson |
      jq '.status.detailReport.results | map(select(.checks | map(.success) | all | not))'

    Также можно рассмотреть узлы, не прошедшие конкретную CIS compliance-проверку.

  • За счет статической сборки компонентов Kubernetes, используемых в Deckhouse, потенциально уменьшена вероятностью возникновения проблем при работе в различных дистрибутивах.

Полный список изменений версии 1.46.

Deckhouse 1.47: Istio доступен для сообщества

Дата выхода стабильного релиза 1.47 — 11 июля. В нем прекращена поддержка Debian 9 и Ubuntu 18.04.

Другие важные изменения

  • Модуль Istio стал доступен в CE-редакции. В нем реализованы:

    • механизм управления версией control-plane, включая плавное обновление с одновременным запуском нескольких версий;

    • инструмент для обеспечения observability Kiali, дашборды для Grafana и расширенный мониторинг потенциальных опасностей;

    • средства публикации приложений для внешних пользователей: упрощённый нативный ingressgateway и возможность добавить сайдкар к существующему ingress-nginx с сохранением всех преимуществ этого контроллера.

  • Добавлен новый ресурс Module. Он доступен только для чтения и позволяет посмотреть полный список доступных модулей в кластере и их статус.

    Отобразить можно список всех модулей:

    $ kubectl get modules --sort-by='{.properties.weight}'
    
    NAME                                  WEIGHT   STATE      SOURCE
    common                                0        Disabled   Embedded
    priority-class                        1        Enabled    Embedded
    deckhouse                             2        Enabled    Embedded
    deckhouse-config                      3        Enabled    Embedded
    external-module-manager               5        Enabled    Embedded
    ...
    operator-trivy                        500      Disabled   Embedded
    upmeter                               500      Disabled   Embedded
    delivery                              502      Disabled   Embedded
    namespace-configurator                600      Enabled    Embedded
    secret-copier                         600      Enabled    Embedded
    flant-integration                     600      Disabled   Embedded
    runtime-audit-engine                  650      Disabled   Embedded
    documentation                         810      Enabled    Embedded
    deckhouse-ui                          900      Enabled    External: deckhouse

    И список конкретных модулей:

    # kubectl get modules -l module.deckhouse.io/cni
    NAME                WEIGHT   STATE      SOURCE
    cni-cilium          21       Enabled    Embedded
    cni-flannel         35       Disabled   Embedded
    cni-simple-bridge   35       Disabled   Embedded

    Также можно посмотреть детальную информацию о каждом из модулей:

    # kubectl get module cloud-provider-aws -o yaml
    apiVersion: deckhouse.io/v1alpha1
    kind: Module
    metadata:
      creationTimestamp: "2023-05-02T17:12:22Z"
      generation: 2
      labels:
        module.deckhouse.io/cloud-provider: ""
      name: cloud-provider-aws
      resourceVersion: "105360675"
      uid: 65c70396-c9cc-437c-a78b-b08a653383d1
    properties:
      weight: 30
      state: Disabled
      source: Embedded
  • Добавлена возможность изменять адрес container registry в кластере с помощью deckhouse-controller. Сделать это можно с помощью следующей команды:

    kubectl exec -ti -n d8-system deploy/deckhouse -- deckhouse-controller helper change-registry \
      --user my-user --password my-password registry.example.com/deckhouse
  • В Linstor добавлена поддержка работы на узлах с включенным SELinux. Ранее при включенном SELinux в модуле linstor возникали проблемы с отсутствием необходимых прав.

  • В целях стандартизации и повышения безопасности, ряд компонентов (kube-dns, kube-proxy, ingress-nginx и других) переведен на сборку с использованием Distroless-образов (это образы, в которые включены только нужные для выполнения конкретной задачи файлы. А файлы дистрибутива, которые не используются, из контейнера убираются. Это позволяет уменьшить размер образа и снизить количество потенциальных векторов атаки. Вместо нескольких сотен или даже тысяч ненужных для работы файлов остаются только те, которые используются приложением.

  • containerd на узлах настроен на работу с параметром discard_unpacked_layers. Благодаря этому, место для хранения образов можно сократить до 35%. Параметр discard_unpacked_layers позволяет GC удалять слои из хранилища после успешной распаковки этих слоев.

Полный список изменений версии 1.47.

P.S.

Для знакомства с платформой Deckhouse рекомендуем изучить раздел «Быстрый старт» (доступен на русском и английском языках).

Полезные ссылки на ресурсы проекта:

Читайте также в нашем блоге:

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


  1. paka63694
    05.08.2023 18:33

    Когда выйдет Commander?