Рейтинг:2

archlinux: kubernetes — coredns не работает должным образом

флаг in

я установил кубернет v1.23.0 с Arch Linux в качестве дистрибутива. Кластер состоит из мастера и узла. Стендовые системы представляют собой виртуальные машины на базе KVM.

Когда модуль хочет сделать DNS-запрос, он получает тайм-аут, когда служба перенаправляет запросы экземпляру модуля coredns, работающему на другом узле kubernetes.

Поэтому я подозреваю, что сетевой провайдер не работает должным образом или некоторые настройки (модули ядра, sysctl, ect) не установлены, потому что, когда запрос перенаправляется на локально работающий экземпляр модуля coredns, клиент получает ответ. Вот мои шаги отладки:

  1. Прежде чем приступить к отладке, я увеличил уровень логирования coredns, добавив журнал в configmap coredns.
# kubectl get -n kube-system configmaps coredns -o yaml
апиВерсия: v1
данные:
  Основной файл: |
    .:53 {
        журнал
        ошибки
        здоровье {
           ламедук 5s
        }
        готовы
        kubernetes cluster.local in-addr.arpa ip6.arpa {
           капсулы небезопасны
           через in-addr.arpa ip6.arpa
           ттл 30
        }
        прометей :9153
        вперед . /etc/resolv.conf {
           max_concurrent 1000
        }
        кеш 30
        петля
        перезагрузить
        баланс нагрузки
    }
  1. Я развернул в качестве среды отладки свой сетевой контейнер с сетевыми инструментами, такими как копать землю, нслукап и так далее для тестирования различных экземпляров coredns.
kubectl применить -f https://raw.githubusercontent.com/volker-raschek/network-tools/master/network-tools.yml
  1. Доступны следующие модули и сервис coredns:
kubectl get pod,service -n kube-system -l k8s-app=kube-dns -o wide
НАЗВАНИЕ ГОТОВНОСТЬ СТАТУС ПЕРЕЗАПУСКИ ВОЗРАСТ IP УЗЛА НАЗНАЧЕННЫЙ УЗЕЛ ГОТОВНОСТЬ ВОРОТА
pod/coredns-64897985d-cgxmv 1/1 Работает 0 24 часа 10.85.0.4 archlinux-x86-64-000 <нет> <нет>
pod/coredns-64897985d-l9ftl 1/1 Работает 0 24 часа 10.85.0.3 archlinux-x86-64-001 <none> <none>

НАЗВАНИЕ ТИП КЛАСТЕР-IP ВНЕШНИЙ-IP ПОРТ(Ы) ВЫБОР ВОЗРАСТА
service/kube-dns ClusterIP 10.96.0.10 <нет> 53/UDP,53/TCP,9153/TCP 24h k8s-app=kube-dns
  1. Выполнить оболочку в моем сетевом модуле и попытаться запросить IP-адрес google.com через сердцевина оказание услуг. На то, чтобы распознать команду, уходит разное время. К сожалению, мне не удалось воспроизвести ошибку тайм-аута через сервис:
# kubectl exec network-tools -- время копать A google.com @10.96.0.10 +short
142.250.185.238
реальное 0м 5.02с
пользователь 0м 0.02с
система 0м 0.00с
# kubectl exec network-tools -- время копать A google.com @10.96.0.10 +short
142.250.185.238
реальное 0м 0.03с
пользователь 0м 0.01с
система 0м 0.00с
# kubectl exec network-tools -- время копать A google.com @10.96.0.10 +short
142.250.185.238
реальное 0м 10.03с
пользователь 0м 0.01с
система 0м 0.01с
  1. Теперь я ограничиваю запрос разными модулями coredns. Обратите внимание, что стручок coredns-64897985d-cgxmv с IP 10.85.0.4 работает на другом узле.

pod/coredns-64897985d-l9ftl / 10.85.0.3

kubectl exec network-tools -- время копать A google.com @10.85.0.3 +short
142.251.36.206
реальное 0м 0.09с
пользователь 0м 0.00с
система 0м 0.01с

pod/coredns-64897985d-cgxmv / 10.85.0.4

Вот ошибка тайм-аута при явном использовании сердцевина pod другого узла.

# kubectl exec network-tools -- время копать A google.com @10.85.0.4 +short

; <<>> DiG 9.16.20 <<>> A google.com @10.85.0.4 +короткий
;; глобальные параметры: +cmd
;; время соединения истекло; нет доступа к серверам

Команда завершилась с ненулевым статусом 9
реальное 0м 15.02с
пользователь 0м 0.02с
система 0м 0.00с
команда завершена с кодом выхода 9
  1. Следующие журналы были написаны сердцевина стручки:

