k8s~envoy的部署

參考文檔

envoy與後端應用關係圖

當在Kubernetes中使用Envoy作爲邊緣代理時,通常會將Envoy部署爲一個Sidecar容器,與後端服務共同運行在同一個Pod中。以下是一個簡單的關係圖示意:

  +----------------------+
  |       Kubernetes     |
  |        Cluster       |
  +----------|-----------+
             |
             |
  +----------v-----------+
  |                      |
  |        Pod           |
  |                      |
  | +------------------+ |
  | |      Envoy       | |
  | +------------------+ |
  | |   Sidecar Proxy  | |
  | +--------|---------+ |
  |          |           |
  | +--------v---------+ |
  | |   Backend App   | |
  | +------------------+ |
  |                      |
  +----------------------+

在這個示意圖中,我們有一個運行在Kubernetes中的Pod,其中包含了Envoy和後端服務兩個容器。Envoy作爲Sidecar代理與後端服務一起運行,負責處理流量轉發、負載均衡、安全策略等功能。後端服務則是實際提供業務功能的應用程序。

這種部署模式可以讓Envoy直接與後端服務通信,而不需要對後端服務本身進行任何修改。同時,由於Envoy作爲Sidecar容器與後端服務共享相同的網絡命名空間,因此它可以輕鬆地監控和管理後端服務的流量。

構建envoy

在 Kubernetes 中使用 Envoy 作爲負載均衡器通常涉及以下步驟:

  1. 創建 Envoy 部署: 首先,你需要在 Kubernetes 中創建一個 Envoy 的 Deployment,這將運行 Envoy 代理的實例。你可以使用 YAML 文件定義 Deployment,確保在容器規範中將 Envoy 作爲容器運行。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: envoy-deployment
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: envoy
      template:
        metadata:
          labels:
            app: envoy
        spec:
          containers:
              - name: envoy
                image: envoyproxy/envoy
                ports:
                 - name: http
                   containerPort: 80 #envoy路由的端口
                 - name: envoy-admin
                   containerPort: 9901 #envoy後臺管理系統端口
                volumeMounts:
                 - name: envoy-config-101
                   mountPath: "/etc/envoy"
                   readOnly: true
          volumes:
           - name: envoy-config-101
             configMap:
               name: envoy-config-101
               
    
  2. 創建 Envoy 服務: 爲 Envoy 創建一個 Kubernetes Service,以便其他應用程序可以通過該 Service 連接到 Envoy 負載均衡器。這通常是一個 ClusterIP Service。

    apiVersion: v1
    kind: Service
    metadata:
      name: envoy-service
    spec:
      selector:
        app: envoy
      type: NodePort
      ports:
      - protocol: TCP
        port: 9901 
        name: http
      - protocol: TCP
        port: 80 
        name: admin
    
  3. 配置 Envoy: 你需要提供 Envoy 配置文件,以定義路由、後端服務和其他負載均衡規則。通常,你會使用 ConfigMap 來存儲 Envoy 配置。

  4. Sidecar 模式: 另一種常見的做法是將 Envoy 作爲應用容器的 Sidecar 容器部署,這使得每個應用容器都有一個附加的 Envoy 容器,用於處理負載均衡。

    apiVersion: v1
    kind: Pod
    metadata:
      name: my-pod
    spec:
      containers:
      - name: my-app
        image: my-app-image
        ports:
        - containerPort: 8080
      - name: envoy
        image: envoyproxy/envoy
        ports:
        - containerPort: 80
    
  5. 配置服務發現: 爲了讓 Envoy 知道要負載均衡的後端服務,你需要配置服務發現。這通常包括使用 Kubernetes 的服務名和端口。

  • 注意envoy景象的版本對應的端口可能不同
    • envoyproxy/envoy:v1.21-latest,對應10000端口
    • envoyproxy/envoy 對應80端口
  • envoy.yaml代碼如下
admin:
  access_log_path: /tmp/admin_access.log
  address:
    socket_address: { address: 0.0.0.0, port_value: 9901 } #envoy後臺系統的端口

