<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>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # Envoy mesh 教程 **注意:本書中的 Service Mesh 章節已不再維護,請轉到 [istio-handbook](https://jimmysong.io/istio-handbook) 中瀏覽。** 本文是在 Kubernetes 集群中,使用 Envoy 來做 mesh,來為一個簡單的使用 Python 編寫的 Flask 應用程序做反向代理和負載均衡。 **注**:本教程中的示例來自 [envoy-steps](https://github.com/datawire/envoy-steps),本文中使用的所有的代碼和 YAML 配置見 [envoy-tutorial](https://github.com/rootsongjc/envoy-tutorial)。 ![Envoy Mesh架構圖](https://box.kancloud.cn/c9c1d4de724b299aca38d2a200296872_1724x1468.png) ## 前提條件 使用 [kubernetes-vagrant-centos-cluster](https://github.com/rootsongjc/kubernetes-vagrant-centos-cluster) 部署 kubernetes 集群,只要啟動集群并安裝了 CoreDNS 即可,無須安裝其他插件。 ## 部署應用 我們首先將應用部署到 Kubernetes 中。 部署 postgres 數據庫。 ```bash kubectl apply -f postgres ``` 創建 usersvc 鏡像。 ```bash docker build -t jimmysong/usersvc:step1 . ``` 部署 usersvc。 ```bash kubectl apply -f usersvc ``` 查看 uservc 的 ClusterIP 地址。 ```bash $ kubectl get svc usersvc kubectl get svc usersvc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE usersvc ClusterIP 10.254.176.248 <none> 5000/TCP 11m ``` 進到 node1 中訪問該服務,因為我們要訪問的是 ClusterIP,在我們自己的電腦上是無法直接訪問的,所以進到虛擬機中操作。 ```bash $ vagrant ssh node1 $ curl 10.254.176.248:5000 { "hostname": "usersvc-7cf5bb9d85-9gx7w", "msg": "user health check OK", "ok": true, "resolvedname": "172.33.10.7" } ``` 嘗試添加一個名為 `Alice` 的用戶。 ```bash $ curl -X PUT -H "Content-Type: application/json" \ -d '{ "fullname": "Alice", "password": "alicerules" }' \ 10.254.176.248/user/alice ``` 將會看到類似如下的輸出。 ```json { "fullname": "Alice", "hostname": "usersvc-7cf5bb9d85-9gx7w", "ok": true, "resolvedname": "172.33.10.7", "uuid": "EF43B475F65848C6BE708F436305864B" } ``` 嘗試再添加一個名為 `Bob` 的用戶。 ```bash $ curl -X PUT -H "Content-Type: application/json" \ -d '{ "fullname": "Bob", "password": "bobrules" }' \ 10.254.176.248/user/bob ``` 將會看到類似如下的輸出。 ```json { "fullname": "Bob", "hostname": "usersvc-7cf5bb9d85-9gx7w", "ok": true, "resolvedname": "172.33.10.7", "uuid": "6AC944E7D4254D9A811A82C0FDAC3046" } ``` 當應用部署完畢后,我們該部署 edge envoy 了。 ## 部署 edge envoy 部署 edge envoy 的方式很簡單,執行下面的命令。 ```bash kubectl apply -f edge-envoy ``` 現在訪問 edge envoy 是就可以路由到 `usersvc` 上的,當然直接訪問 `usersvc` 也是可以的。 我們看下 edge-envoy 的 envoy 配置文件定義。 ```json { "listeners": [ { "address": "tcp://0.0.0.0:80", "filters": [ { "type": "read", "name": "http_connection_manager", "config": { "codec_type": "auto", "stat_prefix": "ingress_http", "route_config": { "virtual_hosts": [ { "name": "backend", "domains": ["*"], "routes": [ { "timeout_ms": 0, "prefix": "/user", "cluster": "usersvc" } ] } ] }, "filters": [ { "type": "decoder", "name": "router", "config": {} } ] } } ] } ], "admin": { "access_log_path": "/dev/null", "address": "tcp://127.0.0.1:8001" }, "cluster_manager": { "clusters": [ { "name": "usersvc", "connect_timeout_ms": 250, "type": "strict_dns", "service_name": "usersvc", "lb_type": "round_robin", "features": "http2", "hosts": [ { "url": "tcp://usersvc:80" } ] } ] } } ``` 客戶端訪問 `edge-envoy` 的 `ClusterIP:8000/user/health` 就可以檢查節點的健康狀況。 ## 部署 usersvc2 刪除原來的 `usersvc`,部署第二版 `usersvc2`,它與原來的 `usersvc` 唯一不同的地方是在 `entrypoint` 中集成了 envoy,查看 `Dockerfile` 中指定的 `entrypoint.sh` 的內容便可知。 ```bash #!/bin/sh python /application/service.py & /usr/local/bin/envoy -c /application/envoy.json ``` 首先刪除老的 `usersvc`。 ```bash kubectl delete -f usersvc ``` 使用下面的命令部署 `usersvc2`,它仍然使用 `usersvc` 這個 service 名稱。 ```bash kubectl apply -f usersvc2 ``` Envoy 以 out-of-process 的方式運行,對應用進程沒有侵入性,也可以使用 sidecar 的方式運行,讓 envoy 與 應用容器運行在同一個 pod 中。 增加 `usersvc2` 的實例個數。 ```bash kubectl scale --replicas=3 deployment/usersvc ``` 此時我們有 3 個 usersvc 實例,現在通過 `edge-envoy` 的 `ClusterIP:8000/user/health` 檢查節點的健康狀況時,是不是會輪詢的訪問到后端的的 `usersvc2` 的實例呢? 我們當初在 `edge-node` 的 `envoy.json` 中配置過 cluster 的,其中指定了 `lb_type` 為 `round_robin` 。 ```json "cluster_manager": { "clusters": [ { "name": "usersvc", "connect_timeout_ms": 250, "type": "strict_dns", "service_name": "usersvc", "lb_type": "round_robin", "features": "http2", "hosts": [ { "url": "tcp://usersvc:80" } ] } ] } ``` 而且該 `serivce_name` 也可以被 DNS 正確解析。 ```bash root@usersvc-55b6857d44-gcg5c:/application# nslookup usersvc Server: 10.254.0.2 Address: 10.254.0.2#53 Name: usersvc.envoy-tutorial.svc.cluster.local Address: 10.254.123.166 ``` **答案是否定的。** 雖然通過 DNS 可以正確的解析出 serivce 的 ClusterIP,但是負載均衡不再通過 kube-proxy 實現,所以不論我們訪問多少次 `edge-envoy` 永遠只能訪問到一個固定的后端 `usersvc`。 ## 服務發現服務 - SDS Kubernetes 中的 DNS 可以發現所有 serivce 的 ClusterIP,但是 DNS 中不包括所有 endpoint 地址,我們需要一個 SDS(服務發現服務)來發現服務的所有的 endpoint,我們將修改 `lb_type`,使用 `sds` 替代 `strict_dns`。 執行下面的命令部署 SDS。 ```bash kubectl apply -f usersvc-sds ``` 因為在添加了 SDS 之后需要修改 `edge-envoy` 中的 `envoy.josn` 配置,在 `clusters` 字段中增加 `sds` 信息,我們將所有的配置都寫好了,重新打包成了鏡像,我們需要先刪除之前部署的 `edge-envoy`。 ```bash kubectl delete -f edge-envoy ``` 部署新的 `edge-envoy2`。 ```bash kubectl apply -f edge-envoy2 ``` 連續訪問 `usersvc` 12 次看看輸出結果如何。 ```bash URL=http://172.17.8.101:30800/user/alice for i in `seq 1 12`;do curl -s $URL|grep "resolvedname"|tr -d " "|tr -d ","|tr -d '"';done ``` 我們可以看到類似如下的輸出: ```ini resolvedname:172.33.71.2 resolvedname:172.33.88.2 resolvedname:172.33.10.2 resolvedname:172.33.71.2 resolvedname:172.33.88.2 resolvedname:172.33.10.2 resolvedname:172.33.71.2 resolvedname:172.33.88.2 resolvedname:172.33.10.2 resolvedname:172.33.71.2 resolvedname:172.33.88.2 resolvedname:172.33.10.2 ``` 再查看下 `usersvc` 服務的所有 pod 的 IP 地址。 ```bash $ kubectl get pod -l service=usersvc -o wide NAME READY STATUS RESTARTS AGE IP NODE usersvc-55b6857d44-mkfpv 1/1 Running 0 9m 172.33.88.2 node1 usersvc-55b6857d44-q98jg 1/1 Running 0 9m 172.33.71.2 node2 usersvc-55b6857d44-s2znk 1/1 Running 0 9m 172.33.10.2 node3 ``` 我們看到 round-robin 負載均衡生效了。 ## 參考 - [Part 2: Deploying Envoy with a Python Flask webapp and Kubernetes](https://www.datawire.io/envoyproxy/envoy-flask-kubernetes/) - [envoy-steps](https://github.com/datawire/envoy-steps) - [kubernetes-vagrant-centos-cluster](https://github.com/rootsongjc/kubernetes-vagrant-centos-cluster) - [envoy-tutorial](https://github.com/rootsongjc/envoy-tutorial)
                  <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>

                              哎呀哎呀视频在线观看