Простые истины

Итак, вы хотите освоить Kubernetes. Это такой технологический хайп, о котором, кажется, говорят все. Я затрудняюсь сказать, сколько рекрутеров обращались ко мне с предложением поработать с Kubernetes. Kubernetes — это определенно круто!

Вполне возможно, к вам относится одно из следующих утверждений:

  • Вы слышали о Kubernetes и, наконец, решили, что настало время посмотреть, к чему вся эта шумиха.

  • Вы опытный инженер-программист, который уже некоторое время работает с Kubernetes в режиме обучения "just-in-time". То есть, вы изучаете только то, что вам нужно для выполнения работы. Теперь же вам становится все труднее, и вы решили, что настало время углубиться в некоторые основы. 

  • Вы — технический лидер, и у вас есть команда, работающая с Kubernetes (или, возможно, она взаимодействует с командой, работающей с Kubernetes), и вы хотели бы повысить свою компетентность.

Что бы ни привело вас сюда, добро пожаловать! Я рад, что вы здесь!

Моя цель состоит в том, чтобы сделать все просто и предоставить основные базовые материалы для изучения и понимания Kubernetes. Kubernetes может показаться большим и пугающим. Давайте посмотрим правде в глаза... любая новая технология внушает страх. Так много всего нужно изучить. Так много нюансов. Особенно когда вы начинаете с нуля. 

Моя цель — показать вам, что Kubernetes не так уж и страшен, и вдохновить вас на дальнейшее совершенствование своих знаний. (ознакомьтесь с одним из моих расширенных постов) Если вы уже давно занимаетесь Kubernetes, пусть это освежит ваши знания! Возможно, вы делали все определенным образом, принимая как должное, что "так оно и работает". А сейчас, возможно, вы лучше поймете, почему это работает именно так.

Давайте начнем!

Обзор

В этом посте я расскажу о следующих темах:

  1. Что такое Kubernetes?

  2. Высокоуровневый взгляд: Архитектура Kubernetes;

  3. Копаем глубже: Ресурсы, контроллеры и операторы;

  4. Инструмент командной строки kubectl для взаимодействия с Kubernetes.

Примечание: Я предполагаю, что у вас уже есть базовые знания о контейнерах.

1. Что такое Kubernetes?

Прежде всего... что такое Kubernetes? Kubernetes - это система оркестрации контейнеров, которая позволяет развертывать, масштабировать и управлять контейнерными приложениями. В сокращенном виде она также именуется k8s. 

Забавный факт: Kubernetes уходит своими корнями в проект Borg, который изначально разрабатывался компанией Google.

Теперь вам, возможно, интересно, что такое оркестровка контейнеров. Давайте рассмотрим пример.

Допустим, у вас на компьютере запущена куча контейнеров Docker. Возможно, некоторым из них нужно общаться друг с другом. А может быть, ваша подруга Нэнси пытается получить доступ к конечной точке API, запущенной на одном из этих контейнеров. Как обеспечить, чтобы контейнеры могли общаться друг с другом? Как вы можете гарантировать, что Нэнси сможет безопасно получить доступ к конечной точке API? Что произойдет, если один из ваших контейнеров умирает? Что будет, если вам понадобится масштабировать контейнеры, потому что внезапно доступ к конечной точке API понадобится не только Нэнси... это будет Нэнси и все ее друзья-разработчики, участвующие в хакатоне. Что тогда?

Вот тут-то и приходит на помощь оркестровка контейнеров. Она может помочь вам со всем этим и даже больше. Под оркестровкой контейнеров понимается возможность определения, развертывания и эксплуатации вычислительного кластера, состоящего из нескольких виртуальных машин или физических серверов, для запуска контейнеров и управления их жизненным циклом.

Заклятые друзья Kubernetes

Несмотря на то, что Kubernetes очень крут и популярен, вы можете быть шокированы, узнав, что это не единственный контейнерный оркестратор! Поэтому будет справедливо упомянуть несколько конкурентов Kubernetes:

Дистрибутивы Kubernetes

Некоторые из вариантов решений для Kubernetes!
Некоторые из вариантов решений для Kubernetes!

Стоит упомянуть, что существует несколько различных способов запуска Kubernetes.

Локальный

