Squeak.ru - шаблоны программирования

Модули Kubernetes coredns застряли в состоянии ожидания. Не удается запустить панель управления

Я создаю кластер Kubernetes, следуя этому руководству, и У меня проблемы с доступом к панели управления Kubernetes. Я уже создал еще один вопрос по этому поводу, который вы можете увидеть здесь, но пока копаете в моем кластере, я думаю, что проблема может быть где-то еще, и поэтому я создаю новый вопрос.

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

> kubeadm reset 
> kubeadm init --apiserver-advertise-address=[MASTER_IP] > file.txt
> tail -2 file.txt > join.sh # I keep this file for later

> kubectl apply -f https://git.io/weave-kube/

> kubectl -n kube-system get pod
NAME                                READY   STATUS  RESTARTS    AGE
coredns-fb8b8dccf-kb2zq             0/1     Pending 0           2m46s
coredns-fb8b8dccf-nnc5n             0/1     Pending 0           2m46s
etcd-kubemaster                     1/1     Running 0           93s
kube-apiserver-kubemaster           1/1     Running 0           93s
kube-controller-manager-kubemaster  1/1     Running 0           113s
kube-proxy-lxhvs                    1/1     Running 0           2m46s
kube-scheduler-kubemaster           1/1     Running 0           93s

Здесь мы видим, что у меня два coredns модуля застряли в состоянии ожидания навсегда, и когда я запускаю команду:

> kubectl -n kube-system describe pod coredns-fb8b8dccf-kb2zq

В разделе «События» я вижу следующее предупреждение:

Failed Scheduling : 0/1 nodes are available 1 node(s) had taints that the pod didn't tolerate.

Поскольку это предупреждение, а не ошибка, и что для меня как новичка в Kubernetes taints не имеет большого значения, я попытался подключить узел к мастеру (используя ранее сохраненную команду):

> cat join.sh
kubeadm join [MASTER_IP]:6443 --token [TOKEN] \
    --discovery-token-ca-cert-hash sha256:[ANOTHER_TOKEN]

> ssh [USER]@[WORKER_IP] 'bash' < join.sh

This node has joined the cluster.

На мастере проверяю, что нода подключена:

> kubectl get nodes 
NAME        STATUS      ROLES   AGE     VERSION
kubemaster  NotReady    master  13m     v1.14.1
kubeslave1  NotReady    <none>  31s     v1.14.1

И проверяю свои капсулы:

> kubectl -n kube-system get pod
NAME                                READY   STATUS              RESTARTS    AGE
coredns-fb8b8dccf-kb2zq             0/1     Pending             0           14m
coredns-fb8b8dccf-nnc5n             0/1     Pending             0           14m
etcd-kubemaster                     1/1     Running             0           13m
kube-apiserver-kubemaster           1/1     Running             0           13m
kube-controller-manager-kubemaster  1/1     Running             0           13m
kube-proxy-lxhvs                    1/1     Running             0           14m
kube-proxy-xllx4                    0/1     ContainerCreating   0           2m16s
kube-scheduler-kubemaster           1/1     Running             0           13m

Мы видим, что был создан еще один модуль kube-proxy, который застрял в статусе ContainerCreating.

И когда я снова делаю описание:

kubectl -n kube-system describe pod kube-proxy-xllx4

В разделе «События» я вижу несколько одинаковых предупреждений:

Failed create pod sandbox : rpx error: code = Unknown desc = failed pulling image "k8s.gcr.io/pause:3.1": Get https://k8s.gcr.io/v1/_ping: dial tcp: lookup k8s.gcr.io on [::1]:53 read up [::1]43133->[::1]:53: read: connection refused

Вот мои репозитории:

docker image ls
REPOSITORY                          TAG     
k8s.gcr.io/kube-proxy               v1.14.1 
k8s.gcr.io/kube-apiserver           v1.14.1 
k8s.gcr.io/kube-controller-manager  v1.14.1 
k8s.gcr.io/kube-scheduler           v1.14.1 
k8s.gcr.io/coredns                  1.3.1   
k8s.gcr.io/etcd                     3.3.10  
k8s.gcr.io/pause                    3.1 

Итак, что касается дашборда, я попытался запустить его с помощью команды

> kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/master/aio/deploy/recommended/kubernetes-dashboard.yaml

Но модуль панели мониторинга застрял в состоянии ожидания.

kubectl -n kube-system get pod
NAME                                    READY   STATUS              RESTARTS    AGE
coredns-fb8b8dccf-kb2zq                 0/1     Pending             0           40m
coredns-fb8b8dccf-nnc5n                 0/1     Pending             0           40m
etcd-kubemaster                         1/1     Running             0           38m
kube-apiserver-kubemaster               1/1     Running             0           38m
kube-controller-manager-kubemaster      1/1     Running             0           39m
kube-proxy-lxhvs                        1/1     Running             0           40m
kube-proxy-xllx4                        0/1     ContainerCreating   0           27m
kube-scheduler-kubemaster               1/1     Running             0           38m
kubernetes-dashboard-5f7b999d65-qn8qn   1/1     Pending             0           8s

Итак, хотя изначально моя проблема заключалась в том, что я не могу получить доступ к своей панели инструментов, я предполагаю, что настоящая проблема глубже, чем это.

Я знаю, что просто поместил здесь много информации, но я новичок в k8s и совершенно не понимаю этого.

