#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, вам нужно получить информацию метаданных нового ресурса. Давайте углубимся в это:
Сценарий:
secret
Имяmy-secret
, развернутое вdefault
пространстве имен. (Не управляется Helm)- Диаграмма helm с секретным шаблоном с именем
my-new-var
с другим значением.
Шаги:
- Создайте обычный секрет для целей тестирования, используя эту спецификацию:
apiVersion: v1
kind: Secret
metadata:
name: my-secret
type: Opaque
data:
secret: S29vcGFLaWxsZXIK
- Примените диаграмму 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, чтобы добавить эту информацию. В результате будет создан файл, подобный этому:
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
-
Удалите
my-new-secret
create by Helm, поскольку мы больше не используем его:
kubectl delete secrets my-new-secret
-
В таблице Helm отредактируйте секретное имя, чтобы оно соответствовало старому секрету, в нашем случае измените имя с
my-new-secret
наmy-secret
. -
Обновите диаграмму 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 и тому подобное.
Больше крючков можно найти здесь, которые можно использовать по мере необходимости.