Рубрики
Uncategorized

Как осмотреть и отлаживать kubernetes Сетевые примитивы

В этой статье мы перечислим некоторые полезные инструменты и методы для осмотра сети кластеров Kubernetes. Эти инструменты могут помочь, если вы отлаживаете проблемы с подключением, исследуя проблемы пропускной способности сети или изучение Kubernetes, чтобы узнать, как он работает. Помечено Kubernetes, сеть, DevOps.

Вступление

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.1               443/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.10           53/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»