2

Я очень новичок в kubernetes и только что получил запас kubernetes v.1.3.5 на AWS, используя kube-up. До сих пор я играл с кубернетами в понимании его механики (узлы, стручки, svc и прочее). Основываясь на моем первоначальном (или, может быть, грубом) понимании, у меня было несколько вопросов:Как настроен кластер IP в kubernetes-aws?

1) Как работает маршрутизация на кластерный IP-адрес здесь (например, в kube-aws)? Я вижу, что службы имеют IP-адреса в диапазоне 10.0.0.0/16. Я сделал развертывание с rc = 3 из nginx, а затем подключил к нему сервис с открытым портом узла. Все отлично работает! Я могу подключиться к сервису с моей машины dev. Эта служба nginx имеет IP-адрес кластера 10.0.33.71:1321. Теперь, если я ssh в один из миньонов (или узлов или VMS) и сделаю «telnet 10.0.33.71 1321», он подключается, как ожидалось. Но я не знаю, как это работает, я не мог найти никаких маршрутов, связанных с 10.0.0.0/16 в настройке VPC кубернетами. Что именно происходит под капотом здесь, что приводит к успешному соединению для приложения, такого как telnet? Однако, если я ssh в главный узел и делаю «telnet 10.0.33.71 1321», он не соединяется. Почему он не может подключиться от мастера?

2) Внутри каждого узла есть интерфейс cbr0. Каждый миньон-узел имеет cbr0, сконфигурированный как 10.244.x.0/24, а master имеет cbr0 как 10.246.0.0/24. Я могу выполнить ping для любого из 10.244.x.x контейнеров из любого из узлов (включая master). Но я не могу выполнить ping 10.246.0.1 (cbr0 внутри главного узла) от любого из миньонных узлов. Что может быть здесь?

Вот маршруты, установленные kubernetes в aws. VPC.

Destination  Target 
172.20.0.0/16 local 
0.0.0.0/0  igw-<hex value> 
10.244.0.0/24 eni-<hex value>/i-<hex value> 
10.244.1.0/24 eni-<hex value>/i-<hex value> 
10.244.2.0/24 eni-<hex value>/i-<hex value> 
10.244.3.0/24 eni-<hex value>/i-<hex value> 
10.244.4.0/24 eni-<hex value>/i-<hex value> 
10.246.0.0/24 eni-<hex value>/i-<hex value> 
+0

