Служба Kubernetes не пересылает порты, отличные от 80 и 443 - PullRequest
0 голосов
/ 02 июля 2019

Настройка кластера:

  • ОС: Ubuntu 18.04, рекомендуемые параметры установки с Kubernetes
  • Кластер загружается с помощью Kubespray
  • CNI - Calico

Краткие сведения (когда ip службы redis равен 10.233.90.37):

  • Хост-машина: psql 10.233.90.37:6379 => успех
  • Хост-машина: psql 10.233.90.37:80 => success

  • Бобы (в любом пространстве имен) psql 10.233.90.37:6379 => Таймаут

  • Бобы (в любом пространстве имен) psql redis:6379 => Тайм-аут
  • Pod (в любом пространстве имен) psql redis.namespace.svc.cluster.local => timeout
  • Pod (в любом пространстве имен) psql redis:80 => success
  • Pod (в любом пространстве имен) psql redis.namespace.svc.cluster.local:80=> success

Служба Kubernetes (NodePort, LoadBalancer, ClusterIP) не будет перенаправлять порты, отличные от 80 и 443, для модулей.Порты модуля могут отличаться, но запросы к Службе будут превышены по времени, если порт Службы не равен 80 или 443.

Запросы от хост-машины к Службе Kubernetes на портах, отличных от 80 и 443, работают.НО запросы от модулей к этим другим портам не выполняются.

Запросы от модулей к службам на портах 80 и 443 работают.

user@host: curl 10.233.90.37:80
200 OK
user@host: curl 10.233.90.37:5432
200 OK

# ... exec into Pod
```bash
bash-4.4# curl 10.233.90.37:80
200 OK
bash-4.4# curl 10.233.90.37:5432
Error ... timeout ...
user@host: kubectl get NetworkPolicy -A
No resources found.
user@host: kubectl get PodSecurityPolicy -A
No resources found.

Пример службы:

apiVersion: v1
kind: Service
metadata:
  labels:
    app: redis
  name: redis
  namespace: namespace
spec:
  ports:
  - port: 6379
    protocol: TCP
    targetPort: 6379
    name: redis
  - port: 80
    protocol: TCP
    targetPort: 6379
    name: http
  selector:
    app: redis
  type: NodePort # I've tried ClusterIP, NodePort, and LoadBalancer

Что происходит с этим безумным поведением порта Сервиса Kubernetes!?

После отладки я обнаружил, что это может быть связано с конфигурацией ufw и iptables.

Настройки ufw (очень допустимо):

Status: enabled
80                         ALLOW       Anywhere
443                        ALLOW       Anywhere
6443                       ALLOW       Anywhere
2379                       ALLOW       Anywhere
2380                       ALLOW       Anywhere
10250/tcp                  ALLOW       Anywhere
10251/tcp                  ALLOW       Anywhere
10252/tcp                  ALLOW       Anywhere
10255/tcp                  ALLOW       Anywhere
179                        ALLOW       Anywhere
5473                       ALLOW       Anywhere
4789                       ALLOW       Anywhere
10248                      ALLOW       Anywhere
22                         ALLOW       Anywhere
80 (v6)                    ALLOW       Anywhere (v6)
443 (v6)                   ALLOW       Anywhere (v6)
6443 (v6)                  ALLOW       Anywhere (v6)
2379 (v6)                  ALLOW       Anywhere (v6)
2380 (v6)                  ALLOW       Anywhere (v6)
10250/tcp (v6)             ALLOW       Anywhere (v6)
10251/tcp (v6)             ALLOW       Anywhere (v6)
10252/tcp (v6)             ALLOW       Anywhere (v6)
10255/tcp (v6)             ALLOW       Anywhere (v6)
179 (v6)                   ALLOW       Anywhere (v6)
5473 (v6)                  ALLOW       Anywhere (v6)
4789 (v6)                  ALLOW       Anywhere (v6)
10248 (v6)                 ALLOW       Anywhere (v6)
22 (v6)                    ALLOW       Anywhere (v6)

Развертывание Kubespray завершается неудачно с отключенным ufw.Развертывание Kubespray успешно выполняется с включенным ufw.

После развертывания отключение ufw позволит модулям подключаться к портам, отличным от 80, 443. Однако кластер падает при отключении ufw.

Любая идея, чтопродолжается?Я пропускаю порт в конфигурации UFW ....?Кажется странным, что для успешной установки kubespray потребуется ufw.

1 Ответ

2 голосов
/ 02 июля 2019

LoadBalancer сервис предоставляет 1 внешний IP-адрес, который внешние клиенты или пользователи будут использовать для подключения к вашему приложению.В большинстве случаев вы ожидаете, что ваша служба LoadBalancer будет прослушивать порт 80 для http-трафика и порт 443 для https.Поскольку вы хотите, чтобы ваши пользователи печатали http://yourapp.com или https://yourapp.com вместо http://yourapp.com:3000.

Похоже, вы смешиваете разные службы в своем примере. Yaml, например, nodePort используется, когда службатипа NodePort.Вы можете попробовать:

apiVersion: v1
kind: Service
metadata:
  labels:
    app: redis
    role: master
    tier: backend
  name: redis
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 6379    // service will target containers on port 6379
    name: someName
  selector:
    app: redis
    role: master
    tier: backend
  type: LoadBalancer
...