pod/coredns-64897985d-l9ftl / 10.85.0.3

# журналы kubectl -n kube-system coredns-64897985d-l9ftl 
.:53
[INFO] плагин/перезагрузка: рабочая конфигурация MD5 = db32ca3650231d74073ff4cf814959a7
CoreDNS-1.8.6
Linux/AMD64, Go1.17.1, 13a9191
[ИНФО] Перезагрузка
[INFO] Плагин/здоровье: Переход в режим lameduck на 5 секунд
[INFO] плагин/перезагрузка: рабочая конфигурация MD5 = 3d3f6363f05ccd60e0f885f0eca6c5ff
[INFO] Перезагрузка завершена
[INFO] 127.0.0.1:54962 - 9983 "HINFO IN 4683476401105705616.5032820535498752139. udp 57 false 512" NXDOMAIN qr,rd,ra 132 0.058383302s
[INFO] 10.85.0.1:24999 - 26748 "A IN google.com. udp 51 false 4096" NOERROR qr,rd,ra 1549 0.070006969s
[INFO] 10.85.0.1:6142 - 9467 "A IN google.com. udp 51 false 4096" NOERROR qr,aa,rd,ra 1549 0.000959536s
[INFO] 10.85.0.1:2544 - 20425 "A IN google.com. udp 51 false 4096" NOERROR qr,aa,rd,ra 1549 0.00065977s
[INFO] 10.85.0.1:26782 - 372 "A IN google.com. udp 51 false 4096" NOERROR qr,aa,rd,ra 1549 0.001292768s
[INFO] 10.85.0.1:62687 - 27302 "A IN google.com. udp 51 false 4096" 
...

pod/coredns-64897985d-cgxmv / 10.85.0.4

# журналы kubectl -n kube-system coredns-64897985d-cgxmv
.:53
[INFO] плагин/перезагрузка: рабочая конфигурация MD5 = db32ca3650231d74073ff4cf814959a7
CoreDNS-1.8.6
Linux/AMD64, Go1.17.1, 13a9191
[ИНФО] Перезагрузка
[INFO] Плагин/здоровье: Переход в режим lameduck на 5 секунд
[INFO] плагин/перезагрузка: рабочая конфигурация MD5 = 3d3f6363f05ccd60e0f885f0eca6c5ff
[INFO] Перезагрузка завершена

Чтобы сузить проблему, я переустановил свой кластер через ansible и установил calico вместо flannel с помощью приведенной ниже команды. Там такая же проблема.

$ helm install calico projectcalico/tigera-operator --version v3.21.3

я использовал руководство по установке kubeadm для инициализации кластера. Я выполнил следующее инициализация кубеадмина команда для инициализации кластера:

$ кубеадм инициализация \
  --apiserver-рекламный-адрес=192.168.179.101 \
  --apiserver-cert-extra-sans=api.example.com \
  --control-plane-endpoint=192.168.179.100 \
  --cri-socket=unix:///var/run/crio/crio.sock \
  --pod-network-cidr=10.244.0.0/16 \
  --upload-сертификаты

Модуль ядра br_netfilter и свойства sysctl определены, но проблема все еще существует. Я нахожусь в конце своих подходов к решению и нуждаюсь в совете экспертов здесь. Ниже приведен список моих модулей ядра, настройки sysctl и другая информация.

Я надеюсь, что кто-то может мне помочь.

информация о ядре

$ uname -a
Linux archlinux-x86-64-000 5.10.90-1-lts #1 SMP Wed, 05 Jan 2022 13:07:40 +0000 x86_64 GNU/Linux

модули ядра

