Helm без хайпа. Трезвый взгляд


Helm — это менеджер пакетов для Kubernetes.


На первый взгляд, неплохо. Этот инструмент значительно упрощает процесс релиза, но порой может и хлопот доставить, ничего не попишешь!
image


Недавно Helm официально признали топовым проектом @CloudNativeFdn, он широко используется коммьюнити. Это говорит о многом, но я бы хотел коротко рассказать о неприятных моментах, связанных с этим менеджером пакетов.


В чем истинная ценность Helm?


На этот вопрос я до сих пор не могу ответить уверенно. Helm не предоставляет каких-либо особенных возможностей. Какую пользу приносит Tiller (серверная часть)?


Многие чарты Helm далеки от совершенства, и, чтобы использовать их в кластере Kubernetes, нужны дополнительные усилия. Например, у них отсутствует RBAC, ограничения ресурсов и сетевые политики. Просто взять и установить чарт Helm в двоичном виде — не думая о том, как он будет работать, — не выйдет.


Мало нахваливать Helm, приводя простейшие примеры. Вы объясните, чем он так хорош — особенно с точки зрения безопасной мультитенантной рабочей среды.


Слова — пустое. Вы мне код предъявите!
—Линус Торвальдс

Дополнительный уровень авторизации и контроля доступа


Помню, кто-то сравнивал Tiller с «огромным сервером sudo». На мой взгляд, это просто очередной уровень авторизации, который при этом требует дополнительных сертификатов TLS, но не предоставляет возможностей для контроля доступа. Почему бы не использовать API Kubernetes и существующую модель безопасности с поддержкой функций аудита и RBAC?


Перехваленный инструмент для обработки шаблонов?


Дело в том, что для обработки и статического анализа файлов шаблонов Go используется конфигурация из файла values.yaml, а затем применяется обработанный манифест Kuberentes с соответствующими метаданными, хранящимися в ConfigMap.


А можно использовать несколько простых команд:


$ # render go-template files using golang or python script
$ kubectl apply --dry-run -f .
$ kubectl apply -f .

Я заметил, что разработчики обычно использовали один файл values.yaml на среду или даже получали его из values.yaml.tmpl перед использованием.


Это не имеет смысла при работе с секретами Kubernetes, которые часто зашифровываются и имеют несколько версий в репозитории. Чтобы обойти это ограничение, потребуется использовать плагин helm-secrets или команду --set key=value. В любом случае добавляется еще один уровень сложности.


Helm как инструмент управления жизненным циклом инфраструктуры


Забудьте. Это невозможно, особенно если речь — об основных компонентах Kubernetes, таких как kube-dns, поставщик CNI, cluster autoscaler и т.д. Жизненные циклы этих компонентов различаются, и Helm в них не вписывается.


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


К сожалению, с более сложными и частыми деплоями, включающими Namespace, RBAC, NetworkPolicy, ResourceQuota и PodSecurityPolicy, Helm не справляется.


Понимаю, поклонникам Helm мои слова могут не понравиться, но такова реальность.


Состояние Helm


Сервер Tiller хранит информацию в файлах ConfigMap внутри Kubernetes. Ему не нужна собственная база данных.

К сожалению, размер ConfigMap не может превышать 1 МБ из-за ограничений etcd.


Надеюсь, кто-нибудь придумает способ улучшить драйвер хранилища ConfigMap, чтобы сжимать сериализованную версию до перемещения на хранение. Впрочем, так, я думаю, настоящую проблему все равно не решить.


Случайные сбои и обработка ошибок


Для меня самая большая проблема Helm — его ненадежность.


Error: UPGRADE FAILED: "foo" has no deployed releases


Это, ИМХО, одна из самых раздражающих проблем Helm.


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


Следующий запрос на включение изменений «исправляет» ошибку, добавляя флаг --force, что фактически просто маскирует проблему, выполняя команду helm delete & helm install —replace.


Впрочем, в большинстве случаев, вам придется заняться полноценной чисткой релиза.


helm delete --purge $RELEASE_NAME

Error: release foo failed: timed out waiting for the condition


Если отсутствует ServiceAccount или RBAC не разрешает создание определенного ресурса, Helm вернет следующее сообщение об ошибке:


Error: release foo failed: timed out waiting for the condition

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


kubectl -n foo get events --sort-by='{.lastTimestamp}'

Error creating: pods "foo-5467744958" is forbidden: error looking up service account foo/foo: serviceaccount "foo" not found

Фейлы на ровном месте


В самых запущенных случаях Helm выдает ошибку, вообще не совершая каких-либо действий. Например, иногда он не обновляет ограничения ресурсов.


helm init запускает tiller с одной копией, а не в конфигурации HA


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


Однажды это приведет к даунтайму...


Helm 3? Операторы? Будущее?


