问题描述:当使用AWS Network Load Balancer(NLB)作为gRPC流量的终止点时,由于NLB不能透明地处理gRPC协议的请求和响应,因此需要使用特殊的TLS终止方案。
解决方案:使用Envoy代理作为TLS终止终端点,并将Envoy配置为使用AWS NLB作为Load Balancer后端。Envoy支持gRPC协议和TLS终止,可以透明地处理gRPC流量。以下是该方案的步骤和代码示例:
Step 1: 创建Load Balancer Endpoints
使用AWS CLI方式创建Load Balancer Endpoints,其中Type为network,名字为my-nlb:
aws elbv2 create-load-balancer \
--name my-nlb \
--type network \
--subnet-mappings SubnetId=subnet-0a123456,AllocationId=eipalloc-0a456789 SubnetId=subnet-0b123456,AllocationId=eipalloc-0b456789
Step 2: 创建Envoy代理
在EC2实例中安装并配置Envoy代理,以便它可以将gRPC流量转发到NLB。以下是一个基本的Envoy配置示例,它使用TLS终止将请求转发到名为“my-nlb”的NLB:
admin:
access_log_path: /dev/null
address:
socket_address:
address: 127.0.0.1
port_value: 15000
dynamic_resources:
lds_config:
api_config_source:
api_type: GRPC
grpc_services:
envoy_grpc:
cluster_name: my-nlb
cds_config:
api_type: GRPC
grpc_services:
envoy_grpc:
cluster_name: my-nlb
cds_config:
ads: {}
resource_api_version: V3
static_resources:
listeners:
- name: listener_0
address:
socket_address: { address: 0.0.0.0, port_value: 10000 }
filter_chains:
- filters:
- name: envoy.filters.network.tcp_proxy
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.network.tcp_proxy.v3.TcpProxy
stat_prefix: tcp_proxy
cluster: tcp_backend
clusters:
- name: tcp_backend
connect_timeout: 1s
type: STRICT_DNS
lb_policy: ROUND