$ lsmod | Сортировать
ac97_bus 16384 1 snd_soc_core
aesni_intel 372736 0
agpgart 53248 4 intel_agp, intel_gtt, ttm, drm
atkbd 36864 0
bpf_preload 16384 0
мост 274432 1 br_netfilter
br_netfilter 32768 0
cec 61440 1 drm_kms_helper
cfg80211 983040 0
crc16 16384 1 доб4
crc32c_generic 16384 0
crc32c_intel 24576 3
crc32_pclmul 16384 0
crct10dif_pclmul 16384 1
cryptd 24576 2 crypto_simd,gash_clmulni_intel
crypto_simd 16384 1 aesni_intel
drm 577536 5 drm_kms_helper, qxl, drm_ttm_helper, ttm
drm_kms_helper 278528 3 qxl
drm_ttm_helper 16384 1 qxl
доб4 933888 1
отказоустойчивость 16384 1 net_failover
жир 86016 1 жир
fb_sys_fops 16384 1 drm_kms_helper
предохранитель 167936 1
ghash_clmulni_intel 16384 0
клей_хелпер 16384 1
i2c_i801 36864 0
i2c_smbus 20480 1 i2c_i801
i8042 36864 0
intel_agp 24576 0
intel_gtt 24576 1 intel_agp
intel_pmc_bxt 16384 1 iTCO_wdt
intel_rapl_common 28672 1 intel_rapl_msr
intel_rapl_msr 20480 0
ip6_udp_tunnel 16384 1 vxlan
ip_set 57344 0
ip_tables 32768 0
ipt_REJECT 16384 0
ip_vs 184320 6 ip_vs_rr, ip_vs_sh, ip_vs_wrr
ip_vs_rr 16384 0
ip_vs_sh 16384 0
ip_vs_wrr 16384 0
irqbypass 16384 1 квм
iTCO_vendor_support 16384 1 iTCO_wdt
iTCO_wdt 16384 0
jbd2 151552 1 доб4
джойдев 28672 0
квм 933888 1 квм_интел
kvm_intel 331776 0
ledtrig_audio 16384 1 snd_hda_codec_generic
libcrc32c 16384 4 nf_conntrack, nf_nat, nf_tables, ip_vs
libps2 20480 2 atkbd,psmouse
ооо 16384 2 мост,стп
lpc_ich 28672 0
mac_hid 16384 0
mbcache 16384 1 ext4
Размер модуля, используемый
мышьдев 24576 0
net_failover 24576 1 virtio_net
nf_conntrack 172032 6 xt_conntrack, nf_nat, xt_nat, nf_conntrack_netlink, xt_MASQUERADE, ip_vs
nf_conntrack_netlink 57344 0
nf_defrag_ipv4 16384 1 nf_conntrack
nf_defrag_ipv6 24576 2 nf_conntrack,ip_vs
nf_nat 57344 3 xt_nat, nft_chain_nat, xt_MASQUERADE
nfnetlink 20480 4 nft_compat, nf_conntrack_netlink, nf_tables, ip_set
nf_reject_ipv4 16384 1 ipt_REJECT
nf_tables 249856 183 nft_compat, nft_counter, nft_chain_nat
nft_chain_nat 16384 7
nft_compat 20480 122
nft_counter 16384 84
nls_iso8859_1 16384 0
накладка 147456 18
шт ₽ 16384 0
psmouse 184320 0
qemu_fw_cfg 20480 0
qxl 73728 0
рапл 16384 0
рфкилл 28672 2 cfg80211
rng_core 16384 1 virtio_rng
серия 28672 6 serio_raw, atkbd, psmouse, i8042
serio_raw 20480 0
snd 114688 8 snd_hda_codec_generic, snd_hwdep, snd_hda_intel, snd_hda_codec, snd_timer, snd_compress, snd_soc_core, snd_pcm
snd_compress 32768 1 snd_soc_core
snd_hda_codec 172032 2 snd_hda_codec_generic,snd_hda_intel
snd_hda_codec_generic 98304 1
snd_hda_core 110592 3 snd_hda_codec_generic,snd_hda_intel,snd_hda_codec
snd_hda_intel 57344 0
snd_hwdep 16384 1 snd_hda_codec
snd_intel_dspcfg 28672 1 snd_hda_intel
snd_pcm 147456 7 snd_hda_intel,snd_hda_codec,soundwire_intel,snd_compress,snd_soc_core,snd_hda_core,snd_pcm_dmaengine
snd_pcm_dmaengine 16384 1 snd_soc_core
snd_soc_core 327680 1 soundwire_intel
snd_timer 49152 1 snd_pcm
саундкор 16384 1 снд
soundwire_bus 90112 3 soundwire_intel, soundwire_generic_allocation, soundwire_cadence
soundwire_cadence 36864 1 soundwire_intel
soundwire_generic_allocation 16384 1 soundwire_intel
soundwire_intel 45056 1 snd_intel_dspcfg
стп 16384 1 мост
syscopyarea 16384 1 drm_kms_helper
sysfillrect 16384 1 drm_kms_helper
sysimgblt 16384 1 drm_kms_helper
ттм 114688 2 qxl,drm_ttm_helper
udp_tunnel 20480 1 vxlan
USBHID 65536 0
вет 32768 0
вфат 24576 0
virtio_balloon 24576 0
virtio_blk 20480 2
virtio_console 40960 0
virtio_net 61440 0
virtio_pci 28672 0
virtio_rng 16384 0
вкслан 77824 0
xhci_pci 20480 0
xhci_pci_renesas 20480 1 xhci_pci
x_tables 53248 11 xt_conntrack,xt_statistic,nft_compat,xt_tcpudp,xt_addrtype,xt_nat,xt_comment,ipt_REJECT,ip_tables,xt_MASQUERADE,xt_mark
xt_addrtype 16384 2
xt_comment 16384 64
xt_conntrack 16384 13
xt_mark 16384 12
xt_MASQUERADE 20480 6
xt_nat 16384 7
xt_statistic 16384 3
xt_tcpudp 20480 15