Во-первых, вы можете запустить Kubernetes локально на своей машине. Вот несколько инструментов, которые делают это возможным:

  • KIND (означает Kubernetes in (в) Docker)

  • Docker Desktop (он поставляется вместе с Kubernetes, и вы можете запустить его локально)

  • Minikube

Решения облачных вендоров

Запуск k8s локально - это хорошо для разработки приложений и локального тестирования, но в конечном итоге нам нужно, чтобы эта штука работала в проде и масштабно. Вот здесь нам и пригодится тот факт, что большинство крупных поставщиков облачных решений имеют свои собственные варианты k8s. К ним относятся:

У каждого из вендоров облака обычно есть небольшой набор команд CLI для автоматического создания кластера k8s. Это совершенно волшебное ощущение - дать команду CLI, которая создает целый кластер за 5-10 минут. Мы говорим не только о запуске виртуальных машин по требованию, но и о запуске всех служб, которые обеспечивают работу k8s. Если задуматься, это впечатляет!

Они также предоставляют вам некоторые базовые графические интерфейсы k8s, хотя ничего сверхъестественного.

Решения для предприятий

Для людей с корпоративным мышлением, которые любят красивые графические интерфейсы администратора и любят, чтобы их водили за руку (без осуждения - на самом деле существует огромный рынок для такого рода вещей), вы можете обратить внимание на некоторых из этих поставщиков:

Эти поставщики, как правило, добавляют слой управления поверх Kubernetes, ориентируясь на корпоративную аудиторию. Как я уже упоминал ранее, они имеют причудливые консоли администратора. Они также имеют тонну плагинов, доступных через их соответствующие "маркетплейсы", и могут иметь свои собственные реализации k8s (например, выбор сервисной сети). Эти вендоры также предоставляют вам возможность запускать кластеры k8s в общедоступных облаках или в частных облаках с собственным хостингом.

Сделай сам

И, наконец, вы всегда можете создать свои собственные кластеры k8s с нуля. Если вы действительно хотите понять, как работает Kubernetes, то этот способ вам точно подойдет!

2. Компоненты Kubernetes

Теперь, когда мы немного ознакомились с Kubernetes, давайте заглянем под капот.

Главный и рабочий (minion) узлы Kubernetes
Главный и рабочий (minion) узлы Kubernetes

Кластер Kubernetes состоит из узлов. Эти узлы могут быть как физическими, так и виртуальными машинами. Вы можете иметь кластер из одного или нескольких узлов, хотя в идеале вам нужно как минимум два узла в сценарии, не используемом для разработки.

Кластер обычно состоит из главного узла (мастер) и множества рабочих (воркер) узлов (minion).

Примечание: Вот почему вам нужно как минимум два узла - потому что неправильно иметь кластер, в котором один узел одновременно выполняет функции мастера и воркера.

Мастер осуществляет наблюдение за воркерами и организует выполнение оркестровки (вспомните, что делает менеджер). Воркеры отвечают за запуск контейнеров.

На приведенной ниже схеме показано, что происходит внутри мастера и воркера:

Компоненты Kubernetes. Изображение с сайта kubernetes.io
Компоненты Kubernetes. Изображение с сайта kubernetes.io

Главный узел

Как управляющий всей этой операцией, мастер имеет довольно много компонентов:

  • etcd;

  • Сервер API;

  • Менеджер контроллеров;

  • Планировщик.

Давайте разберемся в них.

etcd

etcd — это распределенная база данных ключ-значение. Она является источником достоверных данных для Kubernetes. Каждый раз, когда вы вносите изменения в Kubernetes — например, отправляя YAML или JSON через REST API k8s или с помощью инструмента kubectl CLI (подробнее об этом позже) — эти изменения сохраняются в etcd в виде JSON. Он также версионируется, таким образом, обеспечивается серьезный контроль версий.

Одной из ключевых особенностей etcd является ее способность следить за изменениями. То есть, она сверяет текущие настройки системы с любыми входящими изменениями, отправленными в Kubernetes через REST API вызов или kubectl.

