設定航點代理

航點代理是基於 Envoy 的代理的可選部署,用於將第 7 層 (L7) 處理新增至定義的一組工作負載。

路徑點代理程式的安裝、升級和擴展都獨立於應用程式;應用程式擁有者應該不會意識到它們的存在。相較於 資料平面 模式(在每個工作負載旁運行一個 Envoy 代理程式實例),所需的代理程式數量可以大幅減少。

一個路徑點或一組路徑點可以由具有相似安全邊界的應用程式共享。這可能是特定工作負載的所有實例,或是命名空間中的所有工作負載。

Sidecar 模式相反,在 ambient 模式中,策略由目的地路徑點強制執行。在許多方面,路徑點充當資源(命名空間、服務或 Pod)的閘道。Istio 強制所有進入資源的流量都必須經過路徑點,然後該路徑點會強制執行該資源的所有策略。

您需要航點代理嗎?

ambient 的分層方法允許使用者以更漸進的方式採用 Istio,從沒有網格平穩過渡到安全的 L4 覆蓋層,再到完整的 L7 處理。

ambient 模式的大部分功能由 ztunnel 節點代理程式提供。Ztunnel 的範圍僅限於在第 4 層 (L4) 處理流量,以便它可以安全地作為共享元件運作。

當您設定重新導向到路徑點時,流量將由 ztunnel 轉發到該路徑點。如果您的應用程式需要以下任何 L7 網格功能,您將需要使用路徑點代理程式

  • 流量管理:HTTP 路由和負載平衡、斷路、速率限制、故障注入、重試、逾時
  • 安全性:基於 L7 原語(例如請求類型或 HTTP 標頭)的豐富授權策略
  • 可觀測性:HTTP 指標、存取記錄、追蹤

部署航點代理

路徑點代理程式使用 Kubernetes Gateway 資源部署。

請注意,Kubernetes Gateway API CRD 預設不會安裝在大多數 Kubernetes 叢集上,因此請確保在 使用 Gateway API 之前安裝它們

$ kubectl get crd gateways.gateway.networking.k8s.io &> /dev/null || \
  { kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.2.0/standard-install.yaml; }

您可以使用 istioctl waypoint 子命令來產生、套用或列出這些資源。

部署路徑點後,必須註冊整個命名空間(或您選擇的任何服務或 Pod)才能使用它。

在為特定命名空間部署路徑點代理程式之前,請確認該命名空間已標記為 istio.io/dataplane-mode: ambient

$ kubectl get ns -L istio.io/dataplane-mode
NAME              STATUS   AGE   DATAPLANE-MODE
istio-system      Active   24h
default           Active   24h   ambient

istioctl 可以為路徑點代理程式產生 Kubernetes Gateway 資源。例如,為 default 命名空間產生名為 waypoint 的路徑點代理程式,它可以處理命名空間中服務的流量

$ istioctl waypoint generate --for service -n default
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  labels:
    istio.io/waypoint-for: service
  name: waypoint
  namespace: default
spec:
  gatewayClassName: istio-waypoint
  listeners:
  - name: mesh
    port: 15008
    protocol: HBONE

請注意,Gateway 資源已將 istio-waypoint 標籤設定為 gatewayClassName,表示它是 Istio 提供的路徑點。Gateway 資源已標記為 istio.io/waypoint-for: service,表示路徑點可以處理服務的流量,這是預設值。

若要直接部署路徑點代理程式,請使用 apply 而不是 generate

$ istioctl waypoint apply -n default
waypoint default/waypoint applied

或者,您可以部署產生的 Gateway 資源

$ kubectl apply -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  labels:
    istio.io/waypoint-for: service
  name: waypoint
  namespace: default
spec:
  gatewayClassName: istio-waypoint
  listeners:
  - name: mesh
    port: 15008
    protocol: HBONE
EOF

套用 Gateway 資源後,Istiod 將會監控該資源,並自動為使用者部署和管理對應的路徑點部署和服務。

航點流量類型

依預設,路徑點只會處理以其命名空間中的服務為目標的流量。做出此選擇是因為直接指向 Pod 的流量很少見,而且通常用於內部目的,例如 Prometheus 抓取,而且可能不需要 L7 處理的額外開銷。

路徑點也可以處理所有流量、只處理直接傳送到叢集中的工作負載(Pod 或 VM)的流量,或完全不處理流量。將重新導向至路徑點的流量類型由 Gateway 物件上的 istio.io/waypoint-for 標籤決定。

使用 --for 引數到 istioctl waypoint apply 來變更可以重新導向至路徑點的流量類型

waypoint-for原始目的地類型
服務Kubernetes 服務
工作負載Pod IP 或 VM IP
全部服務和工作負載流量
沒有流量(適用於測試)

路徑點選擇會根據流量原始位址的目的地類型(服務工作負載)發生。如果流量定址到沒有路徑點的服務,則不會經過路徑點:即使它最終到達的工作負載確實有附加的路徑點。

使用航點代理

部署路徑點代理程式時,在您明確設定這些資源以使用它之前,任何資源都不會使用它。