sysctl

свойства sysctl на мусорное ведро. Превышено максимальное количество символов для ошибки сервера.

Mikolaj S. avatar
флаг cn
Не могли бы вы уточнить это -> «Когда модуль хочет сделать DNS-запрос к coredns, он получает тайм-аут, когда служба перенаправляет запросы внешнему экземпляру модуля coredns». Как вы делаете DNS-запрос к CoreDNS? Откуда вы знаете, что он получает тайм-аут? Не могли бы вы проверить журналы модулей CoreDNS (`kubectl logs --namespace=kube-system -l k8s-app=kube-dns`)?
Volker Raschek avatar
флаг in
@МиколайС. я изменил описание проблемы и добавил дополнительную информацию
Mikolaj S. avatar
флаг cn
Не могли бы вы поделиться флагами, которые вы использовали для команды `kubeadm init`? В частности, вы использовали флаг `--pod-network-cidr`? Как вы устанавливали Calico CNI - возможных решений немного, какое из них вы использовали? Вы также указали правильный [pod CIDR для Calico] (https://projectcalico.docs.tigera.io/getting-started/kubernetes/self-managed-onprem/onpremises#install-calico-on-nodes)?
Volker Raschek avatar
флаг in
Привет @MikolajS., я снова изменил описание и добавил команду `kubeadm init`. Да, я использовал флаг --pod-network-cidr и установил calico через helm. В values.yaml не было внесено никаких изменений, а переменная среды CALICO_IPV4POOL_CIDR не определена.
Volker Raschek avatar
флаг in
Чтобы установить kubernetes, пакет iptables нужно было [заменить] (https://github.com/archlinux/svntogit-community/blob/packages/kubernetes/trunk/PKGBUILD#L14) на iptables-nft. . Изменение, возможно, не вызвало ограничений? Я нашел следующий пост об отключении модуля iptables. https://mihail-milev.medium.com/no-pod-to-pod-communication-on-centos-8-kubernetes-with-calico-56d694d2a6f4
Mikolaj S. avatar
флаг cn
Спасибо за всю информацию, я попытаюсь воспроизвести вашу проблему и проверить, что можно сделать.
Mikolaj S. avatar
флаг cn
Вы проверили оба установленных `iptables` (я имею в виду устаревшую версию и версию nft)? Не могли бы вы запустить команду `iptables -v`?
Volker Raschek avatar
флаг in
Привет @MikolajS., я нашел решение, почему не работает calico и другие плагины cni. Вот обсуждение проблемы базовой среды выполнения крио https://github.com/cri-o/cri-o/issues/2885#issuecomment-1015732983.
Рейтинг:1
флаг cn

Публикация вики-ответа сообщества на основе темы GitHub - Файлы, включенные в CentOS RPM, мешают работе CNI и вики-страница ArchLinux - КРИО-О. Не стесняйтесь расширять его.


Проблема известна и описана в Вики ArchLinux:

Предупреждение: Arch устанавливает плагины, предоставленные cni-плагины как для /USR/библиотека/cni и /opt/cni/bin но большинство других плагинов (например, развертывание в кластере, плагины, управляемые kubelet и т. д.) по умолчанию устанавливаются только во второй каталог.

CRI-O настроен на поиск плагинов только в первом каталоге, поэтому любые плагины во втором каталоге недоступны без внесения некоторых изменений в конфигурацию.

Обходной путь представлен в этот пост пользователя bart0sh:

Я использую следующий обходной путь:

  • установить кри-о
  • удалить все из /etc/cni/net.d
  • узел настройки с kubeadm
  • установить плагин cni (волна, фланель, бязь и т. д.)

и дополнительная конфигурация предоставлена ​​пользователем volker-raschek:

Помимо конфигураций CNI под /etc/cni/net.d, расширение plugin_dirs имущество пропало в крио.конф конфигурации, потому что крио кажется, не заглядывает /опт/cni для развернутых плагинов по умолчанию. Я создал файл drop-in.

$ cat /etc/crio/crio.conf.d/00-plugin-dir.conf
[crio.network]
plugin_dirs = [
 "/опт/cni/bin/",
 "/usr/lib/cni",
]

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.