static_resources:
  listeners:
  - name: listener_0
    address:
      socket_address: { address: 0.0.0.0, port_value: 80 } #envoy路由的端口
    filter_chains:
    - filters:
      - name: envoy.http_connection_manager
        config:
          stat_prefix: ingress_http
          route_config:
            name: local_route
            virtual_hosts:
            - name: local_service
              domains: ["*"]
              routes:
              - match: { prefix: "/" }
                route: {cluster: myapp_cluster, timeout: 60s }
          http_filters:
          - name: envoy.router
  clusters:
  - name: myapp_cluster
    connect_timeout: 0.25s
    type: STRICT_DNS
    dns_lookup_family: V4_ONLY
    lb_policy: LEAST_REQUEST
    hosts: #具體應用myapp的地址和端口
    - socket_address:
        address: 192.168.1.3
        port_value: 30021
    - socket_address:
        address: 192.168.1.4
        port_value: 30022
    # 健康檢查配置,以下配置之後,會把不在httpstatus不在200~399之間的服務離線,不讓它請求流量
    health_checks:
      - timeout: 1s
        interval: 10s
        unhealthy_threshold: 3
        healthy_threshold: 2
        http_health_check:
          path: "/"
          expected_statuses: 
            start: 200
            end: 399


  • kubectl create configmap envoy-config-101 --from-file=envoy.yaml
  1. 監控和健康檢查: 可以配置 Envoy 以執行健康檢查,並監控後端服務的可用性。這有助於確保只有健康的實例接收流量。

  2. 部署應用: 最後,將你的應用部署到 Kubernetes 集羣,並確保它們使用 Envoy 服務進行負載均衡。

這是一個高級概述,實際配置和部署取決於你的具體需求和環境。你可能需要創建適合你應用程序的 Envoy 配置文件,定義路由規則,配置健康檢查等。同時,Envoy 提供了豐富的文檔,可以幫助你深入瞭解如何在 Kubernetes 中使用它作爲負載均衡器。

envoy健康檢查配置

Envoy可以使用健康檢查來確定服務實例的可用性,如果服務實例被標記爲不健康,Envoy將停止將流量路由到該實例。以下是如何配置Envoy來執行健康檢查的一般步驟:

  1. 定義健康檢查配置:
    在Envoy的配置文件中,你需要定義健康檢查的配置。通常,這是通過cluster配置完成的,其中包括health_checks字段。
static_resources:
  clusters:
    - name: my_service
      connect_timeout: 0.25s
      type: STATIC
      hosts:
        - socket_address:
            address: 192.168.1.3
            port_value: 30021
        - socket_address:
            address: 192.168.1.4
            port_value: 8080
      health_checks:
          - timeout: 1s
            interval: 10s
            unhealthy_threshold: 3
            healthy_threshold: 2
            http_health_check:
              path: "/"
              expected_statuses: 
                start: 200
                end: 399

在上述示例中,我們爲名爲my_service的集羣定義了健康檢查。它將定期發送HTTP請求檢查每個服務實例的健康狀況。

  1. 指定健康檢查協議:
    你可以根據需要選擇適當的健康檢查協議,如HTTP、TCP或gRPC。在上述示例中,我們使用了HTTP健康檢查。

  2. 定義健康檢查路徑和間隔:
    在健康檢查配置中,你需要指定要發送的健康檢查請求路徑和檢查的時間間隔。這些參數可以根據你的需求進行配置。

  3. 處理失敗:
    如果健康檢查失敗,Envoy將標記服務實例爲不健康,並停止將流量路由到該實例。你可以配置失敗的閾值、重試次數等參數。

  4. 監控和日誌:
    你可以使用監控和日誌工具來監視健康檢查的結果,以便了解服務實例的狀態和健康情況。

通過這些配置,Envoy將根據健康檢查的結果自動管理流量路由,確保不健康的服務實例不再接收流量,從而提高系統的穩定性和可用性。

hosts和load_assignment的使用場景

在Envoy的配置中,hosts 和 load_assignment 是兩個不同的部分,用於定義集羣的成員和它們的負載分配。

hosts

hosts 部分用於直接指定集羣的成員(後端服務的 IP 地址和端口)。
你需要顯式地列出每個後端服務的 IP 地址和端口。
這是一種靜態定義方式,通常用於管理一組已知的後端服務,其中的成員不會經常變化。

  • 示例:
