首页 > 解决方案 > 为什么我需要将 ETCDCTL_API=3 放在 etcdctl 前面才能使 etcdctl 快照保存工作?

问题描述

我在硬件上进行了 Kubernetes 的定制安装,并将其成功安装在 Hyper V 中的 2 节点集群上(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

为什么是这样?

标签: kubernetesenvironment-variablesetcdetcd3etcd2

解决方案


原来是缺乏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

推荐阅读