10.04.2019

Ответы:


1

У меня возникла проблема с coredns модулями, застрявшими в режиме ожидания при настройке собственного кластера; который я решаю, добавляя сеть стручков.

Похоже, что из-за того, что сетевой аддон не установлен, узлы помечены как not-ready. Установка аддона удалит загрязнения, и модули смогут планировать. В моем случае добавление фланели устранило проблему.

РЕДАКТИРОВАТЬ: есть примечание об этом в официальной документации k8s - Создайте кластер с помощью kubeadm:

Сеть должна быть развернута перед любыми приложениями. Кроме того, CoreDNS не запустится до установки сети. kubeadm поддерживает только сети на основе сетевого интерфейса контейнера (CNI) (и не поддерживает kubenet).

10.04.2019
  • Разве не для этого нужен kubectl apply -f https://git.io/weave-kube/? 10.04.2019
  • Я заменил предыдущую команду на kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')", и теперь в моих стручках появляется weave-net. И с тех пор мои стручки coredns волшебным образом начали работать (как вы сказали :)) 10.04.2019
  • это зависит от того, как вы собираетесь установить свой pod-network. Рад, что мне помогли 10.04.2019

  • 2

    На самом деле это противоположность глубокой или серьезной проблемы. Это банальный вопрос. Всегда вы видите, что модуль застрял в состоянии Pending, это означает, что планировщику сложно запланировать модуль; в основном потому, что на узле недостаточно ресурсов.

    В вашем случае это taint, у которого есть узел, а у вашего модуля нет допуска. Что вам нужно сделать, так это описать узел и получить заражение:

    kubectl describe node | grep -i taints
    

    Примечание: у вас может быть несколько заражений. Так что вы можете захотеть сделать kubectl describe no NODE, так как с grep вы увидите только одно пятно.

    Как только вы получите заражение, это будет что-то вроде hello=world:NoSchedule; что означает key=value:effect, вам нужно будет добавить раздел toleration в свой Deployment. Это пример Deployment, поэтому вы можете увидеть, как он должен выглядеть:

    apiVersion: extensions/v1beta1
    kind: Deployment
    metadata:
      name: nginx
      labels:
        app: nginx
    spec:
      replicas: 10
      strategy:
        type: Recreate
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - image: nginx
            name: nginx
            ports:
            - containerPort: 80
              name: http
          tolerations:
          - effect: NoExecute       #NoSchedule, PreferNoSchedule
            key: node
            operator: Equal
            value: not-ready
            tolerationSeconds: 3600
    

    Как видите, в yaml есть раздел о допустимости. Итак, если бы у меня был узел с node=not-ready:NoExecute taint, ни один модуль не мог бы быть запланирован на этом узле, если бы не было этого допуска.

    Также вы можете удалить taint, если он вам не нужен. Чтобы удалить taint, вы должны описать узел, получить key заражения и выполнить:

    kubectl taint node NODE key-
    

    Надеюсь, это имеет смысл. Просто добавьте этот раздел в свое развертывание, и он будет работать.

    10.04.2019
  • Спасибо за Ваш ответ ! На моем узле kubemaster у меня есть следующие порчи: node.kubernetes.io/not-ready:NoExecute, node-role.kubernetes.io/master:NoSchedule, node.kubernetes.io/not-ready:NoSchedule. Я не понимаю, что я выполнил только команду kubeadm init --apiserver-advertise-address=[MASTER_IP]. На данный момент у меня нет файла YAML. Мне нужно создать новый файл развертывания? 10.04.2019
  • Да, в этих порчах есть смысл. Это необходимо для обеспечения того, чтобы ни один модуль не запускался на главном узле (если он не предназначен), и ни один модуль не должен запускаться на узле с определенными проблемами (не готовый узел). Просто добавьте допуски, как описано в ваших развертываниях (например, core-dns), и все должно работать. P.S. ваша проблема не имеет ничего общего с сетевыми плагинами. По крайней мере, тот, который вы описываете. 10.04.2019
  • Что ж, на самом деле моя база данных застряла в ожидании с предупреждением о недопустимых загрязнениях, и как только я правильно запустил сетевой плагин, статус ядра перейдет в состояние Работает. Не знаю, имеет ли это смысл, но вот что произошло. 10.04.2019
  • Для меня это не имеет никакого смысла. Если только ваш узел не был помечен как not-ready из-за того, что плагин не был установлен. В этом случае заражение будет удалено, когда узел будет готов. Если вы запустите kubectl describe node NODE, у вас останутся порчи? 10.04.2019
  • Теперь у меня только зараза node-role.kubernetes.io/master:NoSchedule 10.04.2019
  • Для меня это имеет смысл. Узел был динамически заражен. 10.04.2019

  • 3

    Настройте инструмент фланелевой сети.

    Запускаемые команды:

    $ sysctl net.bridge.bridge-nf-call-iptables=1
    $ kubectl apply -f 
    

    https://raw.githubusercontent.com/coreos/flannel/62e44c867a2846fefb68bd5f178daf4da3095ccb/Documentation/kube-flannel.yml

    03.06.2019
    Новые материалы

    Угловая структура архитектуры
    Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

    «Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
    Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

    Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
    В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

    Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
    React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

    Создайте API с помощью Python FastAPI
    Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

    Веселье с прокси-сервером JavaScript
    Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

    Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
    Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...