Вы прочитали [сетевую документацию] (http://kubernetes.io/docs/admin/networking/)? Я думаю, что настройка AWS очень похожа на настройку сети GCE. –

+0

Да. Но мой вопрос касается IP-адресов кластера (не Pod IP), которые являются виртуальными. – soupybionics

+2

Кластерные IP-адреса в кластерах куба поддерживаются правилами таблицы IP. На каждом миньоне работает процесс - kube-proxy, который в основном рассматривает все созданные службы и записывает правила IPtable, которые перенаправляют любой вызов в диапазон IP-адресов кластера (10.0.0.0/16 в вашем случае) на фактический код ф. Если вы запустите 'iptable -L -t nat | grep cluster-ip', вы сможете увидеть линейку На главном устройстве может быть сбои, поскольку либо kube-proxy не работает, либо не обновляет конечные точки должным образом. Не уверен насчет второй части вопроса –

ответ

1

Mark Betz (SRE at Olark) представляет Kubernetes сети в трех статьях:

Для стручка, вы смотрите на:

pod network

Вы найдете:

  • etho0: в "физический сетевой интерфейс"
  • docker0/cbr0: a bridge для подключения двух сегментов ethernet независимо от их протокола.
  • veth0, 1, 2: Виртуальный сетевой интерфейс, по одному на контейнер.
    docker0 является default Gateway из veth0. Он называется cbr0 для «пользовательского моста».
    Kubernetes запускает контейнеры, разделяя same veth0, что означает, что каждый контейнер должен выставлять разные порты.
  • pause: специальный контейнер, запущенный в «pause», чтобы обнаружить SIGTERM, отправленный в контейнер, и переслать его в контейнеры.
  • узел: воинство
  • кластера: группа узлов
  • router/gateway

Последний элемент, где вещи начинают быть более сложным:

Kubernetes назначает общее адресное пространство для мостов на каждом узле, а затем как подписывает адреса мостов в этом пространстве, основываясь на узле, на котором построен мост.
Во-вторых, он добавляет правила маршрутизации к шлюзу в 10.100.0.1, сообщая ему, как пакеты, предназначенные для каждого моста, должны быть маршрутизированы, то есть через eth0 этого узла мост может быть достигнут.

Такая комбинация виртуальных сетевых интерфейсов, мостов и правил маршрутизации обычно называется overlay network.

Когда стручок контакты другой стручок, он проходит через service.
Почему?

Подгруппа в кластере - это аккуратный материал, но сам по себе он недостаточен для создания прочных систем. Это потому, что стручки в Кубернете являются эфемерными.
Вы можете использовать IP-адрес IP-адреса в качестве конечной точки, но нет гарантии, что адрес не изменится при следующем воссоздании контейнера, что может случиться по ряду причин.

Это означает: вам нужен обратный прокси-динамический балансировщик нагрузки. И лучше быть упругим.

Служба представляет собой тип kubernetes ресурса, который вызывает прокси должен быть настроен для пересылки запросов к набору стручков.
Набор контейнеров, которые будут получать трафик определяется селектор, который соответствует метки, присвоенные стручки, когда они были созданы

Эта служба использует свою собственную сеть. По умолчанию его тип «ClusterIP»; он имеет свой собственный IP-адрес.

Вот канал связи между двумя стручков:

two pods network

Он использует kube-proxy.
Этот прокси-сервер сам использует netfilter.

netfilter - это механизм обработки пакетов на основе правил.
Он работает в пространстве ядра и просматривает каждый пакет в разных точках жизненного цикла.
Он соответствует пакетам против правил и, когда он находит правило, которое соответствует ему, принимает указанное действие.
Среди множества действий, которые может потребоваться, это перенаправление пакета в другой пункт назначения.

kube-proxy and netfilter

В этом режиме Кубэ-прокси:

  • открывает порт (10400 в приведенном выше примере) на локальном хост-интерфейс для прослушивания запросов к test-service,
  • Вставляет правила netfilter для перенаправления пакетов, предназначенных для IP-услуг для своего собственного порта и
  • пересылает эти запросы в бобе на порту 8080.

Вот как запрос на 10.3.241.152:80 волшебно становится запрос 10.0.2.2:8080.
Учитывая возможности netfilter, все, что требуется для того, чтобы все это работало для любого сервиса, - это kube-proxy, чтобы открыть порт и вставить правильные правила сетевого фильтра для этой службы, что он делает в ответ на уведомления от master api сервер изменений в кластере.

Но:

Там еще один маленький поворот в истории.
Я упомянул выше, что Проксирование пользовательского пространства дорого связано с маршалингом пакетов. В kubernetes 1.2, kube-proxy получил возможность запуска в режиме iptables.

В этом режиме kube-proxy в основном перестает быть прокси-сервером для межкластерных соединений и вместо этого делегирует netfilter работу по обнаружению пакетов, привязанных к IP-адресам службы, и перенаправлению их на модули, все из которых происходит в пространстве ядра ,
В этом режиме задача kube-proxy более или менее ограничена соблюдением правил netfilter.

Схема сети становится:

netfilter in action

Однако, это не хорошо подходит для внешнего (публичное облицовочный) связи, которая нуждается внешний фиксированный IP.

Вы специализированные услуги для этого: nodePort and LoadBalancer:

Служба типа NodePort является ClusterIP службы с дополнительными возможностями: он доступен в IP-адрес узла, а также на назначенный IP-адрес кластера в сети служб.
Образом это достигается довольно просто:

Когда kubernetes создает службу NodePort, Кубэ-прокси назначает порт в диапазоне 30000-32767 и открывает этот порт на интерфейсе eth0 каждого узла (отсюда название «NodePort»).

Соединения с этим портом перенаправляются на IP-адрес кластера службы.

Вы получаете:

load-balancer/nodeport

Loadalancer более Advancer, и позволяет предоставлять сервисы с использованием портов стенда.
См отображение здесь:

$ kubectl get svc service-test 
NAME  CLUSTER-IP  EXTERNAL-IP  PORT(S)   AGE 
openvpn 10.3.241.52  35.184.97.156 80:32213/TCP  5m 

Однако:

Услуги типа LoadBalancer имеют некоторые ограничения.

  • Вы не можете сконфигурировать фунт, чтобы остановить трафик https.
  • Вы не можете делать виртуальные хосты или маршрутную маршрутизацию, , поэтому вы не можете использовать один балансировщик нагрузки для прокси-сервера для нескольких сервисов любым практически удобным способом.

Эти ограничения привели к добавлению в версии 1.2 отдельного kubernetes ресурса для настройки балансировки нагрузки, называется Ingress.

API Ingress поддерживает терминацию TLS, виртуальные хосты и маршрутную маршрутизацию. Он может легко настроить балансировщик нагрузки для обработки нескольких бэкэнд-услуг.
Реализация следует за базовым шаблоном кубернетов: типом ресурса и контроллером для управления этим типом.
Ресурс в этом случае является Ingress, который содержит запрос для сетевых ресурсов

Например:

apiVersion: extensions/v1beta1 
kind: Ingress 
metadata: 
    name: test-ingress 
    annotations: 
    kubernetes.io/ingress.class: "gce" 
spec: 
    tls: 
    - secretName: my-ssl-secret 
    rules: 
    - host: testhost.com 
    http: 
     paths: 
     - path: /* 
     backend: 
      serviceName: service-test 
      servicePort: 80 

Контроллер проникновения несет ответственность за удовлетворение этого запроса посредством приведения ресурсов окружающей среды в нужное состояние.
При использовании Ingress вы создаете свои сервисы типа NodePort и позволяете контроллеру входящего трафика выяснить, как получить трафик на узлы.

Имеются встроенные контроллеры для балансировщика нагрузки GCE, эластичные балансировочные устройства AWS и для популярных прокси-серверов, таких как NGiNX и HAproxy.

Смежные вопросы