Kubernetes — модули kube-system на главном узле продолжают перезапускаться после присоединения рабочего узла

Я следовал этому руководству и этот руководство и этот, но последние 3 дня я сталкиваюсь с той же проблемой.

Я могу правильно настроить главный узел, выполнив следующие действия:

kubeadm init

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

export kubever=$(kubectl version | base64 | tr -d ‘\’)
kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$kubever"

и вроде все нормально

kubectl get all --namespace=kube-system

тогда,

на рабочем узле:

kubeadm join --token 864655.fdf6d0b389867b79 192.168.100.17:6443 --discovery-token-ca-cert-hash sha256:a2d840808b17b53b9612e6271ccde489f13dbede7d354f97188d0faa9e210af2

Вывод выглядит нормально и выглядит следующим образом:

[preflight] Running pre-flight checks.
  [WARNING FileExisting-crictl]: crictl not found in system path
[preflight] Starting the kubelet service
[discovery] Trying to connect to API Server "192.168.100.17:6443"
[discovery] Created cluster-info discovery client, requesting info from "https://192.168.100.17:6443"
[discovery] Requesting info from "https://192.168.100.17:6443" again to validate TLS against the pinned public key
[discovery] Cluster info signature and contents are valid and TLS certificate validates against pinned roots, will use API Server "192.168.100.17:6443"
[discovery] Successfully established connection with API Server "192.168.100.17:6443"

This node has joined the cluster:
* Certificate signing request was sent to master and a response
  was received.
* The Kubelet was informed of the new secure connection details.

Run 'kubectl get nodes' on the master to see this node join the cluster.

НО как только я запускаю эту команду, начинается ад.

kubectl get all --namespace=kube-system

начинает показывать, что все модули постоянно перезагружаются. статус постоянно меняется между Pending и Running, и со временем некоторые из модулей даже исчезнут и могут иметь статус ContainerCreating и т. д.

NAME                                READY     STATUS    RESTARTS   AGE
po/etcd-ubuntu                      0/1       Pending   0          0s
po/kube-controller-manager-ubuntu   0/1       Pending   0          0s
po/kube-dns-6f4fd4bdf-cmcfk         3/3       Running   0          13m
po/kube-proxy-2chb6                 1/1       Running   0          13m
po/kube-scheduler-ubuntu            0/1       Pending   0          0s
po/weave-net-ptdxr                  2/2       Running   0          11m

Я также попробовал второй учебник с фланелью и получил точно такую ​​​​же проблему.

Мои настройки

Я создал две новые виртуальные машины со свежеустановленной Ubuntu 17.10 на VMware с 2 процессорами/2 ядрами, 6 ГБ оперативной памяти и 50 ГБ на жестком диске каждая. Моя физическая машина — i7-6700k с 32 ГБ оперативной памяти. Я установил kubeadm, kubelet и docker на оба из них, а затем выполнил шаги, указанные выше.

Я также пробовал переключаться между NAT и Bridge на VMware, и ничего не изменилось.

Начальный IP-адрес обеих виртуальных машин с мостовой сетью был 192.168.100.12 и 192.168.100.17. hostname -I для мастера:

192.168.100.17 172.17.0.1 10.32.0.1 10.32.0.2

hostname -I для рабочего узла:

192.168.100.12 172.17.0.1 10.44.0.0 10.32.0.1

journalctl -xeu kubelet показывает следующее:

https://gist.github.com/saad749/9a771a3460bf88c274498b5bc4b7fd84

При попытке с фланелью (и все та же проблема) результат от

kubectl describe nodes

is

https://gist.github.com/saad749/d24c453c8b4e663e9abf572a0fb38bf4

Я пропустил какой-либо шаг перед запуском kubeadm? Должен ли я изменить IP-адреса (на какие)? Есть ли какие-то конкретные журналы, которые я должен изучить? Есть ли более подробный учебник для этого? Все проблемы начинаются после присоединения kubeadm на рабочем узле, я могу развернуть kubernetes на главном узле или что-то еще, и все работает нормально.

ОБНОВЛЕНИЕ:

Даже после применения предложений от errordeveloper та же проблема сохраняется.

Я добавляю следующий флаг в kubeadm init:

--apiserver-advertise-address 192.168.100.17

Я обновил kubeadm.conf следующим образом, перезагрузил и перезапустил: saad749/c7149c87ec3e75a40586f626cf04279a

а также попытался изменить DNS кластера https://gist.github.com/saad749/5fa66bebc22841e58119333e75600e40

Это журнал после инициализации мастера:

