Основы на примере web-сервиса

Допустим, что у нас есть веб-сервис, работает он на машине Linux и мы внешним клиентом (допустим curl) делаем запрос. Для начала наша программа должна прослушивать адрес и порт. Также она создает сокет для этого адреса и порта и привязывается к нему. В сокет будут поступать запросы, адресованные как на указанный адрес/порт/транспортный протокол.

Ядро сопоставляет данный пакет с конкретным соединением и использует внутренний state machine для управления состоянием соединения. Linux сопоставляет каждое соединение с файлом. Принятие соединения влечет за собой уведомление от ядра нашей программе, которая затем может передавать содержимое в файл и из него.

В этот момент сервер прослушивает свой сокет и ждет, когда ядро уведомит его о получении пакета. Когда мы делаем запрос к нашему прослушивающему серверу, мы получаем ответ. После проверки сокета наш сервер записывает ответные данные (завернутые в HTTP протокол) к файловому дескриптору. Оттуда ядро Linux (и некоторые другие системы) переводит запрос в пакеты и передает эти пакеты обратно на наш клиент (curl).

Сетевые интерфейсы

Интерфейсы Linux могут быть как физическими, так и виртуальными.

Интерфейс loopback – это интерфейс, который обращается к одному и тому же хосту, предназначен для обращения сервера к самому себе.

Интерфейс Bridge позволяет создавать несколько L2 сетей на одном хосте. Другими словами, Bridge функционирует как сетевой коммутатор. В концепции k8s, bridge позволяет pod-ам со своими интерфейсами взаимодействовать с внешними сетями через сетевой интерфейс node. Это происходит через виртуальный Ethernet (veth), который соединяется с bridge, а тот в свою очередь с физическим сетевым интерфейсом (eth).

Устройство veth представляет собой локальный туннель Ethernet. Создаются veth парами (veth-pair), где pod видит интерфейс eth своего veth. Пакеты, передаваемые на одном устройстве в паре, немедленно принимаются на другом устройстве. Veth используются, как правило, когда сетевой namespace в котором мы работаем нуждается для связи с основным namespace хоста или другими пространствами имен.

Kubernetes использует концепцию veth совместно с проектом CNI для управления пространствами имен, интерфейсами и IP-адресами контейнерных сетей.

Untitled