为什么我需要在 etcdctl 前面加上 ETCDCTL_API=3 才能使 etcdctl 快照保存工作?
Why do I need to put ETCDCTL_API=3 in front of etcdctl for etcdctl snapshot save to work?
我以 hardway 的方式对 Kubernetes 进行了自定义安装,并将其成功安装在 Hyper V 的 2 节点集群上(1 master 1 worker),一切正常,但有一个东西让我挠头,我想知道如果有人能告诉我为什么会这样。
etcdctl --help
给了我etcd v2版本的帮助,还给了我下面的Warning。
WARNING: Environment variable ETCDCTL_API is not set; defaults to
etcdctl v2. Set environment variable ETCDCTL_API=3 to use v3 API or
ETCDCTL_API=2 to use v2 API.
如果我再次设置环境变量和运行命令,它会被忽略:
ETCDCTL_API=3
etcdctl --help
但如果我这样做
ETCDCTL_API=3 etcdctl --help
然后它给了我etcd v3版本的帮助,我还需要在etcdctl snapshot save前面加上ETCDCTL_API=3才能被识别为有效命令。
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
这是为什么?
嗯,原来是缺乏Linux知识。
当我遵循一些 Kubernetes 如何指导我一直使用 Bash 变量时,我没有意识到普通变量和环境变量之间存在差异。
我在做:
ETCDCTL_API=3
echo $ETCDCTL_API
3
它看起来是正确的,但后来我想起了 printenv 命令,但我没有看到我期望的结果,那时我发现环境变量和常规变量之间存在差异。
我不得不在变量语句前加上export,让它成为一个环境变量。
真正棒的是看完这篇文章后
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
我以 hardway 的方式对 Kubernetes 进行了自定义安装,并将其成功安装在 Hyper V 的 2 节点集群上(1 master 1 worker),一切正常,但有一个东西让我挠头,我想知道如果有人能告诉我为什么会这样。
etcdctl --help
给了我etcd v2版本的帮助,还给了我下面的Warning。
WARNING: Environment variable ETCDCTL_API is not set; defaults to etcdctl v2. Set environment variable ETCDCTL_API=3 to use v3 API or ETCDCTL_API=2 to use v2 API.
如果我再次设置环境变量和运行命令,它会被忽略:
ETCDCTL_API=3
etcdctl --help
但如果我这样做
ETCDCTL_API=3 etcdctl --help
然后它给了我etcd v3版本的帮助,我还需要在etcdctl snapshot save前面加上ETCDCTL_API=3才能被识别为有效命令。
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
这是为什么?
嗯,原来是缺乏Linux知识。 当我遵循一些 Kubernetes 如何指导我一直使用 Bash 变量时,我没有意识到普通变量和环境变量之间存在差异。
我在做:
ETCDCTL_API=3
echo $ETCDCTL_API
3
它看起来是正确的,但后来我想起了 printenv 命令,但我没有看到我期望的结果,那时我发现环境变量和常规变量之间存在差异。
我不得不在变量语句前加上export,让它成为一个环境变量。
真正棒的是看完这篇文章后
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