Посланник прокси на Кубернетес дает 503 - PullRequest
0 голосов
/ 14 октября 2019

Я kubernetizing (если я могу использовать этот термин), это демо, и я получаю 503 от фронт-сервиса.

Итак, я сделал, чтобы создать триСервисы;зеленый, синий и красный, и все они отлично работают. Если я нажимаю их напрямую, я получаю 200, но когда я делаю это через фронт-сервис, я получаю 503.

Идея демо-версии заключается в том, чтобы попасть в фронт-сервис, и этот прокси проксирует запрос, в зависимости отна пути к одной из служб позади (зеленый, синий или красный). Это файл yaml для фронт-сервиса:

static_resources:
  listeners:
  - address:
      socket_address:
        address: 0.0.0.0
        port_value: 80
    filter_chains:
    - filters:
      - name: envoy.http_connection_manager
        config:
          codec_type: auto
          stat_prefix: ingress_http
          route_config:
            name: local_route
            virtual_hosts:
            - name: backend
              domains:
              - "*"
              routes:
              - match:
                  prefix: "/service/blue"
                route:
                  cluster: service_blue
              - match:
                  prefix: "/service/green"
                route:
                  cluster: service_green
              - match:
                  prefix: "/service/red"
                route:
                  cluster: service_red
          http_filters:
          - name: envoy.router
            config: {}
  clusters:
  - name: service_blue
    connect_timeout: 0.25s
    type: strict_dns
    lb_policy: round_robin
    http2_protocol_options: {}
    hosts:
    - socket_address:
        address: blue
        port_value: 80
  - name: service_green
    connect_timeout: 0.25s
    type: strict_dns
    lb_policy: round_robin
    http2_protocol_options: {}
    hosts:
    - socket_address:
        address: green
        port_value: 80
  - name: service_red
    connect_timeout: 0.25s
    type: strict_dns
    lb_policy: round_robin
    http2_protocol_options: {}
    hosts:
    - socket_address:
        address: red
        port_value: 80
admin:
  access_log_path: "/dev/null"
  address:
    socket_address:
      address: 0.0.0.0
      port_value: 8001

Это мои сервисы в кластере:

# kubectl get svc -n envoy-demo
NAME    TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE
blue    ClusterIP   10.98.101.176    <none>        80/TCP    5h31m
front   ClusterIP   10.98.119.222    <none>        80/TCP    73m
green   ClusterIP   10.107.136.62    <none>        80/TCP    54m
red     ClusterIP   10.101.240.162   <none>        80/TCP    160m

Если я получаю доступ к front pod и сверну любую из сервисов,Я получаю 200:

root@envoy-front-54856466dc-59jdw:/# curl blue/service/blue -I
HTTP/1.0 200 OK
Content-Type: text/html; charset=utf-8
Content-Length: 166
Server: Werkzeug/0.16.0 Python/3.7.4
Date: Mon, 14 Oct 2019 15:53:14 GMT

root@envoy-front-54856466dc-59jdw:/# curl green/service/green -I
HTTP/1.0 200 OK
Content-Type: text/html; charset=utf-8
Content-Length: 170
Server: Werkzeug/0.16.0 Python/3.7.4
Date: Mon, 14 Oct 2019 15:53:31 GMT

root@envoy-front-54856466dc-59jdw:/# curl red/service/red -I
HTTP/1.0 200 OK
Content-Type: text/html; charset=utf-8
Content-Length: 163
Server: Werkzeug/0.16.0 Python/3.7.4
Date: Mon, 14 Oct 2019 15:53:38 GMT

Эти сервисы возвращают 200 на /service/whatever на самом деле.

Если я свернусь к локальному хосту или извне модуля в службу front, я получу 503:

# curl localhost/service/red
upstream connect error or disconnect/reset before headers. reset reason: connection termination

То же самое, если я сверну IP-адрес службы front и имя службы извне модуля front.

Сервис в идеале работает:

# netstat -tlpn
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:8001            0.0.0.0:*               LISTEN      6/envoy         
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      6/envoy  

В случае, если это уместно, это файл yaml посланника сервиса:

static_resources:
  listeners:
  - address:
      socket_address:
        address: 0.0.0.0
        port_value: 80
    filter_chains:
    - filters:
      - name: envoy.http_connection_manager
        config:
          codec_type: auto
          stat_prefix: ingress_http
          route_config:
            name: local_route
            virtual_hosts:
            - name: service
              domains:
              - "*"
              routes:
              - match:
                  prefix: "/service"
                route:
                  cluster: local_service
          http_filters:
          - name: envoy.router
            config: {}
  clusters:
  - name: local_service
    connect_timeout: 0.25s
    type: strict_dns
    lb_policy: round_robin
    hosts:
    - socket_address:
        address: 0.0.0.0
        port_value: 8080
admin:
  access_log_path: "/dev/null"
  address:
    socket_address:
      address: 0.0.0.0
      port_value: 8081

Все сервисы оченьаналогичный;один из них - обычный сервис, другой добавляет задержку, а другой прерывает 50% запросов.

Есть идеи, что я делаю не так?

...