hosts:
  - socket_address:
      address: 192.168.1.1
      port_value: 8080
  - socket_address:
      address: 192.168.1.2
      port_value: 8080

load_assignment

load_assignment 部分用於更動態地定義集羣的成員,通常與服務發現系統集成,如Consul、etcd、ZooKeeper等。
它不需要顯式列出每個後端服務,而是通過服務發現來動態獲取成員信息。
這是一種靈活的方式,適用於環境中服務實例的動態變化,因爲它能夠自動感知新的服務實例並將它們添加到集羣。

  • 示例:
    load_assignment:
      cluster_name: my_cluster
      endpoints:
        - lb_endpoints:
            - endpoint:
                address:
                  socket_address:
                    address: my-service.example.com
                    port_value: 8080
            - endpoint:
                address:
                  socket_address:
                    address: my-service2.example.com
                    port_value: 8080

總之,hosts 是一種手動定義後端服務的靜態方式,而 load_assignment 則適用於與服務發現系統集成,以便更動態地管理集羣成員。選擇哪種方式取決於你的環境和需求。

cluster.type配置項

在 Envoy 中,clusters 是用於定義與後端服務通信的配置部分。clusters 可以採用不同的類型,包括 STRICT_DNSstatic

  1. STRICT_DNS:

    • STRICT_DNS 是一種 Cluster 類型,它允許 Envoy 根據 DNS 查詢來動態地解析後端服務的主機名。
    • 這意味着你可以使用主機名來配置後端服務,而不需要爲每個後端服務器指定靜態 IP 地址或端口。
    • Envoy將根據DNS查詢的結果動態更新後端服務器的地址。
  2. static:

    • static 是另一種 Cluster 類型,它允許你明確地定義後端服務的 IP 地址和端口。
    • 這意味着你需要手動指定後端服務器的詳細信息,包括 IP 地址和端口。
    • 這種配置適用於靜態集羣,其中後端服務器的地址不會經常更改。

選擇使用哪種 Cluster 類型取決於你的應用需求。如果你的後端服務的 IP 地址可能會發生變化,或者你想要動態地擴展或縮減後端服務,那麼STRICT_DNS 是一個不錯的選擇。而如果你的後端服務是靜態的,並且你願意手動配置它們的 IP 地址和端口,那麼 static 可能更適合。

總之,Cluster 配置允許你有效地管理 Envoy 與後端服務之間的通信,無論是通過 DNS 動態解析還是通過靜態配置。

clusters.lb_policy配置項

在 Envoy 的 Cluster 配置中,lb_policy 是負載均衡策略的設置,用於決定如何分發請求給後端服務的成員。以下是一些可能的 lb_policy 選項以及它們的含義:

  1. round_robin(默認值):

    • 這是最常見的負載均衡策略。
    • 它按照順序逐個將請求分發給後端服務的成員,確保每個成員都接收到大致相等數量的請求。
  2. least_request

    • 這個策略會將請求分發給當前具有最少請求的後端服務成員。
    • 這對於負載不均衡的情況非常有用,可以確保將請求發送到負載較低的服務器。
  3. ring_hash

    • 這個策略使用哈希函數來將請求映射到後端服務器。
    • 這可以確保特定的請求將一致地路由到相同的後端服務器,適用於會話保持等情況。
  4. random

    • 這個策略會隨機地選擇後端服務器來處理請求。
    • 這種策略在某些特定的場景下可能有用,但通常不太常見。
  5. original_dst

    • 這個策略基於請求中的原始目標地址來路由請求。
    • 它適用於代理透明性或 L4/L3 代理的情況,通常在 TCP/UDP 代理中使用。

選擇合適的負載均衡策略取決於你的應用需求和後端服務的特性。例如,如果後端服務的負載不均衡,你可以選擇least_request。如果需要會話保持,可以使用ring_hash。通常情況下,round_robin 是一種簡單且有效的策略,適用於多數情況。

注意,具體的負載均衡策略的可用性可能取決於 Envoy 版本,所以確保查閱與你所使用的 Envoy 版本相關的文檔以獲取詳細信息。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章