Почему мне нужно поместить 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
Почему это?
2 ответа
Ну, это оказалось недостатком знаний о 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
Начиная с etcd 3.4 он больше не нужен: https://github.com/etcd-io/etcd/pull/9784