Предыстория
Создал свежий кластер 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
EDIT
Обновлено до v3.2 etcdctl API
Команда
etcdctl endpoint status
Ответ
Failed to get the status of endpoint 127.0.0.1:2379 (context deadline exceeded)
Ошибка, упомянутая OP, вызвана несуществующим etcdctl exacutable в контейнере.
Почему? Потому что он использовал неправильный контейнер. Посмотрите на следующую команду:
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.
Но почему? Что это за контейнер pause? Я не буду отвечать на этот вопрос, потому что кто-то уже ответил на него здесь: what-are-the-pause-containers.
Я попытаюсь ответить на вопрос получше: Где на самом деле находится контейнер etcd?
Давайте посмотрим на вывод той же команды, но с немного измененной командой grep; давайте grep for 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
Теперь у нас есть две строки вывода, одна - это ранее найденный контейнер паузы, а вторая - наш контейнер 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
Да, можем!
Подведем итог: похоже, что вы с самого начала смотрели не на тот контейнер.
Превышен крайний срок контекста
- это непонятная ошибка, возвращаемая grpc
клиентом, когда он не может установить соединение. Если вы хотите увидеть точное сообщение об ошибке, вам следует установить ETCDCTL_API=2
(подробнее об этом можно прочитать здесь).
Пары cert/key в /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 |
Убедитесь, что вы применили правильную пару cert/key. Также вам может помочь это руководство.
Обратите внимание, что etcd принимает несколько опций конфигурации, связанных с сертификатами, либо через флаги командной строки, либо через переменные окружения. Основные настройки для него можно найти здесь.
если вы используете alpine try
docker exec -it <container-id> sh
Это может произойти из-за ошибки в заказе Возможно, вам придется запустить use /bin/bash или /bin/sh, в зависимости от оболочки в вашем контейнере.
Причина задокументирована в файле ReleaseNotes в Git и хорошо объяснена здесь — Bash в Git для Windows: странность