Как отладить приложение kubectl для kube-flannel.yml?

Я пытаюсь создать кластер кубернетов, следуя документу по адресу: https://kubernetes.io/docs/setup/independent/create-cluster-kubeadm/

Сначала я установил kubeadm с изображением докера на Coreos (1520.9.0) внутри VirtualBox с Vagrant:

docker run -it \
    -v /etc:/rootfs/etc \
    -v /opt:/rootfs/opt \
    -v /usr/bin:/rootfs/usr/bin \
    -e K8S_VERSION=v1.8.4 \
    -e CNI_RELEASE=v0.6.0 \
    xakra/kubeadm-installer:0.4.7 coreos

Это был мой kubeadm init:

kubeadm init --pod-network-cidr=10.244.0.0/16

При запуске команды:

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/v0.9.1/Documentation/kube-flannel.yml

Он возвращает:

clusterrole "flannel" configured
clusterrolebinding "flannel" configured
serviceaccount "flannel" configured
configmap "kube-flannel-cfg" configured
daemonset "kube-flannel-ds" configured

Но если я отмечу "kubectl get pods --all-namespaces"

Он возвращает:

NAMESPACE     NAME                              READY     STATUS             RESTARTS   AGE
kube-system   etcd-coreos1                      1/1       Running            0          18m
kube-system   kube-apiserver-coreos1            1/1       Running            0          18m
kube-system   kube-controller-manager-coreos1   0/1       CrashLoopBackOff   8          19m
kube-system   kube-scheduler-coreos1            1/1       Running            0          18m

С journalctl -f -u kubelet я вижу эту ошибку: Unable to update cni config: No networks found in /etc/cni/net.d

Подозреваю, что что-то не так с командой kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/v0.9.1/Documentation/kube-flannel.yml

Есть ли способ узнать, почему эта команда не работает? Могу ли я получить журналы откуда угодно?


person TlmaK0    schedule 05.12.2017    source источник
comment
привет, вы можете перечислить файлы в данном каталоге /etc/cni/net.d?   -  person Suresh Vishnoi    schedule 05.12.2017
comment
привет, в этом каталоге ничего нет   -  person TlmaK0    schedule 06.12.2017
comment
Насколько я понимаю, в этот каталог нужно поместить файл манифеста kube-flannerl.yml. Kubelet развернет его   -  person Suresh Vishnoi    schedule 06.12.2017
comment
Я думаю, здесь должна быть конфигурация сети, предоставленная flannel yml   -  person TlmaK0    schedule 06.12.2017
comment
да, вы можете попробовать поместить этот фланелевый yaml-файл в этот каталог, надеюсь, он сработает   -  person Suresh Vishnoi    schedule 06.12.2017
comment
Нет, фланелевый манифест не следует помещать в этот каталог. То, что вы сделали, правильно (применить kubectl). Этот каталог должен содержать файл конфигурации CNI, который определяет подсеть для текущего узла. Этот файл должен быть создан автоматически. Я предполагаю, что вы забыли указать подсеть при запуске kubeadm init. Не могли бы вы назвать точную команду, которую вы использовали?   -  person whites11    schedule 08.12.2017
comment
спасибо @ whites11, я сделал kubeadm init --pod-network-cidr=10.244.0.0/16   -  person TlmaK0    schedule 08.12.2017
comment
Убедитесь, что ваш kubelet использует cni в качестве сетевого плагина. Попробуйте с ps -afe | grep kubelet   -  person whites11    schedule 08.12.2017
comment
Я так думаю kubelet --kubeconfig=/etc/kubernetes/kubelet.conf --require-kubeconfig=true --pod-manifest-path=/etc/kubernetes/manifests --allow-privileged=true --network-plugin=cni --cni-conf-dir=/etc/cni/net.d --cni-bin-dir=/opt/cni/bin --cluster-dns=10.96.0.10 --cluster-domain=cluster.local --fail-swap-on=false   -  person TlmaK0    schedule 08.12.2017


Ответы (1)


Буквально сегодня вечером я использовал kubespray, чтобы подготовить бродячий кластер на CoreOS, используя фланель (vxlan ), и я также был озадачен тем, как фланель может быть подом внутри Kubernetes.

Оказывается, , как видно здесь, что они используют flannel-cni изображение от для записи файлов CNI с помощью фланелевой коляски и креплений для томов hostDir; он выводит cni-conf.json (который настраивает CNI на использование фланели), а затем net-conf.json (который настраивает подсеть и серверную часть, используемые фланелью).

Я надеюсь, что синтаксис усов jinja2 не запутывает ответ, но мне было очень интересно посмотреть, как ребята из Kubernetes решили сделать это «по-настоящему» для сравнения и сравнения с примером DaemonSet, приведенным в README flannel-cni. Я предполагаю, что это длинный способ сказать: попробуйте дескрипторы в README flannel-cni, а затем, если это не сработает, посмотрите, отличаются ли они чем-то от заведомо работающей установки kubespray

update: в качестве конкретного примера обратите внимание, что yaml с документацией не включает _ 4_, и если ваша настройка Vagrant использует как NAT, так и" private_network ", то это, вероятно, означает, что фланель привязана к eth0 (NAT) а не eth1 с более статическим IP. Я видел это предостережение, упомянутое в документации, но не могу сразу вспомнить, где его цитировать.

обновление 2

Есть ли способ узнать, почему эта команда не работает? Могу ли я получить журналы откуда угодно?

Почти всегда можно получить доступ к журналам модуля (даже к статически определенному, например kube-controller-manager-coreos1) одним и тем же способом: kubectl --namespace=kube-system logs kube-controller-manager-coreos1, а в случае CrashLoopBackOff добавление -p для "-p" предыдущее покажет журналы из наиболее недавний сбой (но только на несколько секунд, а не на неопределенный срок), и иногда kubectl --namespace=kube-system describe pod kube-controller-manager-coreos1 будет отображать полезную информацию либо в разделе «События» внизу, либо в блоке «Статус» вверху, если он был прекращен по причине

В случае очень серьезного сбоя, например, когда apiserver не запускается (и, таким образом, kubectl logs ничего не будет делать), затем отправьте ssh-соединение на узел и используйте смесь journalctl -u kubelet.service --no-pager --lines=150 и docker logs ${the_sha_or_name}, чтобы попытаться увидеть любой текст ошибки. . В последнем случае вам почти наверняка понадобится docker ps -a, чтобы найти sha или имя завершенного контейнера, но то же самое «только на несколько секунд» также применимо, поскольку мертвые контейнеры будут удалены через некоторое время.

В случае с бродягой можно подключиться к виртуальной машине по ssh одним из нескольких способов:

  • vagrant ssh coreos1
  • vagrant ssh-config > ssh-config && ssh -F ssh-config coreos1
  • или если у него есть адрес "частной_сети", например 192.168.99.101 или другой, то обычно вы можете ssh -i ~/.vagrant.d/insecure_private_key [email protected], но один из первых двух почти всегда более удобен
person mdaniel    schedule 09.12.2017
comment
Спасибо @Matthew, kubectl --namespace=kube-system describe pod kube-controller-manager-coreos1 выдает ошибку: mkdir /usr/libexec/kubernetes: read-only file system. Я думаю, это связано с ошибкой kubeadmin github.com/kubernetes/kubeadm/issues/410 и исправлено в кубернетах github.com/kubernetes/kubernetes/pull/51296 - person TlmaK0; 13.12.2017