В настоящее время я пытаюсь использовать функцию поиска через Helm 3.1 для загрузки переменной во время установки.
{{ $ingress := (lookup "v1" "Ingress" "mynamespace" "ingressname").status.loadBalancer.ingress[0].hostname }}
Конечно, это возвращает «плохой персонаж [». Если я удалю его, он вернет «нулевой указатель, оценивающий интерфейс {}.loadBalancer».
Возможно ли то, что я пытаюсь сделать?
Спасибо
Вы пытаетесь использовать «обычный» синтаксис индексации массива, но диаграммы helm используют «шаблоны golang», поэтому индексация массива выполняется через функция index
.
{{ $ingress := (index (lookup "v1" "Ingress" "mynamespace" "ingressname").status.loadBalancer.ingress 0).hostname }}
после дальнейших размышлений я могу легко представить, что ошибка указателя nil
происходит во время helm template
запусков, поскольку lookup
возвращает map[]
при работе в автономном режиме
В этом случае вы захотите использовать функцию index
для навигации по пути каждый:
{{ $ingress := (index (index (index (index (index (lookup "v1" "Ingress" "mynamespace" "ingressname") "status") "loadBalancer") "ingress") 0) "hostname") }}
или подтвердите, что поиск находится в «автономном» режиме, и обойдите его:
{{ $ingress := "fake.example.com" }}
{{ $maybeLookup := (lookup "v1" "Ingress" "mynamespace" "ingressname") }}
{{ if $maybeLookup }}
{{ $ingress = (index $maybeLookup.status.loadBalancer.ingress 0).hostname }}
{{ end }}
В таком случае мне жаль, что я удалил свой предыдущий комментарий, потому что вам может быть полезно посмотреть, что видит helm с помощью {{ $x := (lookup "v1" "Ingress" "myns" "thename") | toJson }}{{ fail $x }}
, а затем запустить helm install
, потому что lookup
связывается только с k8s во время операций жить, helm template
и helm install --dry-run
не будут этого делать.
Макданиэль, спасибо. {{ $ingress := ( index (lookup "networking.k8s.io/v1" "Ingress" "mynamespace" "ingress").status.loadBalancer.ingress 0).hostname }}
Ваш ответ правильный, моя проблема в том, что я вызывал не тот API. У меня был v1, хотя должен был быть networking.k8s.io/v1. Спасибо за помощь!
Ах, да, мне жаль, что я не заметил этого раньше, и я рад, что у вас наконец получилось!
Не волнуйтесь. Я ценю ваше время и понимание. Однозначно приведет к решению проблемы.
Спасибо за ответ mdaniel. Я попробовал это, но получил ниже. Ошибка, которую я получаю сейчас:
: nil pointer evaluating interface {}.loadBalancer
Я могу подтвердить, что вход действительно находится в пространстве имен, на которое я ссылаюсь, и у меня есть правильное имя для пространства имен/входа. Путь JSON через kubectl возвращает его. Пример рабочего кубектла:kubectl get ingress/ingressname -n namespace -o jsonpath = "{.status.loadBalancer.ingress[0].hostname}"