I cannot seem to get this minimal Docker Envoy gRPC example to work.
Envoy config
admin:
access_log_path: "/tmp/admin_access.log"
address:
socket_address: { address: "127.0.0.1", port_value: 8000 }
static_resources:
listeners:
- name: listener_0
address:
socket_address: { address: 0.0.0.0, port_value: 8080 }
filter_chains:
- filters:
- name: envoy.filters.network.http_connection_manager
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
codec_type: AUTO
stat_prefix: ingress_http
route_config:
name: local_route
virtual_hosts:
- name: local_routes
domains: ["*"]
routes:
- match: { prefix: "/servers", grpc: {} } # Enable HTTP/2 for gRPC
route: { cluster: servers }
- match: { prefix: "/server1", grpc: {} } # Enable HTTP/2 for gRPC
route: { cluster: server1 }
- match: { prefix: "/server2", grpc: {} } # Enable HTTP/2 for gRPC
route: { cluster: server2 }
http_filters:
- name: envoy.filters.http.router
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
# LOAD BALANCING
clusters:
- name: servers
connect_timeout: 1s
type: STRICT_DNS
lb_policy: ROUND_ROBIN
http2_protocol_options: {} # Enable HTTP/2 for gRPC, assuming gRPC services
load_assignment:
cluster_name: servers
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address: { address: server1, port_value: 50051 }
- endpoint:
address:
socket_address: { address: server2, port_value: 50052 }
# ROUTING
- name: server1
connect_timeout: 1s
type: STRICT_DNS
lb_policy: ROUND_ROBIN
http2_protocol_options: {} # Enable HTTP/2 for gRPC
load_assignment:
cluster_name: server1
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address: { address: server1, port_value: 50051 } # server1 service address
- name: server2
connect_timeout: 1s
type: STRICT_DNS
lb_policy: ROUND_ROBIN
http2_protocol_options: {} # Enable HTTP/2 for gRPC
load_assignment:
cluster_name: server2
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address: { address: server2, port_value: 50052 } # server2 service address
Docker-compose config
version: '3'
services:
envoy:
image: envoyproxy/envoy:dev-2817fd926f2cac24d910d2854e8cd3a8f4537081
ports:
- '8080:8080'
volumes:
- ./envoy.yaml:/etc/envoy/envoy.yaml
networks:
- grpc-network
depends_on:
- server1
- server2
server1:
build: ./server1
ports:
- "50051:50051"
networks:
- grpc-network
server2:
build: ./server2
ports:
- "50052:50051"
networks:
- grpc-network
networks:
grpc-network:
driver: bridge
Expected behavior:
- localhost:8080/servers: alternating "Hello from server 1" and "Hello from server 2" as I refresh
- localhost:8080/server1: "Hello from server 1"
- localhost:8080/server2: "Hello from server 2"
What I am getting:
- localhost:8080/servers: alternating 14 UNAVAILABLE and 12 UNIMPLEMENTED
- localhost:8080/server1: 12 UNIMPLEMENTED
- localhost:8080/server2: 14 UNAVAILABLE
When I send a request directly to the servers (without Envoy), both respond as expected.