kube-master@ubuntu:~$ kubectl get pod --all-namespaces -o wide
NAMESPACE     NAME                             READY     STATUS    RESTARTS   AGE       IP               NODE
kube-system   etcd-ubuntu                      1/1       Running   0          22s       192.168.100.17   ubuntu
kube-system   kube-apiserver-ubuntu            1/1       Running   0          29s       192.168.100.17   ubuntu
kube-system   kube-controller-manager-ubuntu   1/1       Running   0          13s       192.168.100.17   ubuntu
kube-system   kube-dns-6f4fd4bdf-wfqhb         3/3       Running   0          1m        10.32.0.7        ubuntu
kube-system   kube-proxy-h4hz9                 1/1       Running   0          1m        192.168.100.17   ubuntu
kube-system   kube-scheduler-ubuntu            1/1       Running   0          34s       192.168.100.17   ubuntu
kube-system   weave-net-fkgnh                  2/2       Running   0          32s       192.168.100.17   ubuntu

Имя хоста -i результаты:

kube-master@ubuntu:~$ hostname -I
192.168.100.17 172.17.0.1 10.32.0.1 10.32.0.2 10.32.0.3 10.32.0.4 10.32.0.5 10.32.0.6 10.244.0.0 10.244.0.1
kube-master@ubuntu:~$ hostname -i
192.168.100.17

Результаты из:

kubectl describe nodes

https://gist.github.com/saad749/8f460650182a04d0ddf3158a52761a9a

Внутренний IP теперь кажется правильным.

После присоединения со второго узла происходит следующее:

kube-master@ubuntu:~$ kubectl get nodes
NAME      STATUS    ROLES     AGE       VERSION
ubuntu    Ready     master    49m       v1.9.3
kube-master@ubuntu:~$ kubectl get pod --all-namespaces -o wide
NAMESPACE     NAME                             READY     STATUS              RESTARTS   AGE       IP               NODE
kube-system   kube-controller-manager-ubuntu   0/1       Pending             0          0s        <none>           ubuntu
kube-system   kube-dns-6f4fd4bdf-wfqhb         0/3       ContainerCreating   0          49m       <none>           ubuntu
kube-system   kube-proxy-h4hz9                 1/1       Running             0          49m       192.168.100.17   ubuntu
kube-system   kube-scheduler-ubuntu            1/1       Running             0          1s        192.168.100.17   ubuntu
kube-system   weave-net-fkgnh                  2/2       Running             0          48m       192.168.100.17   ubuntu

ifconfig -a результаты:

https://gist.github.com/saad749/63a5a52bd3246ff72477b2aca7d158d0

журналctl -xeu результаты kubelet

https://gist.github.com/saad749/8a60870b35f93df8565e66cb208aff32

Иногда IP-адрес модуля отображается как 192.168.100.12, который является IP-адресом второго узла, не являющегося главным.

kube-master@ubuntu:~$ kubectl get pod --all-namespaces -o wide
NAMESPACE     NAME                             READY     STATUS    RESTARTS   AGE       IP               NODE
kube-system   etcd-ubuntu                      0/1       Pending   0          0s        <none>           ubuntu
kube-system   kube-apiserver-ubuntu            0/1       Pending   0          0s        <none>           ubuntu
kube-system   kube-controller-manager-ubuntu   1/1       Running   0          0s        192.168.100.12   ubuntu
kube-system   kube-dns-6f4fd4bdf-wfqhb         2/3       Running   0          3h        10.32.0.7        ubuntu
kube-system   kube-proxy-h4hz9                 1/1       Running   0          3h        192.168.100.12   ubuntu
kube-system   kube-scheduler-ubuntu            0/1       Pending   0          0s        <none>           ubuntu
kube-system   weave-net-fkgnh                  2/2       Running   1          3h        192.168.100.17   ubuntu

kube-master@ubuntu:~$ kubectl get pod --all-namespaces -o wide
NAMESPACE     NAME                       READY     STATUS    RESTARTS   AGE       IP               NODE
kube-system   kube-dns-6f4fd4bdf-wfqhb   3/3       Running   0          3h        10.32.0.7        ubuntu
kube-system   kube-proxy-h4hz9           1/1       Running   0          3h        192.168.100.12   ubuntu
kube-system   weave-net-fkgnh            2/2       Running   0          3h        192.168.100.12   ubuntu


kubectl describe nodes
Name:               ubuntu
Roles:              master
Labels:             beta.kubernetes.io/arch=amd64
                    beta.kubernetes.io/os=linux
                    kubernetes.io/hostname=ubuntu
                    node-role.kubernetes.io/master=
