Обновление (развертывание + PVC) до Statefulset с помощью helm

Мы осознали ошибку использования развертывания с PVC для нашего приложения с отслеживанием состояния вместо использования Statefulset. Мне было интересно, как будет работать обновление. Как я могу указать на старые данные с новым набором состояний? Я предполагаю, что старый PVC не может использоваться volumeClaimTemplate? Я ничего не нашел через Google с моими поисковыми возможностями.

Кто-нибудь еще прошел через эту фазу? Если да, то каков был процесс, которым вы следовали?

Спасибо.

Добавляем еще несколько деталей по настройке.

  1. В настоящее время это простое развертывание без реплик. Всего 1 развертывание и 1 модуль.
  2. PV + PVC используется для монтирования постоянного тома, на который мы записываем все данные.
  3. При обновлении Helm у нас добавлен хук перед обновлением, который монтирует тот же PV + PVC в контейнер обновления и обновляет данные (изменение файлов XML и т. Д.)

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

Теперь то, что я ищу в моем следующем обновлении, - это процесс, в котором я могу выполнить описанное выше развертывание как набор с отслеживанием состояния, а также все данные, которые все еще будут использоваться модулем Pod.


person Arunmu    schedule 13.11.2020    source источник
comment
да, старый PVC нельзя использовать для StatefulSet. В моей корпорации мы удалили развертывание и создали набор состояний и pv / pvc для volumeClaimTemplate.   -  person leo    schedule 13.11.2020
comment
@leo Спасибо. Значит, вы хотите сказать, что добавили заявкуRef к PV, чтобы указать на новый pvc с набором состояний? Было бы неплохо, если бы вы могли подробнее рассказать о восстановлении в качестве ответа.   -  person Arunmu    schedule 13.11.2020
comment
Не могли бы вы поделиться немного более подробной информацией о вашем развертывании pv (несколько примеров конфигурации были бы отличными). Должен ли он быть общим для всех модулей в statefulset или каждый модуль должен получить копию этих данных? Есть ли какие-то исходные данные, которые следует предоставить каждому модулю для последующего использования?   -  person acid_fuji    schedule 13.11.2020
comment
@thomas Спасибо. Я добавил больше деталей. Я не добавлял никаких конфигураций, потому что из-за всех диаграмм руля было действительно сложно оставаться в фокусе. По сути, приложение так же просто, как то, что я описал. Есть только одна капсула, никаких реплик.   -  person Arunmu    schedule 13.11.2020
comment
Спасибо за информацию. Хотелось бы узнать подробнее о ваших фотоэлектрических и ПВХ. Предоставляется ли он динамически или заранее подготовлен вами / администратором? Какой тип ПВХ? Это NFS, Hostpath или какой-то облачный диск?   -  person acid_fuji    schedule 16.11.2020
comment
@thomas Использование пути к хосту   -  person Arunmu    schedule 17.11.2020


Ответы (2)


Итак, вот что я сделал. Во-первых, позвольте мне кратко рассказать о моей тестовой установке:

  1. Иметь набор запущенных развертываний, у которых есть собственный PVC + PV для устойчивости.
  2. В новом выпуске все эти развертывания преобразованы в наборы с отслеживанием состояния и, следовательно, имеют другой PVC.

Проблемы:

  1. Вы не можете использовать PV из более раннего развертывания, потому что PV привязан к одному PVC. Вы можете обратиться к PV, используя только этот PVC.

  2. Итак, еще один вопрос: почему вы не можете смонтировать старый PV, используя его PVC, на новый модуль и скопировать его? Что ж, мы не можем этого сделать, потому что к моменту запуска новых модулей старые модули освобождаются, тем самым освобождая связанные с ними PVC и PV. В моем случае я мог видеть, что PVC переходит в состояние «Завершить». Вероятно, это можно было бы решить с помощью какой-то политики Reclaim, но я не уверен в этом.

Решение:

  1. Создайте PV и его PVC вручную и примените их. Имя PVC должно совпадать с именем, которое создаст statefulset, что довольно просто. Сопоставление имени PVC для statefulset очень важно, оно ожидает, что оно будет в определенном формате, который вы можете найти в Интернете.

  2. В вашей новой диаграмме Helm создайте задание kubernetes перед обновлением. Это хук перед обновлением Helm, который запускается непосредственно перед фактическим обновлением выпуска Helm. Итак, здесь вы создаете контейнер и монтируете как старый, так и новый PV (используйте PVC, который вы создали вручную).

  3. Теперь этот контейнер должен запускать что-то, правильно копировать данные? Да, для этого я создал новую карту конфигурации и поместил в нее скрипт, который просто копирует данные из старого PV в новый PV. Эта конфигурационная карта монтируется внутри контейнера, и контейнер предназначен для выполнения этой команды.

  4. Запустите команду helm upgrade и посмотрите, как она работает.

Примерный пример работы перед обновлением K8s:

apiVersion: batch/v1
kind: Job
metadata:
  name: {{ .Release.Name }}-pre-upgrade-job
  namespace: {{ .Values.namespace.name }}
  annotations:
    "helm.sh/hook": pre-upgrade
spec:
  template:
    spec:
      containers:

      - name: upgrade82-copy
        image: <your-image>
        command: ["/bin/bash"]
        args: ["-c", "/scripts/upgrade82.sh"]

        volumeMounts:
        - name: old-data
          mountPath: /usr/old
          readOnly: false

        - name: new-data
          mountPath: /usr/new
          readOnly: false

        - name: scripts
          mountPath: /scripts
          readOnly: false

      restartPolicy: Never
      volumes:
        - name: old-data
          persistentVolumeClaim:
            claimName: old-claim << Needs to be hardcoded to what is running

        - name: new-data
          persistentVolumeClaim:
            claimName: new-data-namespace-app-0 << There is a specific format for statefulset PVC

        - name: scripts
          configMap:
           name: upgrade
           defaultMode: 0755

  backoffLimit: 4
  #activeDeadlineSeconds: 200
  ttlSecondsAfterFinished : 100

И обновление выше - это еще одна карта конфигурации с вашим скриптом копирования.

person Arunmu    schedule 17.11.2020

По какой-то причине мы создаем pv / pvc на предварительной стадии для таких модулей Statefulset. Во время обновления мы удаляем старый pv / pvc и, используя новый, удаляем старые развертывания и создаем автономную службу, а также сохраняем некоторые старые службы для балансировки нагрузки. Поскольку pv / pvc связывается только один раз, необходимо создать новый pv.

person leo    schedule 16.11.2020
comment
Да .. это то, чем я закончил. Предварительно создайте PV и PVC, которые будет использовать новый набор состояний, и скопируйте данные из старого PV в новый в ловушке перед обновлением. - person Arunmu; 17.11.2020
comment
@Arunmu, раз уж вы это решили, не могли бы вы опубликовать более подробное решение? Это может помочь другим людям, столкнувшимся с подобными проблемами. - person acid_fuji; 17.11.2020
comment
@thomas Конечно, я поставил это в качестве ответа. Пожалуйста, дайте мне знать, если что-то требует большей ясности. - person Arunmu; 17.11.2020