Установите пакет helm с уже установленными компонентами

#amazon-web-services #azure #kubernetes #kubernetes-helm

#amazon-веб-сервисы #azure #kubernetes #kubernetes-helm

Вопрос:

Я развернул приложение на k8s с помощью kubectl apply ... нескольких недель назад, приложение работает в prod.Теперь мы переключаемся на установку helm и строим диаграмму, с помощью которой мы хотим обновить приложение. Проблема в том, что уже развернуты артефакты, такие как секретные / конфигурационные карты приложения, которые я не могу удалить.

И во время выполнения helm upgrade --install app chart/myapp -n ns

Я получил ошибку типа

Ошибка: отображаемые манифесты содержат ресурс, который уже существует. Невозможно продолжить установку: существующий конфликт ресурсов: пространство имен: ns, имя: bts, existing_kind: /v1, Kind=Secret, new_kind: /v1, Kind=Secret

Есть ли какой-либо трюк, который я могу использовать, чтобы преодолеть это, не удаляя secret / configmap?

Комментарии:

1. вы делаете это в своем собственном кластере клиентов, используя виртуальные машины Azure, или вы делаете это в управляемой службе k8s в Azure, такой как AKS? Итак, в AKS — Helm уже есть предустановленный. вы можете узнать более подробную информацию об этом здесь: learn.microsoft.com/en-us/azure/aks/kubernetes-helm

2. @HassanRaza — мы управляем нашими k8, и у нас уже установлен helm, который работает нормально, это не вопрос 🙂

3. Нет, helm не имеет возможности импортировать существующие ресурсы. Вам нужно переименовать их в helm, чтобы имена не конфликтовали, или удалить их из запущенного кластера. github.com/helm/helm/issues/6561

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

5. Это может быть невозможно, поскольку helm может обновлять только те ресурсы, которые были установлены helm .. вы можете попробовать, если вы можете добавить эти конкретные метки и аннотации, чтобы обмануть helm, если эти ресурсы были установлены helm, но это может быть невозможно

Ответ №1:

После тестирования некоторых опций в моей лаборатории я понял, что способ, о котором я рассказал вам в комментариях, сработал.

Helm использует информацию о metadata и labels вводятся в ресурсы, чтобы знать, какие ресурсы управляются самостоятельно. В приведенном ниже обходном пути показано, как можно импортировать ранее созданный секрет, не управляемый Helm, используя matadata информацию из нового секретного файла, развернутого с помощью Helm.

Предположим, что my-secret уже развернут, и вы хотите «импортировать» этот ресурс в helm, вам нужно получить информацию метаданных нового ресурса. Давайте углубимся в это:

Сценарий:

  1. secret Имя my-secret , развернутое в default пространстве имен. (Не управляется Helm)
  2. Диаграмма helm с секретным шаблоном с именем my-new-var с другим значением.

Шаги:

  1. Создайте обычный секрет для целей тестирования, используя эту спецификацию:
     apiVersion: v1
    kind: Secret
    metadata:
      name: my-secret
    type: Opaque
    data:
      secret: S29vcGFLaWxsZXIK
  
  1. Примените диаграмму Helm для создания my-new-secret . Реальная цель этого — получить metadata и labels информацию.

После этого вы можете просмотреть секретный файл с помощью команды:

kubectl get secrets my-secret -o yaml :

 apiVersion: v1
data:
  secret: VXB2b3RlSXQ=
kind: Secret
metadata:
  annotations:
    meta.helm.sh/release-name: myapp-1599472603
    meta.helm.sh/release-namespace: default
  creationTimestamp: "2020-09-07T10:03:05Z"
  labels:
    app.kubernetes.io/managed-by: Helm
  name: my-secret
  namespace: default
  resourceVersion: "2064792"
  selfLink: /api/v1/namespaces/default/secrets/my-secret
  uid: 7cf66475-b26b-415b-8c11-8fb6974da495
type: Opaque
  

Из этого файла нам нужно получить annotations и labels применить в нашем старом my-secret .

  1. Отредактируйте секретный файл, созданный на шаге 1, чтобы добавить эту информацию. В результате будет создан файл, подобный этому:
 apiVersion: v1
data:
  secret: S29vcGFLaWxsZXIK
kind: Secret
metadata:
  annotations:
    meta.helm.sh/release-name: myapp-1599472603
    meta.helm.sh/release-namespace: default
  name: my-secret
  labels:
    app.kubernetes.io/managed-by: Helm
  namespace: default
  
  1. Удалите my-new-secret create by Helm, поскольку мы больше не используем его:
    kubectl delete secrets my-new-secret

  2. В таблице Helm отредактируйте секретное имя, чтобы оно соответствовало старому секрету, в нашем случае измените имя с my-new-secret на my-secret .

  3. Обновите диаграмму Helm, в моем случае я использовал значение из Values.yaml:

 $ helm upgrade -f myapp/values.yaml myapp-1599472603 ./myapp/
Release "myapp-1599472603" has been upgraded. Happy Helming!
NAME: myapp-1599472603
LAST DEPLOYED: Mon Sep  7 10:28:38 2020
NAMESPACE: default
STATUS: deployed
REVISION: 2
TEST SUITE: None
  

Ответ №2:

У вас могут быть крючки для руля, которые помогут вам снять его.

 annotations:
  "helm.sh/hook": pre-install, pre-upgrade
  

Приведенная выше аннотация помогла бы исправить это. Аналогичные аннотации могут быть добавлены к ресурсам, которые не удаляются по умолчанию, таким как ClusterRoles и тому подобное.

Больше крючков можно найти здесь, которые можно использовать по мере необходимости.