原文链接:Envoy 基础教程:反向代理谷歌搜索

上篇文章介绍了如何基于文件系统动态更新 Envoy 配置,还没看过的同学可以去恶补一下。今天要介绍一个新的基于 Envoy 的奇技淫巧,其实很简单,几句话就可以说完。但鉴于网上并无与此相关的资料,决定还是写出来吧,目测我是用此方法的第一人,至少国内如此。

想必大部分小朋友看标题就知道我要讲的是啥,没错,是用 Envoy 来反向代理 Google。网上铺天盖地都是 Nginx 反代 Google 的文章,看得我是真难受,还得添加各种模块自己编译,你累不累啊?今天让我用 Envoy 教你如何正确优雅地反代 Google,看懂的掌声。

首先得准备一个访问 Google 不受限的云服务器,知道的同学自然懂,不多说。

Envoy 的配置方法继续沿用上篇文章的方法,基于文件系统来动态更新配置。步骤非常简单,先在 lds.yaml 中添加 Listener:

- "@type": type.googleapis.com/envoy.api.v2.Listener
  name: listener_https
  address:
    socket_address:
      address: 0.0.0.0
      port_value: 443
  filter_chains:
  - filter_chain_match:
      server_names: "google.fuckcloudnative.io"
    transport_socket:
      name: envoy.transport_sockets.tls
      typed_config:
        "@type": type.googleapis.com/envoy.api.v2.auth.DownstreamTlsContext
        common_tls_context:
          tls_certificates:
          - certificate_chain:
              filename: "/etc/letsencrypt/live/www.fuckcloudnative.io/fullchain.pem"
            private_key:
              filename: "/etc/letsencrypt/live/www.fuckcloudnative.io/privkey.pem"
    filters:
    - name: envoy.http_connection_manager
      typed_config:
        "@type": type.googleapis.com/envoy.config.filter.network.http_connection_manager.v2.HttpConnectionManager
        stat_prefix: ingress_https
        codec_type: AUTO
        access_log:
          name: envoy.file_access_log
          typed_config:
            "@type": type.googleapis.com/envoy.config.accesslog.v2.FileAccessLog
            path: /dev/stdout
        route_config:
          name: https_route_google
          virtual_hosts:
          - name: default
            domains:
            - "*"
            routes:
            - match:
                prefix: "/"
              route:
                cluster: google
                host_rewrite: www.google.com
        http_filters:
        - name: envoy.router
  • 将域名替换成你自己的域名
  • 将配置中的证书替换成你自己的证书,至于证书如何申请我就不说了,不是本文的重点,请面向谷歌找答案。

下一步是向 cds.yaml 中添加 Cluster:

- "@type": type.googleapis.com/envoy.api.v2.Cluster
  name: google
  connect_timeout: 1s
  type: logical_dns
  dns_lookup_family: V4_ONLY
  lb_policy: ROUND_ROBIN
  load_assignment:
    cluster_name: google
    endpoints:
    - lb_endpoints:
      - endpoint:
          address:
            socket_address:
              address: www.google.com
              port_value: 443
  tls_context:
    sni: www.google.com

这里解释一下 logical_dnsstrict_dns 的区别:

  • 严格 DNS(strict_dns): 当使用严格 DNS 服务发现时,Envoy 将持续并异步地解析指定的 DNS 目标。DNS 结果中的每个返回的IP地址将被视为上游群集中的显式主机。 这意味着如果查询返回三个 IP 地址,Envoy 将假定集群有三个主机,并且三个主机都应该负载均衡。简单直白一点:如果上游集群有多个 IP 地址,那么基于轮询算法,每隔一段时间都会连接到不同的 IP。
  • 逻辑 DNS(logical_dns): 与严格 DNS 服务发现类似,但在需要初始化新连接时仅使用返回的第一个 IP 地址。简单直白一点:即使上游集群有多个 IP 地址,相关联的连接每次都会连接到相同的 IP,直到连接被关闭。

tls_context 字段表示通过 HTTPS 协议连接上游集群。

最后一步,使配置生效,如果你的 Envoy 跑在宿主机上,不用做任何操作配置就已经生效了。如果你的 Envoy 跑在容器中,可以执行我上篇文章中的脚本:

$ bash apply.sh

现在就可以愉快地访问 Google 了:

已添加到我的博客首页,快快收藏起来:

以后请叫我云原生奇技淫巧之神。

微信公众号

扫一扫下面的二维码关注微信公众号,在公众号中回复◉加群◉即可加入我们的云原生交流群,和孙宏亮、张馆长、阳明等大佬一起探讨云原生技术


米开朗基杨
169 声望25 粉丝