Предупреждение для зануд: я лично считаю, что etcd — один из самых крутых компонентов Kubernetes. Вы можете установить etcd на свою локальную машину (например, OSX или Ubuntu) и поиграть с ним, используя инструмент etcdctl CLI. В Python даже есть несколько библиотек для программного взаимодействия с etcd. Я лично играл с библиотекой Python etcd3, и рекомендую изучить etcd самостоятельно!

Сервер API

Сервер API отвечает за обслуживание API Kubernetes. Хотите поговорить с Kubernetes и попросить его сделать что-то для вас? Это ваша прямая линия - будь вы пользователь, программа или kubectl. Сервер API также отвечает за отправку и получение данных в/из etcd.

Менеджер контроллеров

Менеджер контроллеров — это мозг, который стоит за оркестрацией. Kubernetes имеет несколько контроллеров, каждый из которых отвечает за разные вещи. Они следят за состоянием вашего кластера, затем вносят или запрашивают изменения, когда это необходимо. Менеджер контроллеров следит за тем, чтобы он указывал нужным контроллерам на выполнение необходимых действий. Например, существуют контроллеры для:

  • Принятие мер при выходе из строя пода;

  • Подключение служб к подам;

  • Создание учетных записей и доступ к API-токенам.

И многие другие...

Примечание: Если вам интересно, что такое под, то это, по сути, обертка вокруг одного или нескольких контейнеров.

Планировщик

Планировщик распределяет работу между несколькими узлами. Он смотрит на требования к ресурсам (например, к процессору и памяти), чтобы определить, когда и на каком узле запускать под.

Рабочие узлы

Очевидно, что мастер делает многое, но, как и менеджер, он ничто без рабочих узлов (воркеров). Воркеры содержат 2 основных компонента:

  • Kubelet;

  • Kube-proxy.

Kubelet

Kubelet — это агент (небольшое приложение), который запускается на каждом рабочем узле в кластере. Его основная задача — следить за тем, чтобы контейнеры запускались в поде (обертке из одного или нескольких контейнеров). Но кто указывает ему запустить эти контейнеры? Это происходит из control plane (управляющего уровня) (где находится наш хороший друг — менеджер контроллеров). Когда уровень управления требует, чтобы что-то произошло в узле, kubelet делает это.

Kubelet запускает рантайм контейнера и, как следует из названия, отвечает за фактический его запуск. Точнее, он управляет полным жизненным циклом контейнера: получение образа контейнера (из реестра контейнеров, такого как Docker Hub) и его хранение, выполнение контейнера, подключение к сети и т. д. — популярная среда выполнения контейнеров; однако существуют и другие, такие как containerd, CRI-O.

Примечание: В настоящее время Kubernetes использует контейнерный рантайм Docker; однако в ближайшем будущем он откажется от Docker в пользу Container Runtime Interface (CRI), созданный для Kubernetes. Образы, созданные Docker, будут продолжать работать в вашем кластере со всеми режимами выполнения, как и раньше, поэтому не стоит паниковать!

Kube-proxy

Kube-proxy обрабатывает сетевые соединения внутри и за пределами вашего кластера. Это означает, что если подам нужно общаться между собой или если какому-то внешнему сервису нужно обратиться к подам, kube-proxy поможет это сделать.

3. Ресурсы, контроллеры и операторы

Теперь, когда мы познакомились с основами компонентов Kubernetes, давайте рассмотрим некоторые другие ключевые понятия и терминологию Kubernetes.

Ресурсы

Ресурс Kubernetes — это объект или операция в Kubernetes, доступ к которым осуществляется через Kubernetes API. Тип ресурса известен как kind (вид) и представлен в виде объекта JSON. Этот JSON-объект хранится (и версионируется) в хранилище etcd.

Существует две категории ресурсов: примитивные и пользовательские. Примитивные ресурсы поставляются "из коробки" с Kubernetes. К ним относятся Pod, Service, Deployment, ServiceAccount, PersistentVolumeClaim, RoleBinding... Я могу продолжить.

apiVersion: v1
kind: ServiceAccount
metadata:
  name: pipeline-sa
secrets:
  - name: basic-docker-user-pass
  - name: basic-git-app-repo-user-pass

Образец примитивного ресурса в Kubernetes