Annotations:        node.alpha.kubernetes.io/ttl=0
                    volumes.kubernetes.io/controller-managed-attach-detach=true
Taints:             node-role.kubernetes.io/master:NoSchedule
CreationTimestamp:  Fri, 02 Mar 2018 08:21:47 -0800
Conditions:
  Type             Status  LastHeartbeatTime                 LastTransitionTime                Reason                       Message
  ----             ------  -----------------                 ------------------                ------                       -------
  OutOfDisk        False   Fri, 02 Mar 2018 11:38:36 -0800   Fri, 02 Mar 2018 08:21:43 -0800   KubeletHasSufficientDisk     kubelet has sufficient disk space available
  MemoryPressure   False   Fri, 02 Mar 2018 11:38:36 -0800   Fri, 02 Mar 2018 08:21:43 -0800   KubeletHasSufficientMemory   kubelet has sufficient memory available
  DiskPressure     False   Fri, 02 Mar 2018 11:38:36 -0800   Fri, 02 Mar 2018 08:21:43 -0800   KubeletHasNoDiskPressure     kubelet has no disk pressure
  Ready            True    Fri, 02 Mar 2018 11:38:36 -0800   Fri, 02 Mar 2018 11:28:25 -0800   KubeletReady                 kubelet is posting ready status. AppArmor enabled
Addresses:
  InternalIP:  192.168.100.12
  Hostname:    ubuntu
Capacity:
 cpu:     4
 memory:  6080832Ki
 pods:    110
Allocatable:
 cpu:     4
 memory:  5978432Ki
 pods:    110
System Info:
 Machine ID:                 59bf65b835b242a3aa182f4b8a542219
 System UUID:                0C3C4D56-4747-D59E-EE09-F16F2793677E
 Boot ID:                    658b4a08-d724-425e-9246-2b41995ecc46
 Kernel Version:             4.13.0-36-generic
 OS Image:                   Ubuntu 17.10
 Operating System:           linux
 Architecture:               amd64
 Container Runtime Version:  docker://1.13.1
 Kubelet Version:            v1.9.3
 Kube-Proxy Version:         v1.9.3
ExternalID:                  ubuntu
Non-terminated Pods:         (3 in total)
  Namespace                  Name                        CPU Requests  CPU Limits  Memory Requests  Memory Limits
  ---------                  ----                        ------------  ----------  ---------------  -------------
  kube-system                kube-dns-6f4fd4bdf-wfqhb    260m (6%)     0 (0%)      110Mi (1%)       170Mi (2%)
  kube-system                kube-proxy-h4hz9            0 (0%)        0 (0%)      0 (0%)           0 (0%)
  kube-system                weave-net-fkgnh             20m (0%)      0 (0%)      0 (0%)           0 (0%)
Allocated resources:
  (Total limits may be over 100 percent, i.e., overcommitted.)
  CPU Requests  CPU Limits  Memory Requests  Memory Limits
  ------------  ----------  ---------------  -------------
  280m (7%)     0 (0%)      110Mi (1%)       170Mi (2%)
Events:
  Type     Reason                   Age                 From             Message
  ----     ------                   ----                ----             -------
  Warning  Rebooted                 12m (x814 over 2h)  kubelet, ubuntu  Node ubuntu has been rebooted, boot id: 16efd500-a2a5-446f-ba25-1187857996e0
  Normal   NodeHasNoDiskPressure    10m                 kubelet, ubuntu  Node ubuntu status is now: NodeHasNoDiskPressure
  Normal   Starting                 10m                 kubelet, ubuntu  Starting kubelet.
  Normal   NodeAllocatableEnforced  10m                 kubelet, ubuntu  Updated Node Allocatable limit across pods
  Normal   NodeHasSufficientDisk    10m                 kubelet, ubuntu  Node ubuntu status is now: NodeHasSufficientDisk
  Normal   NodeHasSufficientMemory  10m                 kubelet, ubuntu  Node ubuntu status is now: NodeHasSufficientMemory
  Normal   NodeNotReady             10m                 kubelet, ubuntu  Node ubuntu status is now: NodeNotReady
  Warning  Rebooted                 2m (x870 over 2h)   kubelet, ubuntu  Node ubuntu has been rebooted, boot id: 658b4a08-d724-425e-9246-2b41995ecc46
  Warning  Rebooted                 15s (x60 over 10m)  kubelet, ubuntu  Node ubuntu has been rebooted, boot id: 16efd500-a2a5-446f-ba25-1187857996e0

Что я делаю неправильно?


