云原生之旅 - 9)云原生時代網關的后起之秀Envoy Proxy 和基于Envoy 的 Emissary Ingress

前言前一篇文章講述了基于Nginx代理的Kuberenetes Ingress Nginx【云原生時代的網關 Ingress Nginx】這次給大家介紹下基于Envoy的 Emissary Ingress 。
首先什么是Enovy?Envoy 是由 Lyft 開源的高性能網絡代理軟件 , 后來捐贈給了 CNCF 基金會,已經畢業于CNCF 。相比于 Nginx、HAProxy 等經典代理軟件,Envoy 具備豐富的可觀察性和靈活的可擴展性,并且引入了基于 xDS API 的動態配置方案,Envoy 還提供了大量的開箱即用的 Filter 以滿足各種場景下流量治理的需求 。

Envoy 與 Nginx 代理的區別
  • Envoy 對 HTTP/2 的支持比 Nginx 更好,支持包括 upstream 和 downstream在內的雙向通信,而 Nginx 只支持 downstream 的連接 。
  • 高級負載均衡功能是免費的,Nginx 的高級負載均衡功能則需要商業版 Nginx Plus 支持 。
  • Envoy 支持熱更新,Nginx 配置更新之后需要 Reload 。
  • Envoy 更貼近 Service Mesh 的使用習慣,Nginx 更貼近傳統服務的使用習慣 。
Envoy 有典型的兩種工作模式 。一種作為中心代理 , 代理集群的南北向流量 , 這種模式下 , Envoy 一般就是負載均衡設備或者是 API 網關的基礎數據面 , 比如 Ambassador 現在叫 Emissary , Gloo 都是新興的開源的基于 Envoy 的開源網關 。另一種模式 , 就是作為業務進程的 Sidecar,當有業務請求訪問業務的時候,流量會被劫持到 Sidecar Envoy 當中,之后再被轉發給業務進程,典型代表 Istio 和 Linkerd.
今天我們介紹的就是代理南北向流量的網關 Emissary Ingress(原名 Ambassador) 。Emissary-ingress已經是CNCF的孵化項目,并且在去年被頂級服務網狀項目Linkerd和Istio正式支持 。如需集成參考文檔 。
關鍵詞:基于Enovy的Emissary Ingress實踐,Emissary Ingress入門,云原生網關Emissary Ingress,Emissary Ingress實踐
為什么選擇 Emissary Ingresshttps://www.getambassador.io/docs/emissary/latest/about/alternatives/
https://www.getambassador.io/docs/emissary/latest/about/faq/#why-emissary-ingress
安裝使用Terraform Helm Provider從 emissary-ingress 2.1開始, 它把 CRDs 從Helm Charts移除了, 現在首先需要手動 apply CRDs 。
kubectl apply -f https://app.getambassador.io/yaml/emissary/3.2.0/emissary-crds.yaml所以我做了一個Helm Charts 專門裝下CRDs,否則無法全流程安裝自動化 。
如果不了解Helm Chart 請參考這篇文章【Kubernetes時代的包管理工具 Helm】入門 。
resource "helm_release" "emissary_crds" {name= "emissary-crds"create_namespace = true # create emissary default namespace `emissary-system`namespace= local.emissary_nschart= "../common/helm/repos/emissary-crds-8.2.0.tgz"}CRDs是默認裝在`emissary-system` namespace下面的,不建議修改namespace,如果要在不同的Namespace下裝多個Emissary ingress,是可以共用這個CRDs的 。
下面這部分是官方chart# Install Emissary-ingress from Chart Repositoryresource "helm_release" "emissary_ingress" {name= "emissary-ingress"repository= "https://app.getambassador.io"chart= "emissary-ingress"version= local.chart_versioncreate_namespace = truenamespace= local.emissary_nsvalues = [templatefile("${local.common_yaml_d}/emissary-ingress-template.yaml", local.emissary_ingress_map)]depends_on = [helm_release.emissary_crds]}最后一部分,也是自制 chart 專門負責config
# This is for install Host/Listener/Mapping/TLSContext from a local custom chart# also can upload chart to a bucket or a public github for install from a url# e.g. [Publish to a GCS bucket](https://github.com/hayorov/helm-gcs)resource "helm_release" "emissary_config" {name= "emissary-config"namespace = local.emissary_nschart= "../common/helm/repos/emissary-config-8.2.0.tgz"values = [templatefile("${local.common_yaml_d}/emissary-listeners-template.yaml", local.emissary_listeners_map),local.emissary_config_yaml]depends_on = [helm_release.emissary_ingress]}locals 變量
云原生之旅 - 9)云原生時代網關的后起之秀Envoy Proxy 和基于Envoy 的 Emissary Ingress

文章插圖
云原生之旅 - 9)云原生時代網關的后起之秀Envoy Proxy 和基于Envoy 的 Emissary Ingress

文章插圖
locals {project_id= "global-sre-dev"cluster_name= "sre-gke"cluster_region = "us-central1"emissary_ns= "emissary"chart_version= "8.2.0"common_yaml_d= "../common/helm/yamls"ambassador_id= "ambassador"emissary_ingress_map = {ambassadorID= local.ambassador_idloadBalancerIP= "35.232.98.249" # Prepare a Static IP first instead to use EphemeralreplicaCount= 2minReplicas= 2maxReplicas= 3canaryEnabled= false # set to true in ProdlogLevel= "error" # valid log levels are error, warn/warning, info, debug, and traceendpointEnable= trueendpointName= "my-resolver"diagnosticsEnable= falseclusterRequestTimeout = 120000 # milliseconds}emissary_listeners_map = {ambassadorID= local.ambassador_idlistenersEnabled= true # custom listeners}}

推薦閱讀