сбой `kubectl` при вызове из функции bash

#bash #environment-variables #kubectl

#bash #переменные среды #kubectl

Вопрос:

Я использую env-vars, как $foo в моих .yaml файлах K8s:

 > cat .env
NAMESPACE=fred

> cat my.yaml 
apiVersion: v1
kind: Namespace
metadata:
  name: $NAMESPACE
  

Я пропускаю их kubectl таким образом:

 function f() { ( set -a;  source .env;  cat $1 | envsubst | kubectl apply -f - ) }
f my.yaml
  

Это дает:

ошибка: вы должны войти в систему на сервере (сервер запросил у клиента учетные данные)

Однако,

 > cat pure.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: fred

> kubectl apply -f pure.yaml
  

… завершается нормально!

Что может быть не так?

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

1. Использование вашей функции ( set -a; source .env ) предполагает, что вы не запускаете это от своего обычного пользователя. Я прав? Если это так, вам может потребоваться указать, как / где находятся ваши учетные данные

2. @NorbertvanNobelen Нет, я запускаю это от обычного пользователя. И он находит учетные данные, когда я запускаю его напрямую, без подстановок.

3. Хорошо, можете ли вы протестировать без функции set -a; source .env; in? Похоже, что он удалил часть настроек вашей среды, а не добавил к ней. Также добавьте a #!/bin/bash в свой скрипт (если он еще не присутствует), чтобы сообщить оболочке, что вы хотите снова использовать bash

4. set -a; source .env; это совершенно ясно и не должно быть проблемой здесь, он просто заботится о том, что NAMESPACE=fred экспортируется, и похоже, что эта часть работает правильно. Как именно вы вызываете этот скрипт? Что произойдет, если вы вызовете kubectl apply -f pure.yaml , но также и из скрипта bash? Я думаю, проблема на самом деле не связана с заменой переменных здесь, поскольку, похоже, она работает хорошо. Это скорее вызов kubectl commands из вашего скрипта.