#kubernetes-helm
#kubernetes-рулевой
Вопрос:
Соответствующие документы: https://helm.sh/docs/chart_template_guide/functions_and_pipelines/#using-the-lookup-function
Моя версия шлема:
$ helm version
version.BuildInfo{Version:"v3.4.1",
GitCommit:"c4e74854886b2efe3321e185578e6db9be0a6e29",
GitTreeState:"dirty", GoVersion:"go1.15.4"}
Минимальный пример для воспроизведения:
- Создайте новую схему управления и установите ее.
$ helm create my-chart $ helm install my-chart ./my-chart
- Создайте простую конфигурационную карту.
# my-chart/templates/configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: my-configmap data: someKey: someValue
Обновите существующую диаграмму, чтобы была применена конфигурационная карта.
$ helm upgrade my-chart ./my-chart
- Подтвердите, что конфигурационная карта существует.
$ kubectl -n default get configmap my-configmap
Который возвращает, как и ожидалось:
NAME DATA AGE my-configmap 1 12m
- Попробуйте использовать
lookup
функцию для ссылки на существующую конфигурационную карту.# my-chart/templates/configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: my-configmap data: someKey: someValue someOtherKey: {{ (lookup "v1" "ConfigMap" "default" "my-configmap").data.someValue }}
Затем выполните пробный запуск обновления.
$ helm upgrade my-chart ./my-chart --dry-run
Вы столкнетесь с нулевой ошибкой указателя:
Error: UPGRADE FAILED: template: my-chart/templates/configmap.yaml:9:54: executing "my- chart/templates/configmap.yaml" at <"my-configmap">: nil pointer evaluating interface {}.someValue
Что я делаю не так?
Комментарии:
1.
my-configmap
находится ли is в пространстве имен по умолчанию?2. @SaikatChakrabortty Правильно.
3. поиск обычно возвращает
map
илиnil
, можете ли вы проверить, пока.data
или может быть без.data
, что вы получаете? просто для отладки.4. Без
.data
этого возвращается поискmap[]
. Но каждый ключ естьnil
, поэтому.data.someKey
приводит к исключению нулевого указателя.
Ответ №1:
Это ожидаемое поведение, если вы используете --dry-run
flag.
Из документации
Имейте в виду, что Helm не должен связываться с сервером API Kubernetes во время a
helm template
или ahelm install|update|delete|rollback --dry-run
, поэтому функция поиска в таком случае вернет пустой список (т. Е. dict ).
Комментарии:
1. Связано ли это с устареванием
kubectl apply --dry-run
в пользу либоkubectl apply --dry-run=client
илиkubectl apply --dry-run=server
? Пока helm не разрешит связываться с сервером во время пробного запуска, этаlookup
команда для меня бесполезна, потому что мой CI / CD требует прохождения пробного запуска перед … «мокрый» запуск.2. смотрите обсуждение здесь о том, когда оно будет доступно в разделе
--dry-run
: github.com/helm/helm/issues/8137