Како да се провери мрежата на Кубернетес
Вовед
Kubernetes е систем за оркестрација на контејнери кој може да управува со контејнеризирани апликации низ кластер на серверски јазли. Одржувањето на мрежно поврзување помеѓу сите контејнери во кластерот бара некои напредни мрежни техники. Во оваа статија, накратко ќе покриеме некои алатки и техники за проверка на оваа мрежна поставка.
Овие алатки може да бидат корисни ако дебагирате проблеми со поврзувањето, истражувате проблеми со пропусната моќ на мрежата или го истражувате Kubernetes за да дознаете како функционира.
Ако сакате да дознаете повеќе за Kubernetes воопшто, нашиот водич Kubernetes Networking Under the Hood.
Започнување
Ова упатство ќе претпостави дека имате кластер Kubernetes, со kubectl
инсталиран локално и конфигуриран да се поврзе со кластерот.
Следниве делови содржат многу команди кои се наменети да се извршуваат на јазол Kubernetes. Тие ќе изгледаат вака:
- echo 'this is a node command'
Наредбите што треба да се извршуваат на вашата локална машина ќе го имаат следниов изглед:
- echo 'this is a local command'
Забелешка: Повеќето од командите во ова упатство ќе треба да се извршуваат како root корисник. Ако наместо тоа, користите корисник со овозможен sudo на вашите Kubernetes јазли, ве молиме додадете sudo
за да ги извршите командите кога е потребно.
Наоѓање IP на кластерот на Pod
За да ја пронајдете IP-адресата на кластерот на pod Kubernetes, користете ја командата kubectl get pod
на вашата локална машина, со опцијата -o широк
. Оваа опција ќе наведе повеќе информации, вклучувајќи го јазолот на кој се наоѓа подлогата и IP на кластерот на подлогата.
- kubectl get pod -o wide
OutputNAME 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
. Во овој случај, ќе ги наведеме сите услуги во сите именски простори:
- kubectl get service --all-namespaces
OutputNAMESPACE 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, можеме да го направиме тоа со серија од две команди. Прво, наведете ги контејнерите што работат на јазол:
- docker ps
OutputCONTAINER 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
:
- docker inspect --format '{{ .State.Pid }}' container-id-or-name
Output14552
Ќе излезе процес ID (или PID). Сега можеме да ја користиме програмата nsenter
за да извршиме команда во мрежниот именски простор на тој процес:
- 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
- nsenter -t your-container-pid -n ip addr
Output1: 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
во стандардниот именски простор на јазолот за да ги наведете неговите интерфејси:
- ip addr
Output1: 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
:
- conntrack -L
За постојано да гледате нови врски, користете го знамето -E
:
- conntrack -E
За да ги наведете конекциите следени со одредена целна адреса, користете го знамето -d
:
- conntrack -L -d 10.32.0.1
Ако вашите јазли имаат проблеми со правење сигурни врски со услугите, можно е вашата табела за следење конекции е полна и нови врски се испуштаат. Ако е така, може да видите пораки како следнава во дневниците на вашиот систем:
Jul 12 15:32:11 worker-528 kernel: nf_conntrack: table full, dropping packet.
Има поставка sysctl за максимален број конекции за следење. Можете да ја наведете вашата моментална вредност со следнава команда:
- sysctl net.netfilter.nf_conntrack_max
Outputnet.netfilter.nf_conntrack_max = 131072
За да поставите нова вредност, користете го знамето -w
:
- 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
:
- iptables-save
Бидејќи излезот може да биде долг, можеби ќе сакате да испратите цевка до датотека (iptables-save > output.txt
) или пејџер (iptables-save | помалку
) до повеќе лесно прегледајте ги правилата.
За да ги наведете само правилата NAT на услугата Kubernetes, користете ја командата iptables
и знамето -L
за да го одредите точниот синџир:
- iptables -t nat -L KUBE-SERVICES
OutputChain 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:
- apt install dnsutils
Прво, пронајдете ја IP-адресата на кластерот на услугата kube-dns:
- kubectl get service -n kube-system kube-dns
OutputNAME 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 за повеќе информации за ова:
- 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
:
- ipvsadm -Ln
OutputIP 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 адреса:
- ipvsadm -Ln -t 100.64.0.10:53
OutputProt 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.