person Saad Farooq    schedule 27.02.2018    source источник
comment
Когда модуль weave-net запущен, получите журналы из контейнера weave через kubectl logs -n kube-system weave-net-xxxx. Он не инициализировал CNI, что предполагает обнаружение ошибки.   -  person Bryan    schedule 28.02.2018
comment
Да, журналы, безусловно, помогут более точно определить проблему, но также см. мой ответ ниже.   -  person errordeveloper    schedule 28.02.2018
comment
@Bryan: команда не запускается. говорит: kubectl logs -n kube-system weave-net-fkgnh Ошибка сервера (BadRequest): для пода weave-net-fkgnh должно быть указано имя контейнера, выберите один из: [weave weave-npc]   -  person Saad Farooq    schedule 02.03.2018
comment
Для записи вы добавляете имя контейнера weave в конце, так что это будет kubectl logs -n kube-system weave-net-fkgnh weave   -  person Bryan    schedule 03.03.2018
comment
github.com/kubernetes/kubeadm/issues/7   -  person Chris Stryczynski    schedule 02.07.2018


Ответы (2)


Итак, после того, как я последовал совету @errordeveloper и все же уперся в стену, я смог решить проблему, которая оказалась довольно простой.

Обе мои виртуальные машины имели одинаковое имя хоста.

hostname -f 

вернется

ubuntu

на обоих, и это, по-видимому, вызывает проблемы с kubernetes.

Я изменил имя на своем неглавном узле на

hostnamectl set-hostname kminion

и в следующих файлах:

/etc/hostname
/etc/hosts

и дальше все пошло гладко!

person Saad Farooq    schedule 02.03.2018
comment
/etc/hostname должен быть установлен hostnamectl set-hostname. - person Chris Stryczynski; 02.07.2018
comment
Приходилось ли вам что-либо перезапускать? Я получаю такое же поведение после выполнения этих команд. - person Chris Stryczynski; 02.07.2018
comment
Нет, не помню, перезапускал систему. но если вы уже инициализировали кластер, может помочь его сброс и повторная инициализация. - person Saad Farooq; 13.07.2018

Должен ли я изменить IP-адреса (на какие)?

Да, обычно это способ заставить все работать на виртуальных машинах, где маршрут по умолчанию предназначен для доступа к Интернету через NAT.

Вы хотите использовать IP-адрес мостовой сети, для вашего мастера это будет 192.168.100.17 (но, пожалуйста, проверьте еще раз).

Сначала попробуйте использовать kubeadm init --apiserver-advertise-address 192.168.100.17, но это может не решить все проблемы.

В вашем выводе kubectl describe nodes я вижу это

Addresses:
  InternalIP:  172.17.0.1
  Hostname:    ubuntu

Поэтому вы, вероятно, захотите убедиться, что kubelet также не использует интерфейс NAT, для которого вам нужно будет использовать флаг --node-ip kubelet.

Однако есть и другие способы решить эту проблему, например. если вы можете убедиться, что hostname -i возвращает IP-адрес мостового интерфейса (что вы можете сделать, настроив /etc/hosts).

person errordeveloper    schedule 28.02.2018
comment
Спасибо. Как и где я могу установить флаг --node-ip для kubelet? - person Saad Farooq; 28.02.2018
comment
Для этого вам понадобится модуль systemd drop-in. - person errordeveloper; 28.02.2018
comment
Извините, я немного новичок в этом, можете ли вы указать какой-либо ресурс с дополнительными указаниями? Как использовать модуль systemd drop-in? - person Saad Farooq; 28.02.2018
comment
Общие сведения о встраиваемых модулях systemd см. здесь и здесь — один из общих вариантов использования Это. Чтобы получить информацию о kubeadm, посмотрите здесь. - person errordeveloper; 28.02.2018
comment
По сути, вы можете отредактировать /etc/systemd/system/kubelet.service.d/10-kubeadm.conf или добавить /etc/systemd/system/kubelet.service.d/05-node-ip.conf, где вы можете определить Environment="KUBELET_EXTRA_ARGS=--node-ip=<ipaddr>", но не забудьте запустить systemctl daemon-reload && systemctl restart kubelet, чтобы эти изменения вступили в силу. - person errordeveloper; 28.02.2018
comment
Этот подход легко попробовать, чтобы определить, связана ли проблема с IP-адресом... однако я бы рекомендовал настроить /etc/hosts, чтобы указать hostname -i на IP-адрес мостового интерфейса. - person errordeveloper; 28.02.2018
comment
Я попробовал все предложенные шаги, но результат все тот же. Я обновил вопрос с журналами после применения шагов. Что мне не хватает? - person Saad Farooq; 02.03.2018