<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                # Envoy 作為前端代理 **注意:本書中的 Service Mesh 章節已不再維護,請轉到 [istio-handbook](https://jimmysong.io/istio-handbook) 中瀏覽。** 本文是使用 Envoy 作為前端代理的介紹,僅使用 docker 容器和 docker-compose 做編排在單機中運行,幫助我們從更底層了解 Envoy,當我們將 Envoy 作為 Istio Service Mesh 的 data panel 的時候將更加游刃有余。 ## 快速開始 Envoy 中的所有規則配置跟 Kubernetes 一樣都是通過 YAML 文件來完成的。在繼續下面的步驟之前,首先克隆 Envoy 的 GitHub repo。 ```bash git clone https://github.com/envoyproxy/envoy.git ``` ## 運行 sandbox 測試 Envoy 官方提供了以下打包用例: - [Front Proxy](https://www.envoyproxy.io/docs/envoy/latest/start/sandboxes/front_proxy) - [Zipkin Tracing](https://www.envoyproxy.io/docs/envoy/latest/start/sandboxes/zipkin_tracing) - [Jaeger Tracing](https://www.envoyproxy.io/docs/envoy/latest/start/sandboxes/jaeger_tracing) - [gRPC Bridge](https://www.envoyproxy.io/docs/envoy/latest/start/sandboxes/grpc_bridge) 全部可以使用 `docker-compose` 運行,代碼可以在 https://github.com/envoyproxy/envoy/tree/master/examples 找到。 ## Front proxy Envoy 在 envoymesh 的邊緣做反向代理,詳細使用方式見 <https://www.envoyproxy.io/docs/envoy/latest/start/sandboxes/front_proxy>,在此我將解說下以下問題: - Envoy 是如何作為進程外架構運行的? - 為何說 Envoy 是無侵入式架構? - Envoy 作為邊緣反向代理能做什么? 本示例的架構圖如下所示,此時 Envoy 將作為一個反向代理,類似于 Nginx,但與 Nginx 不同的是它還會作為一個進程,伴隨每個服務一起運行在同一個容器中(在 Kubernetes 中可以作為 Sidecar 與應用容器一起運行在同一個 Pod 中)。 ![Front proxy 部署結構圖(轉自https://www.envoyproxy.io/docs/envoy/latest/start/sandboxes/front_proxy)](https://box.kancloud.cn/2ae2d3e2d1c4f7841b0b4492f50140f8_1800x1200.png) 在此示例中一共有 3 個服務,我們需要為其創建容器編排的 `docker-compose.yml` 文件。 ```yaml version: '2' services: front-envoy: build: context: . dockerfile: Dockerfile-frontenvoy volumes: - ./front-envoy.yaml:/etc/front-envoy.yaml networks: - envoymesh expose: - "80" - "8001" ports: - "8000:80" - "8001:8001" service1: build: context: . dockerfile: Dockerfile-service volumes: - ./service-envoy.yaml:/etc/service-envoy.yaml networks: envoymesh: aliases: - service1 environment: - SERVICE_NAME=1 expose: - "80" service2: build: context: . dockerfile: Dockerfile-service volumes: - ./service-envoy.yaml:/etc/service-envoy.yaml networks: envoymesh: aliases: - service2 environment: - SERVICE_NAME=2 expose: - "80" networks: envoymesh: {} ``` 使用 docker-compose 啟動可以保證三個服務都在同一個網絡內,即 `frontproxy_envoymesh` 網絡中。 其中 `front-envoy` 是前端(邊緣)Envoy 服務,用來做反向代理,它使用的是 `Dockerfile-frontenvoy` 文件來構建鏡像的,我們來看下該 `Dockerfile` 的內容。 ```docker FROM envoyproxy/envoy:latest RUN apt-get update && apt-get -q install -y \ curl CMD /usr/local/bin/envoy -c /etc/front-envoy.yaml --service-cluster front-proxy ``` 其中 `/etc/front-envoy.yaml` 是本地的 `front-envoy.yaml` 掛載進去的。我們看下該文件的內容。 ```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/1" route: cluster: service1 - match: prefix: "/service/2" route: cluster: service2 http_filters: - name: envoy.router config: {} clusters: - name: service1 connect_timeout: 0.25s type: strict_dns lb_policy: round_robin http2_protocol_options: {} hosts: - socket_address: address: service1 port_value: 80 - name: service2 connect_timeout: 0.25s type: strict_dns lb_policy: round_robin http2_protocol_options: {} hosts: - socket_address: address: service2 port_value: 80 admin: access_log_path: "/dev/null" address: socket_address: address: 0.0.0.0 port_value: 8001 ``` 我們看到其中包括了三大配置項: - **static_resources**:路由配置信息 - **cluster**:envoymesh 的服務注冊信息 - **admin**:管理接口,可以通過訪問 8001 端口的,訪問 `/stats` 獲取當前 envoymesh 的一些統計信息,訪問 `/server_info` 獲取 Envoy 的版本信息 使用 `docker-compose` 啟動三個容器。 ```bash $ pwd envoy/examples/front-proxy $ docker-compose up --build -d $ docker-compose ps Name Command State Ports ------------------------------------------------------------------------------------------------------------- example_service1_1 /bin/sh -c /usr/local/bin/ ... Up 80/tcp example_service2_1 /bin/sh -c /usr/local/bin/ ... Up 80/tcp example_front-envoy_1 /bin/sh -c /usr/local/bin/ ... Up 0.0.0.0:8000->80/tcp, 0.0.0.0:8001->8001/tcp ``` 我們下面將過一遍 Envoy 作為前端代理的所有功能,這些功能是通用功能。 ### 路由 訪問 service1 <http://localhost:8000/service/1> 將看到如下輸出。 ```bash $ curl -v localhost:8000/service/1 * Trying ::1... * TCP_NODELAY set * Connected to localhost (::1) port 8000 (#0) > GET /service/1 HTTP/1.1 > Host: localhost:8000 > User-Agent: curl/7.54.0 > Accept: */* > < HTTP/1.1 200 OK < content-type: text/html; charset=utf-8 < content-length: 89 < server: envoy < date: Fri, 20 Apr 2018 08:26:33 GMT < x-envoy-upstream-service-time: 14 < Hello from behind Envoy (service 1)! hostname: a3e4185a9a49 resolvedhostname: 172.18.0.4 * Connection #0 to host localhost left intact ``` 訪問 service2 <http://localhost:8000/service/2> 將看到如下輸出。 ```bash * Trying ::1... * TCP_NODELAY set * Connected to localhost (::1) port 8000 (#0) > GET /service/2 HTTP/1.1 > Host: localhost:8000 > User-Agent: curl/7.54.0 > Accept: */* > < HTTP/1.1 200 OK < content-type: text/html; charset=utf-8 < content-length: 89 < server: envoy < date: Fri, 20 Apr 2018 08:27:27 GMT < x-envoy-upstream-service-time: 10 < Hello from behind Envoy (service 2)! hostname: f6650e1911a0 resolvedhostname: 172.18.0.3 * Connection #0 to host localhost left intact ``` 我們看到訪問請求被路由到了正確的服務后端。 ### 負載均衡 增加 service1 的示例數。 ```bash $ docker-compose scale service1=3 WARNING: The scale command is deprecated. Use the up command with the --scale flag instead. Starting frontproxy_service1_1 ... done Creating frontproxy_service1_2 ... done Creating frontproxy_service1_3 ... done $ docker-compose ps Name Command State Ports --------------------------------------------------------------------------------------------------------------------------- frontproxy_front-envoy_1 /usr/bin/dumb-init -- /bin ... Up 10000/tcp, 0.0.0.0:8000->80/tcp, 0.0.0.0:8001->8001/tcp frontproxy_service1_1 /bin/sh -c /usr/local/bin/ ... Up 10000/tcp, 80/tcp frontproxy_service1_2 /bin/sh -c /usr/local/bin/ ... Up 10000/tcp, 80/tcp frontproxy_service1_3 /bin/sh -c /usr/local/bin/ ... Up 10000/tcp, 80/tcp frontproxy_service2_1 /bin/sh -c /usr/local/bin/ ... Up 10000/tcp, 80/tcp ``` 我們看到現在 service1 已經有了 3 個實例,現在再訪問 service1 <http://localhost:8000/service/1>。 ```bash $ while true;do curl localhost:8000/service/1;sleep 1;done Hello from behind Envoy (service 1)! hostname: a3e4185a9a49 resolvedhostname: 172.18.0.4 Hello from behind Envoy (service 1)! hostname: fe44dba64122 resolvedhostname: 172.18.0.5 Hello from behind Envoy (service 1)! hostname: c5b9f1289e0f resolvedhostname: 172.18.0.6 Hello from behind Envoy (service 1)! hostname: a3e4185a9a49 resolvedhostname: 172.18.0.4 Hello from behind Envoy (service 1)! hostname: fe44dba64122 resolvedhostname: 172.18.0.5 Hello from behind Envoy (service 1)! hostname: c5b9f1289e0f resolvedhostname: 172.18.0.6 ``` 我們看到對 service1 的已經有負載均衡了,使用的策略是 `round_robin`,這些都是在 `front-envoy.yaml` 文件中的 `cluster` 項下配置的。 ### admin 端點 訪問 <http://localhost:8001> 可以看到 Envoy admin 提供以下管理 API 端點。 | 命令 | 描述 | | -------------------- | ---------------------------------------- | | / | Admin 主頁 | | /certs | 打印機器上的 certs | | /clusters | upstream cluster 狀態 | | /config_dump | 輸出當前的 Envoy 配置 | | /cpuprofiler | 開啟/關閉 CPU profiler | | /healthcheck/fail | 導致服務失敗健康檢查 | | /healthcheck/ok | 導致服務通過健康檢查 | | /help | 打印管理命令的幫助信息 | | /hot_restart_version | 打印熱重啟兼容版本 | | /listeners | 打印 listener 地址 | | /logging | 查詢/更改日志級別 | | /quitquitquit | 退出服務 | | /reset_counters | 將計數器重置為 1 | | /runtime | 打印運行時值 | | /runtime_modify | 修改運行時值 | | /server_info | 打印服務器版本/狀態信息 | | /stats | 打印服務器狀態統計信息 | | /stats/prometheus | 打印 prometheus 格式的服務器狀態統計信息 | Envoy 提供了 API 管理端點,可以對 Envoy 進行動態配置,參考 [v2 API reference](https://www.envoyproxy.io/docs/envoy/latest/api-v2/api)。 ## 參考 - [Front proxy](https://www.envoyproxy.io/docs/envoy/latest/start/sandboxes/front_proxy)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看