若要啟用命名空間、服務或 Pod 以使用路徑點,請新增 istio.io/use-waypoint 標籤,並將路徑點名稱作為值。

如果您使用 istioctl 部署命名空間路徑點,您可以使用 --enroll-namespace 參數自動標記命名空間

$ istioctl waypoint apply -n default --enroll-namespace
waypoint default/waypoint applied
namespace default labeled with "istio.io/use-waypoint: waypoint"

或者,您可以使用 kubectlistio.io/use-waypoint: waypoint 標籤新增至 default 命名空間

$ kubectl label ns default istio.io/use-waypoint=waypoint
namespace/default labeled

在命名空間註冊為使用路徑點之後,任何使用 ambient 資料平面模式的 Pod 對於該命名空間中執行的任何服務發出的任何請求,都將會透過路徑點路由以進行 L7 處理和策略強制執行。

如果您偏好比使用整個命名空間的路徑點更精細的控制,您可以只註冊特定的服務或 Pod 以使用路徑點。如果您只需要命名空間中某些服務的 L7 功能,如果您只想將像 WasmPlugin 的擴充功能套用到特定服務,或如果您透過其 Pod IP 位址呼叫 Kubernetes 無頭服務,這可能會很有用。

設定服務以使用特定的航點

使用範例 bookinfo 應用程式中的服務,我們可以為 reviews 服務部署一個名為 reviews-svc-waypoint 的路徑點

$ istioctl waypoint apply -n default --name reviews-svc-waypoint
waypoint default/reviews-svc-waypoint applied

reviews 服務標記為使用 reviews-svc-waypoint 路徑點

$ kubectl label service reviews istio.io/use-waypoint=reviews-svc-waypoint
service/reviews labeled

網格中 Pod 對 reviews 服務的任何請求現在都會透過 reviews-svc-waypoint 路徑點路由。

設定 Pod 以使用特定的航點

reviews-v2 Pod 部署一個名為 reviews-v2-pod-waypoint 的路徑點。

$ istioctl waypoint apply -n default --name reviews-v2-pod-waypoint --for workload
waypoint default/reviews-v2-pod-waypoint applied

reviews-v2 Pod 標記為使用 reviews-v2-pod-waypoint 路徑點

$ kubectl label pod -l version=v2,app=reviews istio.io/use-waypoint=reviews-v2-pod-waypoint
pod/reviews-v2-5b667bcbf8-spnnh labeled

ambient 網格中 Pod 對 reviews-v2 Pod IP 的任何請求現在都會透過 reviews-v2-pod-waypoint 路徑點路由以進行 L7 處理和策略強制執行。

跨命名空間的航點使用

開箱即用,路徑點代理程式可供同一命名空間內的資源使用。從 Istio 1.23 開始,可以在不同的命名空間中使用路徑點。在本節中,我們將檢視啟用跨命名空間使用所需的閘道設定,以及如何設定您的資源以使用來自不同命名空間的路徑點。

設定跨命名空間使用的航點

若要啟用路徑點的跨命名空間使用,應將 Gateway 設定為允許來自其他命名空間的路由

以下 Gateway 將允許名為「cross-namespace-waypoint-consumer」的命名空間中的資源使用此 egress-gateway

kind: Gateway
metadata:
  name: egress-gateway
  namespace: common-infrastructure
spec:
  gatewayClassName: istio-waypoint
  listeners:
  - name: mesh
    port: 15008
    protocol: HBONE
    allowedRoutes:
      namespaces:
        from: Selector
        selector:
          matchLabels:
            kubernetes.io/metadata.name: cross-namespace-waypoint-consumer

設定資源以使用跨命名空間的航點代理

依預設,Istio 控制平面將會尋找使用 istio.io/use-waypoint 標籤指定的路徑點,該路徑點與套用該標籤的資源位於相同的命名空間中。可以透過新增一個新標籤 istio.io/use-waypoint-namespace,使用另一個命名空間中的路徑點。istio.io/use-waypoint-namespace 適用於所有支援 istio.io/use-waypoint 標籤的資源。這兩個標籤一起分別指定您的路徑點的名稱和命名空間。例如,若要設定名為 istio-siteServiceEntry 以使用名為 egress-gateway 且位於名為 common-infrastructure 的命名空間中的路徑點,您可以使用以下命令

$ kubectl label serviceentries.networking.istio.io istio-site istio.io/use-waypoint=egress-gateway
serviceentries.networking.istio.io/istio-site labeled
$ kubectl label serviceentries.networking.istio.io istio-site istio.io/use-waypoint-namespace=common-infrastructure
serviceentries.networking.istio.io/istio-site labeled

清理

您可以透過執行以下操作,從命名空間中移除所有路徑點

$ istioctl waypoint delete --all -n default
$ kubectl label ns default istio.io/use-waypoint-

移除 Kubernetes Gateway API CRD

$ kubectl delete -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.2.0/standard-install.yaml
此資訊是否對您有幫助?
您是否有任何改進建議?

感謝您的意見回饋!