Почему мне нужно поставить ETCDCTL_API=3 перед etcdctl, чтобы сохранённый снимок etcdctl работал?

Я сделал настраиваемую установку Kubernetes на жестком пути и успешно установил ее на кластере из 2 узлов в Hyper V (1 мастер 1 рабочий), все работает, но есть одна вещь, которая заставляет меня почесать голову, и мне было интересно, может ли кто-нибудь дать мне представление о том, почему это происходит.

etcdctl --help

Дает мне версию справки etcd v2, а также следующее предупреждение.

ВНИМАНИЕ: переменная среды ETCDCTL_API не задана; по умолчанию используется etcdctl v2. Установите переменную среды ETCDCTL_API=3, чтобы использовать v3 API, или ETCDCTL_API=2, чтобы использовать v2 API.

Если я установлю переменную среды и снова запущу команду, она будет проигнорирована:

ETCDCTL_API=3
etcdctl --help

Но если я сделаю

ETCDCTL_API=3 etcdctl --help

Затем он дает мне версию справки etcd v3, мне также нужно поставить ETCDCTL_API=3 перед сохранением моментального снимка etcdctl, чтобы он был распознан как действительная команда.

ETCDCTL_API=3 etcdctl snapshot save ~/etcd.backup \
  --endpoints=https://127.0.0.1:2379 \
  --cacert=/etc/etcd/ca.pem \
  --cert=/etc/etcd/kubernetes.pem \
  --key=/etc/etcd/kubernetes-key.pem

Почему это?


person neokyle    schedule 08.10.2018    source источник


Ответы (1)


Ну, это оказалось отсутствием знаний Linux. Когда я следил за несколькими руководствами Kubernetes, я постоянно использовал переменные Bash, но не осознавал, что есть разница между обычными переменными и переменными среды.

Я делал:

ETCDCTL_API=3 
echo $ETCDCTL_API
3

И это выглядело правильно, но потом я вспомнил команду printenv и не увидел того, что ожидал, именно тогда я понял, что есть разница между переменными среды и обычными переменными.

Мне пришлось добавить экспорт перед оператором переменной, чтобы сделать его переменной среды.

Что действительно здорово, так это то, что после прочтения этого
https://github.com/etcd-io/etcd/blob/master/etcdctl/README.md

Я смог сделать вышеперечисленное, превратив его в красивые короткие команды, например:

export ETCDCTL_API=3
export ETCDCTL_CACERT=/etc/etcd/ca.pem
export ETCDCTL_CERT=/etc/etcd/kubernetes.pem
export ETCDCTL_KEY=/etc/etcd/kubernetes-key.pem

etcdctl member list --endpoints=https://127.0.0.1:2379 

etcdctl snapshot save ~/etcd.backup
person neokyle    schedule 08.10.2018