Пользовательские ресурсы являются расширением API Kubernetes и поэтому не всегда доступны в стандартной установке Kubernetes. После инсталляции вы можете использовать инструмент kubectl CLI для создания и доступа к этим ресурсам (подробнее о kubectl позже). Пользовательские ресурсы создаются, когда вы хотите/необходимо, чтобы Kubernetes делал некоторые вещи, которые вы не можете получить из коробки с k8s.

Вот пример того, как выглядит пользовательский ресурс:

apiVersion: tekton.dev/v1alpha1
kind: PipelineRun
metadata:
  generateName: my-pipeline-run-
spec:
  serviceAccountName: pipeline-sa
  pipelineRef:
    name: my-pipeline
  resources:
  - name: git-app-repo
    resourceRef:
      name: git-app-repo
  - name: image-registry
    resourceRef:
      name: image-registry

Образец пользовательского ресурса в Kubernetes

Заметьте, что в большинстве случаев примитивный и пользовательский ресурс имеют одинаковые основные поля:

  • apiVersion: Версия API Kubernetes, который вы используете для создания ресурса;

  • kind: Тип создаваемого ресурса;

  • metadata: Данные, которые однозначно идентифицируют ресурс;

  • spec: Сообщает Kubernetes желаемое состояние ресурса.

Примечание: Не все ресурсы имеют поле spec (например, ServiceAccount, Role, RoleBinding).

Контроллеры

Как говорилось ранее, контроллер следит за состоянием вашего кластера, затем вносит или запрашивает изменения, где это необходимо, для достижения желаемого состояния. Что именно это значит?

Позвольте мне привести занятный пример. Предположим, вы спасатель в бассейне. Ваша работа заключается в том, чтобы обеспечить безопасность всех людей в бассейне. Для этого вы должны постоянно проверять, чтобы никто из пловцов не попал в беду. Это и есть желаемое состояние. Поэтому, если вы видите, что кто-то тонет, то вы идете и вытаскиваете его из воды, а также выполняете любые другие необходимые спасательные операции, чтобы убедиться, что он больше не находится в бедственном положении.

Операторы

Оператор - это разновидность контроллера. Помните те пользовательские ресурсы, о которых я говорил ранее? Определить пользовательский ресурс - это хорошо, но в конце концов, как заставить Kubernetes сделать с ним что-то полезное? Вот тут-то и приходят на помощь операторы - это закулисный код, который заставляет эти пользовательские ресурсы делать полезные вещи.

В то время как все операторы являются контроллерами, не все контроллеры - операторы. Это может сбить с толку, потому что на первый взгляд кажется, это практически одно и то же. Основное различие заключается в том, что операторы расширяют функциональность Kubernetes и работают вместе с пользовательскими ресурсами, чтобы это произошло.

Интересный факт: операторы могут быть написаны на любом языке, и существуют несколько фреймворков, которые предоставляют шаблонный (boilerplate) код, чтобы помочь вам написать свой собственный оператор.

Создавать операторы может кто угодно: вы, ваша организация или сторонний вендор. Например, RedHat OpenShift имеет свой собственный набор операторов (вместе с сопутствующими пользовательскими ресурсами), которые являются частью его основного продукта, который он запускает поверх обычного Kubernetes. И благодаря замечательному сообществу разработчиков открытого кода многие из операторов доступны для совместного использования. Вы можете ознакомиться с некоторыми из них на сайте OperatorHub.io.

4. kubectl

Вы слышали, как я много говорил о kubectl в этом посте, и теперь мы, наконец, увидим, из-за чего вся эта шумиха! kubectl - это интерфейс командной строки (CLI) для управления операциями на кластерах Kubernetes. Он взаимодействует с API-сервером, чтобы получить информацию о нашем кластере и указать Kubernetes сделать что-нибудь для нас, например, создать новый ресурс или изменить существующий. Как я уже говорил, если вы расширяете Kubernetes API с помощью чудесной комбинации операторов и пользовательских определений ресурсов (CRD), вы можете использовать kubectl для доступа/обновления этих ресурсов!

Поскольку это инструмент командной строки, kubectl запускается на вашей локальной машине. Он работает совместно с файлом kubeconfig, который представляет собой YAML-файл, по умолчанию установленный в $HOME/.kube/config. Вот как может выглядеть пример файла kubeconfig:

Скриншот примера файла kubeconfig
Скриншот примера файла kubeconfig

