kubernetes - 为什么我需要将 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
为什么是这样?
解决方案
原来是缺乏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
推荐阅读
- python - positional_or_keyword_parameters 和 var_positional_parameters 之间的冲突?
- typescript - 不使用 typeorm 关系
- c# - 尝试创建类的新实例时,请获取 CS7036 C# 没有给出与所需的形式参数相对应的参数
- javascript - 如何在 HTML/EJS 页面中将节点 Js sql 查询结果显示为下拉列表
- python-3.x - 使用 python 打印文件打印 n 个最大字符/行
- vba - Visual Basic - 使用名称中的变量引用组合框
- r - 3D plot tick labels do not match with axis values (R lattice)
- javascript - 检测消息是否为回复
- django - 在 django 项目中,我应该在 .gitignore 中添加哪些文件?
- swift - 为什么 indexingIterator.next() 使用动态调度?