视频讲解:Envoy手把手入门视频讲解
用 echoserver 观察代理/转发效果
echoserver 是一个回显用户请求的 http 服务,用来观察 http 请求的代理/转发效果非常方便。
echoserver 1.10 不支持 HTTP 2.0。
启动 echoserver 容器
准备一个 echoserver 观察 envoy 转发来的请求,echoserver 用途见 HTTP 协议相关的工具。
$ docker run -idt --name echoserver -p 9090:8080 -p 9443:8443 googlecontainer/echoserver:1.10
获取 echoserver 容器的 IP
先获取 echoserver 容器的 IP 地址,确定 envoy 能够访问这个地址:
# echoserver 是容器的名字,替换成你自己的容器名
$ docker inspect echoserver -f "{{.NetworkSettings.Networks.bridge.IPAddress}}"
172.17.0.2
配置 cluster
该示例使用的配置文件是 envoy-0-example.yaml,在 static_resources: -> clusters: 中配置的是 echoserver 容器的地址,注意将 address 替换成你自己的 echoserver 容器的 IP:
- name: service_echo
connect_timeout: 0.25s
type: STATIC
lb_policy: ROUND_ROBIN
#http2_protocol_options: {} # 注意 echoserver 不支持http 2.0,不能有这项配置
load_assignment:
cluster_name: service_echo
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address:
address: 172.17.0.2
port_value: 8080
配置 listener
该示例使用的配置文件是 envoy-0-example.yaml,在 static_resources: -> listeners: 中配置的是 listener,这个 listener 监听 80 端口,将 host 匹配 "*" 和 prefix 匹配 "/" 的请求转发给上面配置的 cluster,并且在转发的时候将 host 修改为 www.google.com:
- name: listener_0
address:
socket_address:
protocol: TCP
address: 0.0.0.0
port_value: 80
filter_chains:
- filters:
- name: envoy.http_connection_manager
typed_config:
"@type": type.googleapis.com/envoy.config.filter.network.http_connection_manager.v2.HttpConnectionManager
stat_prefix: ingress_http
route_config:
name: local_route
virtual_hosts:
- name: local_service
domains: ["*"]
routes:
- match:
prefix: "/"
route:
host_rewrite: www.baidu.com
cluster: service_echo
http_filters:
- name: envoy.router
启动,观察效果
上面的配置已经添加到 envoy-0-example.yaml 中,直接用下面的命令启动:
$ ./run.sh envoy-0-example.yaml
访问 envoy 的 80 端口,效果如下,注意观察 echoserver 收到的请求的 host 是 www.baidu.com,这是因为上面的配置里有一项 “host_rewrite: www.baidu.com”:
$ curl 127.0.0.1:80
Hostname: 7759cabd7402
Pod Information:
-no pod information available-
Server values:
server_version=nginx: 1.13.3 - lua: 10008
Request Information:
client_address=172.17.0.3
method=GET
real path=/
query=
request_version=1.1
request_scheme=http
request_uri=http://www.baidu.com:8080/
Request Headers:
accept=*/*
content-length=0
host=www.baidu.com # echoserver 收到的请求的 host
user-agent=curl/7.54.0
x-envoy-expected-rq-timeout-ms=15000
x-forwarded-proto=http
x-request-id=957e0bd8-2fb1-4ff1-8131-f1fff1cb0e9a
Request Body:
-no body in request-