Како да се провери мрежата на Кубернетес


Вовед

Kubernetes е систем за оркестрација на контејнери кој може да управува со контејнеризирани апликации низ кластер на серверски јазли. Одржувањето на мрежно поврзување помеѓу сите контејнери во кластерот бара некои напредни мрежни техники. Во оваа статија, накратко ќе покриеме некои алатки и техники за проверка на оваа мрежна поставка.

Овие алатки може да бидат корисни ако дебагирате проблеми со поврзувањето, истражувате проблеми со пропусната моќ на мрежата или го истражувате Kubernetes за да дознаете како функционира.

Ако сакате да дознаете повеќе за Kubernetes воопшто, нашиот водич Kubernetes Networking Under the Hood.

Започнување

Ова упатство ќе претпостави дека имате кластер Kubernetes, со kubectl инсталиран локално и конфигуриран да се поврзе со кластерот.

Следниве делови содржат многу команди кои се наменети да се извршуваат на јазол Kubernetes. Тие ќе изгледаат вака:

  1. echo 'this is a node command'

Наредбите што треба да се извршуваат на вашата локална машина ќе го имаат следниов изглед:

  1. echo 'this is a local command'

Забелешка: Повеќето од командите во ова упатство ќе треба да се извршуваат како root корисник. Ако наместо тоа, користите корисник со овозможен sudo на вашите Kubernetes јазли, ве молиме додадете sudo за да ги извршите командите кога е потребно.

Наоѓање IP на кластерот на Pod

За да ја пронајдете IP-адресата на кластерот на pod Kubernetes, користете ја командата kubectl get pod на вашата локална машина, со опцијата -o широк. Оваа опција ќе наведе повеќе информации, вклучувајќи го јазолот на кој се наоѓа подлогата и IP на кластерот на подлогата.

  1. kubectl get pod -o wide
Output
NAME READY STATUS RESTARTS AGE IP NODE hello-world-5b446dd74b-7c7pk 1/1 Running 0 22m 10.244.18.4 node-one hello-world-5b446dd74b-pxtzt 1/1 Running 0 22m 10.244.3.4 node-two

Колоната IP ќе ја содржи внатрешната IP адреса на кластерот за секој дел.

Ако не ја гледате подлогата што ја барате, проверете дали сте во вистинскиот именски простор. Можете да ги наведете сите места во сите именски простори со додавање на знамето --all-namespaces.

Наоѓање на IP на услугата

Можеме да најдеме ИП на услугата и користејќи kubectl. Во овој случај, ќе ги наведеме сите услуги во сите именски простори:

  1. kubectl get service --all-namespaces
Output
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE default kubernetes ClusterIP 10.32.0.1 <none> 443/TCP 6d kube-system csi-attacher-doplugin ClusterIP 10.32.159.128 <none> 12345/TCP 6d kube-system csi-provisioner-doplugin ClusterIP 10.32.61.61 <none> 12345/TCP 6d kube-system kube-dns ClusterIP 10.32.0.10 <none> 53/UDP,53/TCP 6d kube-system kubernetes-dashboard ClusterIP 10.32.226.209 <none> 443/TCP 6d

IP-а на услугата може да се најде во колоната КЛАСТЕР-ИП.

Наоѓање и внесување на именски простори на Pod Network

Секој Kubernetes pod добива свој сопствен мрежен именски простор. Мрежните именски простори (или мрежи) се мрежен примитив на Линукс кои обезбедуваат изолација помеѓу мрежните уреди.

Може да биде корисно да се извршуваат команди од мрежите на подлогата, да се провери резолуцијата на DNS или општото мрежно поврзување. За да го сториме тоа, прво треба да го побараме ID на процесот на еден од контејнерите во подлогата. За Docker, можеме да го направиме тоа со серија од две команди. Прво, наведете ги контејнерите што работат на јазол:

  1. docker ps
Output
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 173ee46a3926 gcr.io/google-samples/node-hello "/bin/sh -c 'node se…" 9 days ago Up 9 days k8s_hello-world_hello-world-5b446dd74b-pxtzt_default_386a9073-7e35-11e8-8a3d-bae97d2c1afd_0 11ad51cb72df k8s.gcr.io/pause-amd64:3.1 "/pause" 9 days ago Up 9 days k8s_POD_hello-world-5b446dd74b-pxtzt_default_386a9073-7e35-11e8-8a3d-bae97d2c1afd_0 . . .

