Вступление
Kubernetes — это система оркестровки контейнеров, которая может управлять контейнерными приложениями в кластере узлов сервера. Поддержание сетевого подключения между всеми контейнерами в кластере требует некоторых передовых сетевых методов. В этой статье мы кратко рассмотрим некоторые инструменты и методы для проверки этой сетевой настройки.
Эти инструменты могут быть полезны, если вы отлаживаете проблемы с подключением, исследуете проблемы пропускной способности сети или изучение Kubernetes, чтобы узнать, как он работает.
Если вы хотите узнать больше о Kubernetes в целом, вы можете выучить основы, прочитав цифроцианс Введение в Kubernetes Анкет Для обзора Kubernetes, специфичной для сети, пожалуйста, прочитайте Kubernetes Networking Под капюшоном Анкет
Начиная
Этот учебник предполагает, что у вас уже есть кластер Kubernetes, с kubectl
Установлено на локальном компьютере и настроен для подключения к кластеру. Любой kubectl
Представленные команды предназначены для запуска на вашей локальной машине.
Все остальные команды должны выполняться на узле Kubernetes в качестве корень пользователь. Если вы используете пользователя, не связанного с Sudo-поддержкой, на своих узлах Kubernetes, используйте Sudo
запустить команды, когда это необходимо.
Поиск IP -адреса кластера POD
Чтобы найти IP -адрес кластера POD Kubernetes, используйте Kubectl Get Pod
Команда на вашей локальной машине, с опцией -О широко
Анкет В этом парамере будет указана дополнительная информация, включая узел, на котором находится стручок, и IP -адрес кластера POD.
kubectl get pod -o wide
Выход:
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 -адрес кластера для каждого стручка.
Если вы не видите стручок, который ищете, убедитесь, что вы находитесь в правильном пространстве имен. Вы можете перечислить все стручки во всех пространствах имен, добавив флаг -все именам
Анкет
Поиск IP службы
Мы можем найти IP -сервис, используя kubectl
также. В этом случае мы перечислим все услуги во всех пространствах имен:
kubectl get service --all-namespaces
Выход:
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE default kubernetes ClusterIP 10.32.0.1443/TCP 6d kube-system csi-attacher-doplugin ClusterIP 10.32.159.128 12345/TCP 6d kube-system csi-provisioner-doplugin ClusterIP 10.32.61.61 12345/TCP 6d kube-system kube-dns ClusterIP 10.32.0.10 53/UDP,53/TCP 6d kube-system kubernetes-dashboard ClusterIP 10.32.226.209 443/TCP 6d
Сервис IP можно найти в Кластер-IP столбец.
Поиск и въездные пространства имен сети POD
Каждому стручке Kubernetes назначается собственное пространство имен сети. Пространства сетевых имен (или NETN) представляют собой примитиву Linux Networking, которая обеспечивает изоляцию между сетевыми устройствами.
Может быть полезно запускать команды из сети POD, проверить разрешение DNS или общее сетевое подключение. Для этого нам сначала нужно найти идентификатор процесса одного из контейнеров в стручке. Для Docker мы можем сделать это с серией из двух команд. Сначала перечислите контейнеры, работающие на узле:
docker ps
Выход:
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 . . .
Найдите идентификатор контейнера или имя любого контейнера в капсуле, который вас интересует. На приведенном выше выводе мы показываем два контейнера:
- Первый контейнер — это
Привет, мир
Приложение работает вПривет, мир
капсул - Второй — пауза Контейнер работает в
Привет, мир
капсул Этот контейнер существует исключительно для того, чтобы удерживать пространство имен сети POD
Чтобы получить идентификатор процесса любого контейнера, обратите внимание на идентификатор контейнера или имя и используйте его в следующем докер
Команда:
docker inspect --format '{{ .State.Pid }}' your_container_id_or_name
Выход:
14552
Идентификатор процесса (или PID) будет выходить. Теперь мы можем использовать nsenter
Программа для запуска команды в пространстве имен сети этого процесса:
nsenter -t your_container_pid -n ip addr
Обязательно используйте свой собственный пид и замените ip addr
С командой вы хотели бы запустить в пространстве имен сети POD.
Примечание: Одно преимущество использования nsenter
Запускать команды в пространстве имен стручка — по сравнению с использованием чего -то вроде Docker Exec
— Является ли у вас доступ ко всем командам, доступным на узле, вместо обычно ограниченного набора команд, установленных в контейнерах.
Поиск виртуального интерфейса Ethernet
Пространство имен сети каждого стручка связывается с корневыми сетью узла через виртуальную трубу Ethernet. На стороне узла эта труба появляется как устройство, которое обычно начинается с Вет
и заканчивается в уникальном идентификаторе, таком как Veth77f2275
или Veth01
. Внутри стручки эта труба появляется как ETH0
Анкет
Это может быть полезно, чтобы сопоставить, какой Вет
Устройство в паре с конкретным стручком. Для этого мы перечислим все сетевые устройства в узле, а затем перечислим устройства в пространстве имен сети Pod. Затем мы можем сопоставить номера устройств между двумя списками, чтобы создать соединение.
Сначала беги ip addr
В пространстве имен сети POD с использованием nsenter
Анкет Обратитесь к предыдущему разделу Поиск и вход в пространство имен сети POD Для получения подробной информации о том, как это сделать:
nsenter -t your_container_pid -n ip addr
Выход:
1: lo: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: 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
Команда выведет список интерфейсов POD. Обратите внимание на if11
номер после eth0@
В примере вывода. Это означает, что этот стручок ETH0
связан с 11 -м интерфейсом узла. Теперь беги ip addr
В пространстве имен по умолчанию, чтобы перечислить его интерфейсы:
ip addr
Выход:
1: lo: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: 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: 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: 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
В этом примере вывод. Это виртуальная труба Ethernet для капсула, которую мы исследуем.
Осмотр отслеживания соединения Conntrack
До версии 1.11 Kubernetes использовал iptables Nat и модуль ядра Conntrack для отслеживания соединений. Чтобы перечислить все подключения, которые в настоящее время отслеживаются, используйте Conntrack
Команда:
conntrack -L
Чтобы непрерывно смотреть новые соединения, используйте -E
флаг:
conntrack -E
Чтобы перечислить соединительные соединения с конкретным адресом назначения, используйте -Д
флаг:
conntrack -L -d your_destination_address
Если у ваших узлов возникают проблемы, устанавливающие надежные подключения к услугам, возможно, ваша таблица отслеживания соединений полна, а новые соединения отбрасываются. Если это так, вы можете увидеть сообщения, подобные следующим в журналах системы:
Jul 12 15:32:11 worker-528 kernel: nf_conntrack: table full, dropping packet.
Существует настройка SYSCTL для максимального количества подключений для отслеживания. Вы можете указать свое текущее значение со следующей командой:
sysctl net.netfilter.nf_conntrack_max
Выход:
net.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 -перевода и балансировки нагрузки для IPS Service.
Чтобы сбросить все правила iptables на узле, используйте iptables-save
Команда:
iptables-save
Поскольку выходной сигнал может быть длительным, вы можете захотеть подключиться к файлу ( iptables-save> output.txt
) или пейджер ( iptables-save | меньше
) Чтобы легче просмотреть правила.
Чтобы перечислить только правила обслуживания Kubernetes NAT, используйте iptables
Команда и -L
флаг, чтобы указать правильную цепочку:
iptables -t nat -L KUBE-SERVICES
Выход:
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
в теме. Это описано в Официальная документация Kubernetes Анкет
Еще один способ запросить кластер DNS использует Dig
и nsenter
из узла. Если Dig
не установлен, он может быть установлен с Apt
На Debian Linux Distributions:
apt install dnsutils
Сначала найдите кластер IP из Kube-dns услуга:
kubectl get service -n kube-system kube-dns
Выход:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kube-dns ClusterIP 10.32.0.1053/UDP,53/TCP 15d
IP кластера выделен выше. Далее мы будем использовать nsenter
запустить Dig
В пространстве имен контейнеров. Посмотрите на раздел Поиск и вход в пространство имен сети POD Для получения дополнительной информации об этом:
nsenter -t 14346 -n dig kubernetes.default.svc.cluster.local @10.32.0.10
Это Dig
Команда ищет полное доменное имя службы Service-name.namespace.svc.cluster.local и подробно описывает IP Сервиса DNS Cluster DNS ( @10.32.0.10
).
Просмотр деталей IPVS
По состоянию на Kubernetes 1.11, Kube-Proxy
может настроить IPV для обработки перевода виртуальных услуг IPS на IPS POD. Вы можете перечислить таблицу переводов IPS с IPVSADM
:
ipvsadm -Ln
Выход:
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:
ipvsadm -Ln -t 100.64.0.10:53
Выход:
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, взгляните на Digitalocean’s Kubernetes Tutorials и Официальная документация Kubernetes Анкет
Оригинал: «https://dev.to/digitalocean/how-to-inspect-and-debug-kubernetes-networking-primitives-d7n»