Я 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% запросов.
Есть идеи, что я делаю не так?