Kubernetes OCI runtime exec failed - starting container process caused "exec: \"etcdctl\": executable file not found in $PATH": unknown

Предыстория

Создал свежий кластер 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)
1
задан 1 February 2021 в 05:18
3 ответа

Ошибка, упомянутая 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

Да, можем!


Подведем итог: похоже, что вы с самого начала смотрели не на тот контейнер.

0
ответ дан 24 April 2021 в 01:04

Превышен крайний срок контекста - это непонятная ошибка, возвращаемая 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 принимает несколько опций конфигурации, связанных с сертификатами, либо через флаги командной строки, либо через переменные окружения. Основные настройки для него можно найти здесь.

0
ответ дан 24 April 2021 в 01:04

если вы используете alpine try

docker exec -it <container-id> sh

Это может произойти из-за ошибки в заказе Возможно, вам придется запустить use /bin/bash или /bin/sh, в зависимости от оболочки в вашем контейнере.

Причина задокументирована в файле ReleaseNotes в Git и хорошо объяснена здесь — Bash в Git для Windows: странность

еще одно решение:

0
ответ дан 28 November 2021 в 09:58

Теги

Похожие вопросы