Најдете го ID на контејнер или име на кој било контејнер во подлогата за која ве интересира. На горниот излез прикажуваме два контејнери:

  • Првиот контејнер е апликацијата hello-world што работи во подлогата hello-world
  • Вториот е контејнер пауза што работи во подлогата hello-world. Овој контејнер постои само за да се држи до мрежниот именски простор на подлогата

За да го добиете идентификаторот на процесот на кој било контејнер, забележете го идентификаторот или името на контејнерот и користете го во следнава команда docker:

  1. docker inspect --format '{{ .State.Pid }}' container-id-or-name
Output
14552

Ќе излезе процес ID (или PID). Сега можеме да ја користиме програмата nsenter за да извршиме команда во мрежниот именски простор на тој процес:

  1. nsenter -t your-container-pid -n ip addr

Погрижете се да користите сопствен PID и заменете го ip addr со командата што сакате да ја извршите во мрежниот именски простор на подлогата.

Забелешка: Една од предностите на користењето nsenter за извршување команди во именскиот простор на подлогата – наспроти користењето нешто како docker exec – е тоа што имате пристап до сите на командите достапни на јазолот, наместо типично ограничениот сет на команди инсталирани во контејнерите.

Наоѓање на виртуелен етернет интерфејс на Pod

Именскиот простор на мрежата на секој pod комуницира со коренските мрежи на јазолот преку виртуелна етернет цевка. На страната на јазолот, оваа цевка се појавува како уред кој обично започнува со veth и завршува во единствен идентификатор, како што се veth77f2275 или veth01. Внатре во подлогата оваа цевка се појавува како eth0.

Може да биде корисно да се поврзе кој уред veth е спарен со одредена подлога. За да го сториме тоа, ќе ги наведеме сите мрежни уреди на јазолот, а потоа ќе ги наведеме уредите во мрежниот именски простор на подлогата. Потоа можеме да ги поврземе броевите на уредите помеѓу двата огласи за да ја направиме врската.

Прво, стартувајте го ip addr во мрежниот именски простор на подлогата користејќи nsenter. Погледнете го претходниот дел Наоѓање и внесување на именски простори на Pod Network

  1. nsenter -t your-container-pid -n ip addr
Output
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever 10: eth0@if11: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP group default link/ether 02:42:0a:f4:03:04 brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet 10.244.3.4/24 brd 10.244.3.255 scope global eth0 valid_lft forever preferred_lft forever

Командата ќе издаде листа на интерфејси на подлогата. Забележете го бројот if11 после eth0@ во излезот од примерот. Ова значи дека eth0 на оваа подлога е поврзана со 11-тиот интерфејс на јазолот. Сега стартувајте ip addr во стандардниот именски простор на јазолот за да ги наведете неговите интерфејси:

  1. ip addr
Output
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever . . . 7: veth77f2275@if6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue master docker0 state UP group default link/ether 26:05:99:58:0d:b9 brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet6 fe80::2405:99ff:fe58:db9/64 scope link valid_lft forever preferred_lft forever 9: vethd36cef3@if8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue master docker0 state UP group default link/ether ae:05:21:a2:9a:2b brd ff:ff:ff:ff:ff:ff link-netnsid 1 inet6 fe80::ac05:21ff:fea2:9a2b/64 scope link valid_lft forever preferred_lft forever 11: veth4f7342d@if10: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue master docker0 state UP group default link/ether e6:4d:7b:6f:56:4c brd ff:ff:ff:ff:ff:ff link-netnsid 2 inet6 fe80::e44d:7bff:fe6f:564c/64 scope link valid_lft forever preferred_lft forever

11-тиот интерфејс е veth4f7342d во овој примерок излез. Ова е виртуелната етернет цевка до подлогата што ја истражуваме.

Проверка на Conntrack Connection Tracking

Пред верзијата 1.11, Kubernetes користеше iptables NAT и модулот conntrack кернелот за следење на врските. За да ги наведете сите врски што моментално се следат, користете ја командата conntrack:

  1. conntrack -L

За постојано да гледате нови врски, користете го знамето -E:

  1. conntrack -E

За да ги наведете конекциите следени со одредена целна адреса, користете го знамето -d:

  1. conntrack -L -d 10.32.0.1

Ако вашите јазли имаат проблеми со правење сигурни врски со услугите, можно е вашата табела за следење конекции е полна и нови врски се испуштаат. Ако е така, може да видите пораки како следнава во дневниците на вашиот систем:

Jul 12 15:32:11 worker-528 kernel: nf_conntrack: table full, dropping packet.