Записи в файле kubeconfig автоматически создаются при подключении к существующему кластеру Kubernetes.

Например, если бы я хотел подключиться к кластеру Azure Kubernetes, я бы использовал Azure's az CLI для выполнения следующей команды:

az aks get-credentials --resource-group my-resource-group --name my-aks-cluster

Который заполнит мой файл kubeconfig для меня. 

Аналогично, я могу использовать gcloud CLI Google Cloud для подключения к кластеру Google Kubernetes следующим образом:

gcloud container clusters get-credentials my-gke-cluster --region=us-central1-a

Дело в том, что у каждого облачного провайдера есть свой собственный облачный CLI и набор команд для подключения к кластеру Kubernetes в этом облаке и соответствующего обновления файла kubeconfig.

После регистрации кластера в файле kubeconfig вы можете запускать различные команды для работы с ним. Вы также можете использовать kubectl для получения информации о кластерах, которые у вас зарегистрированы, и для обновления конфигурации отдельных кластеров.

Примечание: Вы можете зарегистрировать несколько кластеров Kubernetes из разных облаков в одном файле kubeconfig. Также вы можете иметь несколько файлов kubeconfig, если вам так больше нравится.

Заключение

Уф-ф! Было очень много интересного! Это ни в коем случае не было техническим углублением в Kubernetes. Скорее, моя цель была познакомить вас с основными концепциями, дать вам представление о том, как работает Kubernetes, и, надеюсь, вдохновить вас на более глубокое изучение этой популярной технологии, о которой, кажется, говорят все.

Вы сможете обмолвится о нескольких забавных фактах про Kubernetes своим друзьям и близким во время следующего звонка в Zoom, а также рассказать им такие вещи, как: 

  • Что такое Kubernetes и зачем он вам нужен;

  • Разница между главным и рабочим узлами, а также все преимущества каждого из них;

  • Что такое ресурсы;

  • Разница между контроллерами и операторами;

  • Что делает kubectl.


Перевод материала подготовлен для будущих студентов курса «DevOps практики и инструменты».