В следующей версии Helm будут добавлены некоторые многообещающие функции:


  • односервисная архитектура без разделения на клиент и сервер. Больше никакого Tiller;
  • встроенный движок Lua для написания скриптов;
  • рабочий процесс DevOps на основе запросов на включение и новый проект Helm Controller.

Для получения дополнительной информации см. Предложения по проекту Helm 3.


Мне очень нравится идея архитектуры без Tiller, а вот скрипты на базе Lua вызывают сомнения, поскольку могут усложнить чарты.


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


Очень надеюсь, что коммьюнити в скором времени разберется с проблемами Helm (с нашей помощью, конечно), но сам я пока постараюсь как можно меньше использовать этот инструмент.


Поймите правильно: эта статья — мое личное мнение, к которому я пришел, создавая гибридную облачную платформу для развертываний на базе Kubernetes.

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


  1. gecube
    09.11.2018 22:00
    +1

    Очередной хороший разбор helm. Спасибо. Попахивает К.О., ну, да ладно.

    А вообще — очень ждем helm v3, который должен уже быть «тортом»

    Еще очень хочется увидеть альтернативы. Хоть ansible'ом организуй жизненный цикл сервисов в кубе.


    1. farcaller
      10.11.2018 00:57

      Хоть ansible'ом организуй жизненный цикл сервисов в кубе.

      Вы не поверите :-)


      Я вот смотрю на ansible+kasane как на движок для выкатки нетривиальных приложений где надо сделать несколько шагов.


      ---
      - kubefetch: namespace=kube-system kind=secret name=stash-apiserver-cert
      - kubefetch: namespace=kube-public kind=configmap name=cluster-info
      
      - when: not k8s_kube_system_secret_stash_apiserver_cert.exists
        block:
        - pkiv2:
            kind: ca
            common_name: Stash CA
          register: stash_ca
          no_log: true
      
        - pkiv2:
            kind: leaf
            common_name: stash-operator.kube-system.svc
            usage: serverAuth
            ca_key: "{{stash_ca.key}}"
            ca_cert: "{{stash_ca.cert}}"
          register: stash_server_cert
          no_log: true
      
      - kasanev2:
          path: '{{playbook_dir}}/kapps/{{KUBEAPP}}'
          env:
            STASH_NAMESPACE: kube-system
            STASH_SERVICE_ACCOUNT: stash-operator
            STASH_DOCKER_REGISTRY: appscode
            STASH_IMAGE_PULL_SECRET: ''
            STASH_IMAGE_TAG: {{STASH_VERSION}}
            STASH_IMAGE_PULL_POLICY: IfNotPresent
            STASH_ENABLE_ANALYTICS: 'false'
            STASH_ENABLE_RBAC: 'true'


      1. gecube
        10.11.2018 10:50

        на самом деле, когда я говорил про ansible, я не шутил.
        И более того — у меня есть ощущение, что RedHat его и будет рекомендовать для обеспечения lifecycle приложения в их платформе OpenShift.

        Но вообще, конечно, у меня душа больше к salt лежит, если говорить про CM/оркестрацию.


    1. kvaps
      10.11.2018 03:54

      Ksonnet — отличная альтернатива. Он и helm-чарты умеет и tiller ему не нужен.


  1. vpiskunov
    10.11.2018 17:26

    Когда только начинаешь k8s и натыкаешься на helm — он очень подкупает. И шаблонизация тебе, и релизы, и хуки/роллбэки. Но потом эйфория сталкивается с повседневными задачами и да, начинается описанная Вами боль. Но, приходится признать, для дистрибьюции чартов как продукт, или как первый тулсет, на котором пробовать k8s — он хорош.


    1. gecube
      11.11.2018 00:01

      ну, т.е. это по сути аналог docker-compose — быстро что-то попробовать, оценить пригодность к эксплуатации, а потом уже серьезно внедрять с lifecycle management


  1. celebrate
    10.11.2018 19:57

    Helm идеально подходит для установки чего-то полезного из charts/stable. Мы у себя его также используем для первоначального деплоя наших приложений в новый проект. Как тулза для lifecycle management он, конечно, не подходит…


  1. gree-gorey
    11.11.2018 19:33

    В конце концов хелм хорош как шаблонизатор + репозиторий (полу)готовых чартов.
    Все остальное решается helm template . | kubectl apply -f - и CI/CD.


    1. gecube
      11.11.2018 19:54

      шаблонизатор можно взять любой другой. jinja2, gomplate… Есть еще kustomize ( kubernetes.io/blog/2018/05/29/introducing-kustomize-template-free-configuration-customization-for-kubernetes ), который в ТЕОРИИ можно использовать для темплейтинга любых yaml…
      Сравнение kapitan vs helm vs kustomize можно посмотреть здесь: medium.com/@splisson/helm-vs-kapitan-vs-kustomize-1c14018faecc


      1. gree-gorey
        11.11.2018 20:00

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


        1. gecube
          11.11.2018 20:11

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