設定航點代理
航點代理是基於 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"
或者,您可以使用 kubectl
將 istio.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-site
的 ServiceEntry
以使用名為 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