背景
通过运行以下命令创建一个新的 Kubernetes 集群kubeadm init --config /home/kube/kubeadmn-config.yaml --upload-certs
,然后加入第二个控制平面节点。
kubeadm join VIP:6443 --token <token> \
--discovery-token-ca-cert-hash sha256:<hash> \
--control-plane --certificate-key <key> \
--v=5
问题
etcdctl 命令是否应该返回返回值?要么直接使用命令,要么使用下面显示的 docker exec 方法。我安装了这些软件包:kubeadm、kubectl、kubelet 和 docker。
Kubectl 版本:1.20.1 操作系统:Ubuntu 18.04
来自第一个节点的命令
命令
etcdctl cluster-health
回复
cluster may be unhealthy: failed to list members
Error: client: etcd cluster is unavailable or misconfigured; error #0: dial tcp 127.0.0.1:4001: connect: connection refused
; error #1: EOF
error #0: dial tcp 127.0.0.1:4001: connect: connection refused
error #1: EOF
命令
docker container ls | grep k8s_POD_etcd
回复
k8s_POD_etcd-<nodename>_kube-system_<docker container id>
命令
docker exec -it k8s_POD_etcd-<nodename>_kube-system_<docker container id> etcdctl --endpoints=https://<node ip>:2379 --key=/etc/kubernetes/pki/etcd/peer.key --cert=/etc/kubernetes/pki/etcd/peer.crt --cacert=/etc/kubernetes/pki/etcd/ca.crt member list
回复
OCI runtime exec failed: exec failed: container_linux.go:349: starting container process caused "exec: \"etcdctl\": executable file not found in $PATH": unknown
编辑
升级到 v3.2 etcdctl API
命令
etcdctl endpoint status
回复
Failed to get the status of endpoint 127.0.0.1:2379 (context deadline exceeded)
答案1
OP 提到的错误是由于容器中不存在 etcdctl 可执行文件引起的。
为什么?因为他使用了错误的容器。请看以下命令:
docker container ls | grep k8s_POD_etcd
be510c179ced k8s.gcr.io/pause:3.2 "/pause" 2 days ago Up 2 days k8s_POD_etcd-minikube_kube-system_2315889f8b2b54f1b9d43feafe941d01_0
注意容器是k8s.gcr.io/pause:3.2
。它不是 etcd 容器。
但为什么?这个暂停容器是什么?我不会回答这个问题,因为有人已经在这里回答了:暂停容器是什么。
我将尝试回答一个更好的问题:实际的 etcd 容器在哪里?
让我们看一下相同命令的输出,但使用稍微修改过的 grep 命令;让我们使用 grep 来etcd
:
docker container ls | grep etcd
c989e7d1d25b 0369cf4303ff "etcd --advertise-cl…" 2 days ago Up 2 days k8s_etcd_etcd-minikube_kube-system_2315889f8b2b54f1b9d43feafe941d01_0
be510c179ced k8s.gcr.io/pause:3.2 "/pause" 2 days ago Up 2 days k8s_POD_etcd-minikube_kube-system_2315889f8b2b54f1b9d43feafe941d01_0
现在我们有两行输出,一行是之前找到的 pause 容器,第二行是我们的 etcd 容器,名字以 开头k8s_etcd_etcd
。我们看看能不能在这个容器上运行 docker exec:
$ docker exec -it k8s_etcd_etcd-<nodename>_kube-system_<docker container id> etcdctl version
etcdctl version: 3.4.13
API version: 3.4
我们可以!
总而言之:看起来你从一开始就看错了容器。
答案2
这是客户端无法建立连接时context deadline exceeded
返回的不明确错误。如果您想查看确切的错误消息,您应该设置(有关详细信息,请参阅grpc
ETCDCTL_API=2
这里)。
中的证书/密钥对应/etc/kubernetes/pki/etcd/
如下所示:
# ls -l /etc/kubernetes/pki/etcd/
total 32
-rw-r--r-- 1 root root 1017 Nov 12 15:32 ca.crt
-rw------- 1 root root 1679 Nov 12 15:32 ca.key
-rw-r--r-- 1 root root 1094 Nov 12 15:32 healthcheck-client.crt
-rw------- 1 root root 1675 Nov 12 15:32 healthcheck-client.key
-rw-r--r-- 1 root root 1180 Nov 12 15:32 peer.crt
-rw------- 1 root root 1675 Nov 12 15:32 peer.key
-rw-r--r-- 1 root root 1180 Nov 12 15:32 server.crt
-rw------- 1 root root 1679 Nov 12 15:32 server.key
# etcdctl --version
etcdctl version: 3.3.1
API version: 2
# ETCDCTL_API=3 etcdctl snapshot save snapshot.db \
--cacert /etc/kubernetes/pki/etcd/ca.crt \
--cert /etc/kubernetes/pki/etcd/server.crt \
--key /etc/kubernetes/pki/etcd/server.key
Snapshot saved at snapshot.db
# ETCDCTL_API=3 etcdctl --write-out=table snapshot status snapshot.db
+----------+----------+------------+------------+
| HASH | REVISION | TOTAL KEYS | TOTAL SIZE |
+----------+----------+------------+------------+
| b9d500f7 | 72966 | 1194 | 4.9 MB |
请注意,etcd 需要几个与证书相关的配置选项,可以通过命令行标志或环境变量来实现。它的基本设置可以在这里找到这里。
答案3
如果你正在使用 Alpine,请尝试
docker exec -it <container-id> sh
这可能是由于排序错误而发生的,您可能需要运行 /bin/bash 或 /bin/sh,具体取决于容器中的 shell。
原因记录在 Git 的 ReleaseNotes 文件中,这里也有很好的解释 -Windows 版 Git 中的 Bash:怪异之处