Инфраструктура как код (IaC), Immutable Infrastructure и другие страшные слова из книжек про DevOps у всех на слуху, а в родной компании всё еще по заявкам создаем виртуалки накликивая их в гипервизоре. Всех желающих приглашаем на открытый урок «Принципы организации инфраструктурного кода и работа над инфраструктурой в команде на примере Terraform», на котором поговорим о том, зачем и как начать использовать практику Infrastructure as a Code.

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


  1. DeepFakescovery
    07.02.2022 19:09
    +5

    а как скрыть посты из ленты с тэгом Блог компании OTUS ?



  1. gecube
    07.02.2022 19:12
    +2

    Примечание: Вот почему вам нужно как минимум два узла - потому что неправильно иметь кластер, в котором один узел одновременно выполняет функции мастера и воркера.

    очень спорно. Если очень хочется, то можно и так.

    @DeepFakescovery+1


    1. Renatk
      07.02.2022 22:56
      +2

      Согласен, что очень спорная фраза про два узла: например Red Hat CodeReady Containers это будет прямо у вас компьютере/ноутбуке кластер openshift без дополнительных worker. Главное, чтобы ресурсов хватало.


      1. gecube
        08.02.2022 09:53

        Red Hat CodeReady Containers это будет прямо у вас компьютере/ноутбуке кластер openshift без дополнительных worker.

        да, крутая штука, если хочется поиграться с опеншифтом, а поднимать отдельную инфраструктуру не хочется.


    1. Xop
      08.02.2022 09:38

      А вообще если нужно high availability (ради которого часто и затевают пляски с кубером), то нод наоборот должно быть хотя бы 3 - один мастер и два воркера.


      1. gecube
        08.02.2022 09:46

        А вообще если нужно high availability (ради которого часто и затевают пляски с кубером), то нод наоборот должно быть хотя бы 3 - один мастер и два воркера.

        и мы только что получили не отказоустойчивый контрол плейн кубернетеса. Тогда уж минимальная HA конфа - 3 мастера + 2 воркера (ну, или просто 3 мастера, они же - 3 воркера, если не разделять узлы по ролям).


        1. Xop
          08.02.2022 10:28

          Рабочая нагрузка обычно вполне может пережить кратковременную потерю контрол плейна, поэтому одна нода (если мы уж экономим) вполне допустима. При наличии бэкапов )


          1. gecube
            08.02.2022 10:48
            +1

            Искренне убеждён - бекапы как раз не нужны. Зачастую проще переналить кластер и нагрузку, при помощи плейбуков/терраформа и манифестов в гите, чем разбираться, что там внутри сломалось. Если же мы были достаточно упорные и смелые, чтобы засунуть в кубернетес стейтфул - тут, да, без бекапов уже никак.

            Касательно "мастер отъехал - приклад работает"... знаете, с одной стороны Вы правы. Приложению внутри контейнера обычно до лампочки, что там в кубере происходит. Но в реальной жизни при отказе мастера штормит будь здоров. Ну, такой пример приведу. Нам же приложение нужно не абстрактно в вакууме? Нам нужно туда трафик доставлять как-то снаружи. Пускай это будет ингресс. А ингресс контроллер постоянно перечитывает свою конфигурацию из апи сервера. А он у нас лёг. А если вообще ингресс сложится - он не перезапустится, потому что мастера-то у нас отъехали. Вот и получается - если делать хорошо, то контролплейн тоже резервировать надо...


            1. Renatk
              08.02.2022 17:06

              Трафик должен приходить на keepalived. Тогда не страшно будет выпадение мастер ноды из кластера.


              1. gecube
                08.02.2022 17:30
                +1

                никто так не делает, а keepalived должен сдохнуть ) по разным причинам, но это не лучшее решение для фейловера.


            1. Xop
              08.02.2022 20:00

              Эмм, а разве ингресс при отсутствии коннекта до апи сервера не будет держать последнюю полученную конфигурацию? Или теоретически должен, но на практике такие edge-кейсы часто игнорируются? Ну и складывание ингресса в течение maintaince window на мастере выглядит маловероятным, но у вас тут явно побольше опыта, так что готов поверить на слово. Но в целом мне тут кажется - если делать хорошо, но инфра совсем маленькая, то лучше без кубера, либо брать managed решение у провайдеров, которые нормальный контрол плейн бесплатно дают (тот же digital ocean).

              Насчет бэкапов согласен - в общем то хранение полного набора манифестов в репе я тоже как некоторый бэкап рассматриваю.


              1. gecube
                08.02.2022 20:08
                +1

                Но в целом мне тут кажется - если делать хорошо, но инфра совсем маленькая, то лучше без кубера, либо брать managed решение у провайдеров, которые нормальный контрол плейн бесплатно дают (тот же digital ocean).

                к сожалению, "нормальный контрол плейн" - это не про Digital Ocean. Пруфы:

                кто бы мог подумать - control plane у них был НЕ ОТКАЗОУСТОЙЧИВЫЙ, ЛОЛ. И либо плати еще денег, либо заказывай узлы на "про" плане.

                И постоянно таймауты вида:

                $ flux get all -A
                NAMESPACE  	NAME                     	READY	MESSAGE                                                        	REVISION                                     	SUSPENDED 
                flux-system	gitrepository/flux-system	True 	Fetched revision: main/2a29c4b82541d89e9fe1f42832d7ac6b04458e8b	main/2a29c4b82541d89e9fe1f42832d7ac6b04458e8b	False    	
                
                NAMESPACE  	NAME                         	READY	MESSAGE                                                   	REVISION                                	SUSPENDED 
                flux-system	helmrepository/hashicorp     	True 	Fetched revision: 77a05bde477ba03cd06c17ed2e528707c0880ee2	77a05bde477ba03cd06c17ed2e528707c0880ee2	False    	
                flux-system	helmrepository/ingress-nginx 	True 	Fetched revision: 0adf7e010498f3849f214cf3ff8aef347be087d5	0adf7e010498f3849f214cf3ff8aef347be087d5	False    	
                flux-system	helmrepository/istio         	True 	Fetched revision: b6cf9b2d57f0d3317cf080055cf79aa427175a49	b6cf9b2d57f0d3317cf080055cf79aa427175a49	False    	
                flux-system	helmrepository/jetstack      	True 	Fetched revision: f35ae09270eee331991e2257317cc58ebded3597	f35ae09270eee331991e2257317cc58ebded3597	False    	
                flux-system	helmrepository/metrics-server	True 	Fetched revision: 9592e73435d317885082719af55387c63f959690	9592e73435d317885082719af55387c63f959690	False    	
                flux-system	helmrepository/minio         	True 	Fetched revision: baf796a7aaa7a5f6cc1783cf851a4e0fab059293	baf796a7aaa7a5f6cc1783cf851a4e0fab059293	False    	
                flux-system	helmrepository/scylla        	True 	Fetched revision: e25e22a1e6de6e2f85b2c7c1e5d76ce524d3436c	e25e22a1e6de6e2f85b2c7c1e5d76ce524d3436c	False    	
                
                NAMESPACE  	NAME                                 	READY	MESSAGE                 	REVISION	SUSPENDED 
                flux-system	helmchart/flux-system-cert-manager   	True 	Fetched revision: v1.7.1	v1.7.1  	False    	
                flux-system	helmchart/flux-system-ingress-nginx  	True 	Fetched revision: 4.0.16	4.0.16  	False    	
                flux-system	helmchart/flux-system-metrics-server 	True 	Fetched revision: 3.7.0 	3.7.0   	False    	
                flux-system	helmchart/flux-system-minio-operator 	True 	Fetched revision: 4.3.7 	4.3.7   	False    	
                flux-system	helmchart/flux-system-scylla         	True 	Fetched revision: v1.7.1	v1.7.1  	False    	
                flux-system	helmchart/flux-system-scylla-manager 	True 	Fetched revision: v1.7.1	v1.7.1  	False    	
                flux-system	helmchart/flux-system-scylla-operator	True 	Fetched revision: v1.7.1	v1.7.1  	False    	
                flux-system	helmchart/flux-system-vault          	True 	Fetched revision: 0.19.0	0.19.0  	False    	
                
                I0205 10:04:10.678744   85888 request.go:665] Waited for 1.016862346s due to client-side throttling, not priority and fairness, request: GET:https://4cd588f6-0e4d-45bb-a5c5-473057f3dd25.k8s.ondigitalocean.com/apis/notification.toolkit.fluxcd.io/v1beta1?timeout=32s
                NAMESPACE  	NAME                       	READY	MESSAGE                         	REVISION	SUSPENDED 
                flux-system	helmrelease/cert-manager   	True 	Release reconciliation succeeded	v1.7.1  	False    	
                flux-system	helmrelease/ingress-nginx  	True 	Release reconciliation succeeded	4.0.16  	False    	
                flux-system	helmrelease/metrics-server 	True 	Release reconciliation succeeded	3.7.0   	False    	
                flux-system	helmrelease/minio-operator 	False	upgrade retries exhausted       	4.3.6   	False    	
                flux-system	helmrelease/scylla         	True 	Release reconciliation succeeded	v1.7.1  	False    	
                flux-system	helmrelease/scylla-manager 	False	upgrade retries exhausted       	v1.7.0  	False    	
                flux-system	helmrelease/scylla-operator	True 	Release reconciliation succeeded	v1.7.1  	False    	
                flux-system	helmrelease/vault          	True 	Release reconciliation succeeded	0.19.0  	False    	
                
                NAMESPACE  	NAME                          	READY  	MESSAGE                                                        	REVISION                                     	SUSPENDED 
                flux-system	kustomization/flux-system     	Unknown	reconciliation in progress                                     	main/2a29c4b82541d89e9fe1f42832d7ac6b04458e8b	False    	
                flux-system	kustomization/knative-operator	True   	Applied revision: main/63331701bab830e41c44994308ddc01aa6dee5aa	main/63331701bab830e41c44994308ddc01aa6dee5aa	False    	
                

                мда... менеджед такой менеджед... после этого реально подумаешь - не накатить ли https://habr.com/ru/company/flant/blog/569840/

                 разве ингресс при отсутствии коннекта до апи сервера не будет держать последнюю полученную конфигурацию? Или теоретически должен, но на практике такие edge-кейсы часто игнорируются?

                должен, но если он рестартанулся по любой причине - упс, кранты.


                1. Xop
                  08.02.2022 20:10

                  Вот это да. Спасибо, что предупредили