Има поставка sysctl за максимален број конекции за следење. Можете да ја наведете вашата моментална вредност со следнава команда:

  1. sysctl net.netfilter.nf_conntrack_max
Output
net.netfilter.nf_conntrack_max = 131072

За да поставите нова вредност, користете го знамето -w:

  1. sysctl -w net.netfilter.nf_conntrack_max=198000

За да ја направите оваа поставка трајна, додајте ја во датотеката sysctl.conf:

. . .
net.ipv4.netfilter.ip_conntrack_max = 198000

Инспекција на правилата на Iptables

Пред верзијата 1.11, Kubernetes користеше iptables NAT за имплементирање на виртуелен превод на IP и балансирање на оптоварување за сервисни IP-адреси.

За да ги фрлите сите правила на iptables на јазол, користете ја командата iptables-save:

  1. iptables-save

Бидејќи излезот може да биде долг, можеби ќе сакате да испратите цевка до датотека (iptables-save > output.txt) или пејџер (iptables-save | помалку) до повеќе лесно прегледајте ги правилата.

За да ги наведете само правилата NAT на услугата Kubernetes, користете ја командата iptables и знамето -L за да го одредите точниот синџир:

  1. iptables -t nat -L KUBE-SERVICES
Output
Chain KUBE-SERVICES (2 references) target prot opt source destination KUBE-SVC-TCOU7JCQXEZGVUNU udp -- anywhere 10.32.0.10 /* kube-system/kube-dns:dns cluster IP */ udp dpt:domain KUBE-SVC-ERIFXISQEP7F7OF4 tcp -- anywhere 10.32.0.10 /* kube-system/kube-dns:dns-tcp cluster IP */ tcp dpt:domain KUBE-SVC-XGLOHA7QRQ3V22RZ tcp -- anywhere 10.32.226.209 /* kube-system/kubernetes-dashboard: cluster IP */ tcp dpt:https . . .

Барање DNS на кластерот

Еден начин за отстранување грешки на вашата резолуција на DNS на кластерот е да распоредите контејнер за отстранување грешки со сите алатки што ви се потребни, а потоа користете kubectl за да извршите nslookup на него. Ова е опишано во официјалната документација на Кубернетес.

Друг начин за пребарување на кластерот DNS е користење dig и nsenter од јазол. Ако dig не е инсталиран, може да се инсталира со apt на дистрибуции на Linux базирани на Debian:

  1. apt install dnsutils

Прво, пронајдете ја IP-адресата на кластерот на услугата kube-dns:

  1. kubectl get service -n kube-system kube-dns
Output
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kube-dns ClusterIP 10.32.0.10 <none> 53/UDP,53/TCP 15d

IP-а на кластерот е означена погоре. Следно, ќе користиме nsenter за да извршиме dig во именскиот простор на контејнер. Погледнете го делот Наоѓање и внесување на именски простори на Pod Network за повеќе информации за ова:

  1. nsenter -t 14346 -n dig kubernetes.default.svc.cluster.local @10.32.0.10

Оваа команда dig го бара целото име на домен на услугата име на услуга.namespace.svc.cluster.local и ја спецификува IP-а на IP на услугата DNS на кластерот (@10.32.0.10).

Гледајќи ги деталите за IPVS

Почнувајќи од Kubernetes 1.11, kube-proxy може да конфигурира IPVS за да се справи со преводот на IP-адреси на виртуелна услуга во IP-адреси. Можете да ја наведете табелата за превод на IP со ipvsadm:

  1. ipvsadm -Ln
Output
IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 100.64.0.1:443 rr -> 178.128.226.86:443 Masq 1 0 0 TCP 100.64.0.10:53 rr -> 100.96.1.3:53 Masq 1 0 0 -> 100.96.1.4:53 Masq 1 0 0 UDP 100.64.0.10:53 rr -> 100.96.1.3:53 Masq 1 0 0 -> 100.96.1.4:53 Masq 1 0 0

За да прикажете една услуга IP, користете ја опцијата -t и наведете ја саканата IP адреса:

  1. ipvsadm -Ln -t 100.64.0.10:53
Output
Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 100.64.0.10:53 rr -> 100.96.1.3:53 Masq 1 0 0 -> 100.96.1.4:53 Masq 1 0 0

Заклучок

Во оваа статија разгледавме некои команди и техники за истражување и проверка на деталите за вмрежувањето на вашиот кластер Kubernetes. За повеќе информации за Kubernetes, погледнете ја официјалната документација на Kubernetes.