helm: функция ‘lookup’ всегда возвращает пустую карту

#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"}
 

Минимальный пример для воспроизведения:

  1. Создайте новую схему управления и установите ее.
     $ helm create my-chart
    $ helm install my-chart ./my-chart
     
  2. Создайте простую конфигурационную карту.
     # my-chart/templates/configmap.yaml
    
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: my-configmap
    data:
      someKey: someValue
     

    Обновите существующую диаграмму, чтобы была применена конфигурационная карта.

     $ helm upgrade my-chart ./my-chart
     
  3. Подтвердите, что конфигурационная карта существует.
     $ kubectl -n default get configmap my-configmap
     

    Который возвращает, как и ожидалось:

     NAME           DATA   AGE
    my-configmap   1      12m
     
  4. Попробуйте использовать 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 или a helm 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