Istio Ambient Mesh và Kubernetes Gateway API 2026 - Service Mesh không Sidecar cho Microservices Production

Posted on: 4/16/2026 2:16:59 PM

Table of contents

  1. 1. Vì sao mô hình Sidecar đã hết thời cho Service Mesh
    1. Ambient Mesh là gì nếu nói một câu
  2. 2. Hai trụ cột năm 2026: Gateway API và Ambient Mesh
    1. 2.1. Gateway API giải vấn đề north-south
    2. 2.2. Ambient Mesh giải vấn đề east-west
      1. Triết lý "pay-as-you-go" của Ambient
  3. 3. Bóc tách ztunnel: per-node proxy và giao thức HBONE
    1. 3.1. HBONE — vì sao không dùng mTLS trực tiếp?
    2. 3.2. So sánh ztunnel với sidecar Envoy cũ
  4. 4. Waypoint Proxy — Khi nào bật L7 và chi phí đi kèm
    1. 4.1. Khai báo Waypoint
    2. 4.2. Authorization: khác biệt giữa L4 (ztunnel) và L7 (Waypoint)
      1. Cảnh báo triển khai AuthorizationPolicy L7 mà quên Waypoint
  5. 5. Di chuyển từ Sidecar Mesh sang Ambient — Chiến lược an toàn
    1. Mô hình dual-stack trong pha 2
  6. 6. Gateway API v1.2 — Những tính năng mới đáng chú ý
    1. 6.1. GRPCRoute — Routing gRPC đúng nghĩa
    2. 6.2. Canary/A-B native qua weight
    3. 6.3. Policy Attachment — Gắn policy theo chuẩn
    4. 6.4. GAMMA — Gateway API for Mesh
  7. 7. Observability trong Ambient — Telemetry không sidecar thì lấy dữ liệu ở đâu?
    1. Mẹo cho team có log pipeline riêng
  8. 8. Ambient Mesh vs Cilium Service Mesh — Hai triết lý cạnh tranh
  9. 9. Pattern Production — Bốn kiểu deployment thường gặp
    1. 9.1. Pattern A — Chỉ Gateway API, không mesh
    2. 9.2. Pattern B — Gateway API + Ambient ztunnel (L4 only)
    3. 9.3. Pattern C — Ambient + Waypoint chọn lọc
    4. 9.4. Pattern D — Multi-cluster với Ambient
  10. 10. Tích hợp .NET 10 Microservices với Ambient + Gateway API
    1. Trace propagation xuyên mesh
  11. 11. Bí quyết Production — Mười việc nên làm ngay
  12. 12. Tổng kết — Mesh trở thành hạ tầng "vô hình"
    1. Nguồn tham khảo

1. Vì sao mô hình Sidecar đã hết thời cho Service Mesh

Suốt 6 năm từ khi Istio trình làng mô hình sidecar proxy, cộng đồng cloud-native coi đó là chuẩn không thể thay thế: mỗi pod có thêm một container Envoy, chặn toàn bộ traffic in/out để làm mTLS, routing, telemetry. Mô hình này thanh lịch về lý thuyết nhưng đắt trong thực tế: một cluster 3.000 pod sẽ có 3.000 Envoy chạy song song, tiêu tốn 15–25% CPU và hàng chục GB RAM chỉ để làm proxy. Mỗi lần upgrade mesh đều buộc phải restart toàn bộ pod, và các job ngắn như CronJob thường bị mắc kẹt vì sidecar không chịu tắt.

Năm 2025, Istio 1.24 đưa Ambient Mesh lên production GA, và đầu 2026 Istio 1.26 khép lại hành trình chuyển đổi bằng bản thay thế hoàn toàn: không còn sidecar, không còn iptables redirect, không còn Envoy injected vào mỗi pod. Thay vào đó là kiến trúc hai tầng ztunnel (per-node L4 proxy) + Waypoint (per-namespace L7 proxy). Song song với đó, Kubernetes Gateway API v1.2 đã chín muồi — thay thế Ingress bằng một API khai báo đúng nghĩa, có role separation giữa platform team và application team. Bài này phân tích hai trụ cột đó dưới lăng kính kiến trúc hệ thống, cách chúng kết hợp để tạo ra một data plane sạch sẽ hơn nhiều cho microservices năm 2026.

-72%CPU overhead so với sidecar (ztunnel chia sẻ per-node)
-85%Memory footprint khi chạy 1.000+ pod nhỏ
v1.2Gateway API hiện tại, v1.3 alpha với Mesh conformance
HBONEGiao thức tunnel L4 thay cho mTLS trực tiếp

Ambient Mesh là gì nếu nói một câu

Ambient Mesh là cách triển khai service mesh không xâm lấn pod ứng dụng: thay vì nhét một proxy vào mỗi container, platform team cài một ztunnel trên mỗi node và (tùy chọn) một Waypoint proxy per namespace. App team không phải thay đổi Deployment, không mount volume, không chờ sidecar khởi động — mesh trở thành một lớp hạ tầng thực sự "ambient" quanh workload.

2. Hai trụ cột năm 2026: Gateway API và Ambient Mesh

Trước khi bóc kiến trúc, cần hiểu rõ quan hệ giữa Kubernetes Gateway API và Istio Ambient. Chúng không phải hai lớp cùng giải một bài toán; chúng giải hai bài toán khác nhau nhưng bổ sung chặt:

flowchart LR
    EXT(["External traffic
Internet"]) subgraph CLUSTER["Kubernetes cluster"] GW["Gateway API
L7 ingress
TLS termination
Routing to Services"] subgraph MESH["Ambient Mesh"] ZT1["ztunnel
node-1"] ZT2["ztunnel
node-2"] WP["Waypoint proxy
per namespace"] APP1["App A
pod"] APP2["App B
pod"] ZT1 --> APP1 ZT2 --> APP2 APP1 -. "HBONE L4 mTLS" .-> ZT1 ZT1 -. "HBONE" .-> ZT2 ZT2 -. "L7 policy" .-> WP WP -. "decision" .-> APP2 end end EXT --> GW GW --> ZT1

Hình 1: Gateway API đứng ở rìa cluster lo ingress, Ambient Mesh lo east-west giữa các service bên trong

2.1. Gateway API giải vấn đề north-south

Ingress cũ của Kubernetes có ba khuyết điểm chí mạng: (1) spec quá nghèo, buộc mọi vendor đưa tính năng vào annotations dạng string; (2) không phân biệt vai trò giữa người cấu hình hạ tầng và người sở hữu ứng dụng; (3) không có khái niệm multi-protocol — chỉ HTTP/HTTPS. Gateway API đưa ra ba tài nguyên CRD mới tách bạch concern:

  • GatewayClass — do platform team/infrastructure provider định nghĩa, ví dụ istio, cilium, envoy-gateway. Nó mô tả "tôi có loại gateway nào ở đây".
  • Gateway — do platform team tạo ra, là instance thực sự có IP/LoadBalancer. Nó bind vào một GatewayClass, khai báo listener (HTTPS:443, TCP:5432, UDP:53...).
  • HTTPRoute/GRPCRoute/TCPRoute/TLSRoute/UDPRoute — do app team tạo ra, attach vào Gateway qua parentRef, định nghĩa rule routing chi tiết.

Lợi ích kiến trúc rất rõ: một platform team có thể chuẩn bị một cụm Gateway đạt chuẩn (WAF, mTLS, DDoS) cho toàn công ty, còn từng app team chỉ cần viết HTTPRoute gắn vào Gateway đó mà không phải cấu hình lại LB. Điều mà Ingress + annotations không bao giờ làm được sạch sẽ.

# platform team - 1 lan
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  name: public-gateway
  namespace: infra-gateways
spec:
  gatewayClassName: istio
  listeners:
    - name: https
      port: 443
      protocol: HTTPS
      hostname: "*.anhtu.dev"
      tls:
        mode: Terminate
        certificateRefs:
          - name: anhtu-wildcard-cert
      allowedRoutes:
        namespaces:
          from: Selector
          selector:
            matchLabels: { shared-gateway-access: "true" }
# app team - tu viet cho service cua minh
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: blog-route
  namespace: blog
spec:
  parentRefs:
    - name: public-gateway
      namespace: infra-gateways
  hostnames: ["blog.anhtu.dev"]
  rules:
    - matches: [{ path: { type: PathPrefix, value: "/" } }]
      backendRefs:
        - name: blog-svc
          port: 80
          weight: 90
        - name: blog-svc-canary
          port: 80
          weight: 10

2.2. Ambient Mesh giải vấn đề east-west

Trong khi Gateway API lo traffic đi vào cluster từ bên ngoài, phần lớn traffic thực ra chạy giữa các service bên trong: service A gọi service B, B gọi database, B gọi message queue, B gọi một LLM gateway. Đây là domain của service mesh. Ambient Mesh tách mesh đó thành hai layer độc lập:

  • Secure overlay layer (ztunnel): per-node DaemonSet, làm mTLS/authn và L4 routing. Mọi pod opt-in vào mesh đều đi qua ztunnel node của mình, không cần sidecar.
  • Waypoint layer (Envoy): per-namespace hoặc per-service-account Deployment riêng, làm L7 routing, retry, header transform, authorization chi tiết. Bật tùy nhu cầu — nhiều service chỉ cần L4 mTLS là đủ và không phải trả tiền cho Envoy L7.

Triết lý "pay-as-you-go" của Ambient

Sidecar buộc bạn trả toàn bộ chi phí Envoy dù chỉ cần mTLS. Ambient cho phép tầng hóa chi phí: mặc định mọi workload chỉ có ztunnel (rẻ, C++/Rust, footprint MB). Khi nào cần L7 policy (retry theo status, rate-limit theo header, JWT check) mới bật Waypoint cho namespace đó. Đây là thay đổi tư duy rất quan trọng: mesh trở thành tính năng có thể bật từng phần thay vì all-in from day one.

3. Bóc tách ztunnel: per-node proxy và giao thức HBONE

ztunnel (viết tắt của "zero-trust tunnel") là thành phần quan trọng nhất của Ambient. Nó là một DaemonSet chạy một pod per node, viết bằng Rust trên nền tokiohyper, không dùng Envoy để giữ footprint cực nhỏ (~40MB RAM/node điển hình). Nhiệm vụ của nó có bốn gạch đầu dòng:

  1. Khi pod ứng dụng trên node có label istio.io/dataplane-mode: ambient, ztunnel sẽ intercept traffic out/in của pod đó bằng cách phối hợp với CNI (qua istio-cni plugin). Không còn iptables rules rải khắp pod.
  2. Nó làm mTLS với ztunnel của node khác, thiết lập tunnel L4 theo chuẩn HBONE (HTTP-Based Overlay Network Environment). HBONE dùng HTTP/2 CONNECT qua TLS — một lựa chọn khôn ngoan vì traffic đó đi qua được firewall và load balancer bình thường.
  3. Nó gắn identity (SPIFFE ID như spiffe://cluster.local/ns/blog/sa/api) vào mỗi kết nối, để xa hơn có thể làm authorization dựa trên workload identity, không phụ thuộc IP.
  4. Nó xuất TCP metrics + logs qua OpenTelemetry, bao gồm bytes, connections, L4 latency. Đủ để observability cơ bản trước khi bật Waypoint.
sequenceDiagram
    participant App1 as App A pod
ns blog participant ZT1 as ztunnel node-1 participant ZT2 as ztunnel node-2 participant App2 as App B pod
ns payment App1->>ZT1: TCP out (capture via CNI) ZT1->>ZT1: Lookup destination
Attach SPIFFE ID ZT1->>ZT2: HBONE CONNECT over mTLS
HTTP or 2 ZT2->>ZT2: Verify peer cert
Apply L4 AuthorizationPolicy ZT2->>App2: Plaintext TCP (inside node) App2-->>ZT2: Response ZT2-->>ZT1: HBONE stream ZT1-->>App1: TCP response Note over ZT1,ZT2: mTLS luon, khong phu thuoc app

Hình 2: Luồng kết nối cross-node qua HBONE — ztunnel chặn ở node ra, mở ở node đích

3.1. HBONE — vì sao không dùng mTLS trực tiếp?

Câu hỏi hợp lý: nếu mục đích là mTLS L4, tại sao không để ztunnel mở mTLS thẳng trên TCP? Lý do nằm ở metadata. HBONE dùng HTTP/2 CONNECT nên ztunnel có thể gửi kèm header Baggage, X-Forwarded-Client-Cert, peer metadata — những thứ Envoy cần khi Waypoint đứng chen giữa để làm L7 policy. Ngoài ra HTTP/2 multiplex nhiều stream trên một TCP connection, giảm số kết nối ztunnel↔ztunnel xuống còn O(node-pairs) thay vì O(pod-pairs).

3.2. So sánh ztunnel với sidecar Envoy cũ

Tiêu chíSidecar Envoyztunnel (Ambient)
Vị trí1 container trong mỗi pod1 DaemonSet pod per node
Ngôn ngữC++ (Envoy)Rust (tokio, hyper)
RAM tiêu biểu50–120 MB/pod40–80 MB/node (dù có 50 pod)
CPU overhead5–10% mỗi pod khi idle1–2% tổng cho mỗi node
Startup time2–5s trước khi app ready0s — ztunnel có sẵn khi pod start
Upgrade meshRestart toàn bộ podRestart ztunnel DaemonSet — app không bị ảnh hưởng
Job ngắnCronJob mắc kẹt vì sidecarJob tắt sạch ngay
L7 capabilityCó sẵn trong mỗi sidecarPhải bật Waypoint riêng

4. Waypoint Proxy — Khi nào bật L7 và chi phí đi kèm

ztunnel cố tình không biết gì về HTTP, gRPC, header, method. Đây là lựa chọn thiết kế: giữ L4 path siêu nhẹ và an toàn, nhường mọi logic L7 cho một Envoy chuyên dụng gọi là Waypoint. Waypoint là một Deployment Envoy độc lập, có tên, có namespace, có HPA riêng, có resource request/limit riêng. Bạn bật nó khi nào thật sự cần.

4.1. Khai báo Waypoint

apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  name: waypoint
  namespace: payment
  labels:
    istio.io/waypoint-for: service   # hoac 'workload', 'all'
spec:
  gatewayClassName: istio-waypoint
  listeners:
    - name: mesh
      port: 15008
      protocol: HBONE

Chỉ cần tạo Gateway với gatewayClassName: istio-waypoint, Istio control plane sẽ sinh ra Deployment Envoy riêng cho namespace payment. Từ giờ mọi request đi vào namespace đó sẽ được ztunnel chuyển qua Waypoint để áp rule L7, thay vì gửi thẳng đến pod đích.

4.2. Authorization: khác biệt giữa L4 (ztunnel) và L7 (Waypoint)

Đây là chi tiết dễ sai khi mới chuyển sang Ambient. AuthorizationPolicy được áp ở tầng nào phụ thuộc field bạn dùng:

Rule typeThực thi tạiCần Waypoint?
from.source.principals (SPIFFE ID)ztunnel — L4Không
from.source.namespacesztunnel — L4Không
to.operation.portsztunnel — L4Không
to.operation.methods (GET, POST)Waypoint — L7
to.operation.pathsWaypoint — L7
when.key: request.headersWaypoint — L7
JWT request.auth.claimsWaypoint — L7

Cảnh báo triển khai AuthorizationPolicy L7 mà quên Waypoint

Nếu bạn viết policy yêu cầu header/JWT nhưng namespace đó không có Waypoint, policy đó sẽ không được áp — traffic vẫn đi qua ztunnel L4 và hoàn toàn bỏ qua rule L7. Istio sẽ log warning nhưng không từ chối tạo policy. Hãy viết script CI kiểm tra: nếu trong namespace có AuthorizationPolicy với spec L7, phải tồn tại Waypoint Gateway với istio.io/waypoint-for phù hợp.

5. Di chuyển từ Sidecar Mesh sang Ambient — Chiến lược an toàn

Hầu hết team năm 2026 vẫn có cluster sản xuất chạy sidecar Istio và không thể big-bang. May mắn là Istio 1.26 hỗ trợ coexistence: sidecar và Ambient cùng chạy trong một cluster. Chiến lược migration 4 pha đã được nhiều team kiểm chứng:

Pha 1 — Tuần 1 đến 2
Cài song song. Chạy istioctl install --set profile=ambient, Istio sẽ cài thêm ztunnel DaemonSet và istio-cni, đồng thời giữ istiod hiện tại. Không namespace nào được bật ambient label. Sidecar vẫn hoạt động bình thường.
Pha 2 — Tuần 3 đến 4
Chọn pilot namespace. Thường là namespace ít traffic, ít policy (ví dụ staging-payment). Tắt sidecar injection, thêm label istio.io/dataplane-mode: ambient. Quan sát metrics 1 tuần. Kiểm tra AuthorizationPolicy L7 nào cần Waypoint.
Pha 3 — Tháng 2
Mở rộng theo service-tier. Chuyển lần lượt từng namespace sản xuất từ sidecar sang ambient, tuân thủ quy tắc "mỗi đợt không quá 20% workload". Với mỗi namespace bật ambient, review toàn bộ VirtualService/DestinationRule cũ — nhiều rule chỉ cần thiết khi có sidecar và có thể xóa.
Pha 4 — Tháng 3
Gỡ sidecar hoàn toàn. Khi mọi namespace đã ambient, tắt istio-injection và gỡ webhook. ztunnel trở thành data plane duy nhất. Upgrade Gateway API từ v1beta1 sang v1, chuyển các Ingress legacy sang HTTPRoute.

Mô hình dual-stack trong pha 2

Trong giai đoạn chuyển đổi, một service ambient có thể vẫn phải gọi sang service sidecar và ngược lại. Istio xử lý bằng cách để ztunnel và sidecar trao đổi HBONE trực tiếp — peer-to-peer nhận diện qua protocol negotiation. Bạn không cần cấu hình gì thêm. Nhưng hãy tắt PeerAuthentication mode: STRICT ở mesh level trong thời gian này; dùng PERMISSIVE để tránh gãy kết nối pod ambient gọi pod chưa ambient.

6. Gateway API v1.2 — Những tính năng mới đáng chú ý

Gateway API không chỉ thay Ingress, nó đang bắt đầu thay cả một phần VirtualServiceDestinationRule của Istio. Năm 2026 có bốn tính năng đáng học:

6.1. GRPCRoute — Routing gRPC đúng nghĩa

Trước đây muốn route gRPC theo method phải dùng Envoy filter hoặc Istio VirtualService. Gateway API v1.1+ có GRPCRoute GA:

apiVersion: gateway.networking.k8s.io/v1
kind: GRPCRoute
metadata:
  name: user-grpc
  namespace: api
spec:
  parentRefs: [{ name: public-gateway, namespace: infra-gateways }]
  hostnames: ["api.anhtu.dev"]
  rules:
    - matches:
        - method: { service: "user.v1.UserService", method: "GetProfile" }
      backendRefs:
        - name: user-svc
          port: 9090

6.2. Canary/A-B native qua weight

Không cần Flagger hay Argo Rollouts cho canary đơn giản — Gateway API hỗ trợ backendRefs[].weight. Kết hợp với script CI hoặc controller như Rollout v1.8 (đã hỗ trợ Gateway API 2025) có thể auto-shift traffic theo SLO từ OpenTelemetry.

6.3. Policy Attachment — Gắn policy theo chuẩn

Thay vì mỗi vendor đẻ ra CRD riêng cho rate-limit, retry, timeout, Gateway API định nghĩa pattern Policy Attachment: một policy CRD có targetRef trỏ tới Gateway/HTTPRoute. Istio 1.26 dùng pattern này cho RequestAuthentication, AuthorizationPolicy, Telemetry, WasmPlugin. Cilium Service Mesh cũng tuân thủ. Nhờ đó học một API dùng được mọi vendor.

# timeout policy dung chuan Gateway API
apiVersion: gateway.networking.k8s.io/v1alpha2
kind: BackendTrafficPolicy   # vi du, ten co the khac tuy vendor
metadata:
  name: user-svc-timeout
spec:
  targetRefs:
    - group: ""
      kind: Service
      name: user-svc
  timeouts:
    request: 5s
    backendRequest: 3s
  retry:
    attempts: 3
    perTryTimeout: 1s
    retryOn: [5xx, reset, connect-failure]

6.4. GAMMA — Gateway API for Mesh

GAMMA (Gateway API Mesh) là SIG ghép Gateway API vào east-west. Ý tưởng: thay vì dùng VirtualService trong mesh, app team dùng HTTPRoute cùng API cho cả north-south và east-west. Istio 1.26 đã tương thích. Đây là hướng rõ ràng cho tương lai — một ngôn ngữ cho mọi loại routing, dù là từ Internet vào hay giữa service trong mesh.

flowchart LR
    NS1["HTTPRoute
north-south
parentRef Gateway"] NS2["HTTPRoute
east-west
parentRef Service"] GW["Gateway
north-south ingress"] SVC["Service
east-west parent"] MESH["Ambient Mesh
ztunnel + Waypoint"] NS1 --> GW NS2 --> SVC GW --> MESH SVC --> MESH

Hình 3: GAMMA — cùng một kind HTTPRoute, chỉ khác parentRef (Gateway cho N/S, Service cho E/W)

7. Observability trong Ambient — Telemetry không sidecar thì lấy dữ liệu ở đâu?

Điểm lo lắng phổ biến: "không có sidecar thì ai sinh request metrics?" Câu trả lời: dữ liệu được tách theo tầng.

  • L4 metrics (bytes, connections, RTT, TLS handshake time) — ztunnel sinh và export qua OTLP. Đủ để biết nguồn-đích, volume, và phát hiện peer cert bất thường.
  • L7 metrics (request count theo status, p50/p95/p99 latency, request size) — Waypoint sinh nếu namespace có bật. Không có Waypoint thì không có L7 metrics cho traffic đó.
  • Trace — ztunnel và Waypoint đều inject/propagate W3C traceparent. Nếu app đã instrument OpenTelemetry SDK, trace đi xuyên mesh mượt mà.
  • Access log — ztunnel xuất log L4 (JSON lines), Waypoint xuất Envoy access log. Gửi chung qua OTLP hoặc Loki.

Cấu hình Telemetry CRD đã được cập nhật để phân biệt rõ tầng:

apiVersion: telemetry.istio.io/v1
kind: Telemetry
metadata:
  name: l4-default
  namespace: istio-system
spec:
  tracing:
    - providers: [{ name: otel }]
      randomSamplingPercentage: 5
  metrics:
    - providers: [{ name: prometheus }]
      overrides:
        - match: { mode: CLIENT_AND_SERVER }   # ap cho ca ztunnel va Waypoint
          tagOverrides:
            destination_workload: { operation: UPSERT, value: "%{ENVIRONMENT(APP_NAME, unknown)}" }

Mẹo cho team có log pipeline riêng

Nếu bạn đang xuất Envoy access log sang ClickHouse hoặc Loki, chú ý schema log của ztunnel khác Envoy: ztunnel dùng format JSON phẳng với các field src.workload, dst.workload, bytes_sent, duration. Mapping sang schema cũ cần thêm một tầng transform trong OpenTelemetry Collector — thường là transform processor viết OTTL. Đừng quên cập nhật dashboard Grafana hiện có, vì một số tên trường sẽ đổi.

8. Ambient Mesh vs Cilium Service Mesh — Hai triết lý cạnh tranh

2026 ghi dấu cuộc "đua song mã" về mesh không sidecar giữa Istio Ambient và Cilium Service Mesh. Hai cách tiếp cận dựa trên triết lý rất khác nhau:

Tiêu chíIstio AmbientCilium Service Mesh
Nền tảng data planeUserspace ztunnel (Rust) + Envoy WaypointeBPF trong kernel + Envoy (cho L7)
mTLSTLS ở userspace (ztunnel)WireGuard hoặc IPsec ở kernel + SPIFFE
Protocol tunnelHBONE (HTTP/2 CONNECT)VXLAN/Geneve + WireGuard native
L7 authWaypoint (Envoy)Envoy hoặc eBPF filter hạn chế
CNITương thích mọi CNICilium chính là CNI (thay Calico/Flannel)
Ưu điểmLinh hoạt, vendor-neutral, API chuẩn GAMMAHiệu năng kernel, observability L3/L4 rất sâu
Nhược điểmUserspace hop khi qua WaypointKhóa vào Cilium CNI, cập nhật eBPF rủi ro kernel
Phù hợp nhấtCluster đã dùng Istio, đa vendorCluster greenfield, workload mạng-heavy

Không có câu trả lời đúng-sai. Team đã đầu tư vào Istio thường chuyển Ambient với chi phí đổi rất nhẹ. Team xây cluster mới và yêu thích eBPF nên xem xét Cilium, đặc biệt khi có nhu cầu quan sát network depth. Quan trọng là cả hai đều chấp nhận Gateway API, nên phần north-south không phụ thuộc lựa chọn mesh.

9. Pattern Production — Bốn kiểu deployment thường gặp

9.1. Pattern A — Chỉ Gateway API, không mesh

Phù hợp cho startup dưới 20 microservice, traffic hầu hết là north-south. Cài Istio Gateway hoặc Envoy Gateway làm ingress, không cài ztunnel. mTLS giữa các service xử lý ở tầng ứng dụng qua OAuth2 hoặc pre-shared JWT. Tiết kiệm tối đa chi phí và rủi ro vận hành.

9.2. Pattern B — Gateway API + Ambient ztunnel (L4 only)

Phù hợp khi team cần mTLS mesh-wide nhưng chưa có nhu cầu L7 policy phức tạp. Bật ambient mode cho toàn mesh, không tạo Waypoint. Chi phí gần bằng pattern A nhưng mọi kết nối đã mã hóa + có identity.

9.3. Pattern C — Ambient + Waypoint chọn lọc

Pattern phổ biến nhất cho cluster trung bình. Mặc định mọi namespace chỉ có ztunnel. Bật Waypoint cho các namespace "sensitive": payment, auth, admin — nơi cần authorize theo path, retry chi tiết, rate-limit theo JWT claim. Chi phí Waypoint chỉ áp dụng cho phần nhỏ workload.

9.4. Pattern D — Multi-cluster với Ambient

Istio 1.26 hỗ trợ multi-cluster ambient qua East-West Gateway (một Gateway đặc biệt giữa hai cluster). Traffic từ cluster A sang cluster B đi qua ztunnel A → E/W Gateway A → E/W Gateway B → ztunnel B → pod đích. HBONE xuyên suốt giúp mTLS end-to-end giữa hai cluster mà không phải expose pod ra Internet.

flowchart LR
    subgraph CA["Cluster A
ap-southeast-1"] A1["App X"] --> ZTA["ztunnel A"] ZTA --> EWA["East-West Gateway A"] end subgraph CB["Cluster B
us-east-1"] EWB["East-West Gateway B"] --> ZTB["ztunnel B"] ZTB --> B1["App Y"] end EWA -. "HBONE mTLS
over Internet" .-> EWB

Hình 4: Multi-cluster Ambient — hai cluster kết nối qua East-West Gateway, mTLS end-to-end

10. Tích hợp .NET 10 Microservices với Ambient + Gateway API

Đa số team backend .NET khi nghe "service mesh" thường hoài nghi: liệu mesh có thay thế được HttpClient handler, Polly resilience, YARP reverse proxy đã quen thuộc? Thực tế chúng bổ sung cho nhau theo ranh giới rõ:

ConcernGiải ở đâu
mTLS giữa serviceMesh (ztunnel) — app bỏ cấu hình TLS tự ký
Workload identity, SPIFFEMesh — bỏ shared secret trong appsettings
Retry, timeout, circuit breakerƯu tiên Polly trong code .NET (có context app); có thể song song với Waypoint cho các service không sửa được
Rate-limit theo endpointWaypoint (L7)
HTTP header propagation.NET — HttpClient handler
Authentication ingressGateway API + JWT provider
Tracing.NET OpenTelemetry SDK + mesh propagation

Một template Program.cs đơn giản vẫn chạy tốt trong cluster ambient — chỉ cần đảm bảo app expose port đúng và không tự làm TLS giữa service:

// Program.cs - minimal API trong Ambient mesh
var builder = WebApplication.CreateBuilder(args);

builder.Services.AddOpenTelemetry()
    .WithTracing(t => t.AddAspNetCoreInstrumentation()
                        .AddHttpClientInstrumentation()
                        .AddOtlpExporter())
    .WithMetrics(m => m.AddAspNetCoreInstrumentation().AddOtlpExporter());

// Polly cho in-app resilience, me sh lo mTLS + identity
builder.Services.AddHttpClient("user-api", c => c.BaseAddress = new("http://user-svc"))
    .AddStandardResilienceHandler();

var app = builder.Build();
app.MapGet("/profile/{id}", async (int id, IHttpClientFactory f) =>
{
    var http = f.CreateClient("user-api");
    return await http.GetFromJsonAsync<Profile>($"/users/{id}");
});
app.Run();

Điểm quan trọng: gọi http://user-svc (không phải https://) vì traffic sẽ được ztunnel mã hóa qua HBONE tự động. App .NET không biết gì về mesh và đó là mong muốn — nguyên tắc "transparent data plane".

Trace propagation xuyên mesh

.NET 10 OpenTelemetry mặc định dùng W3C traceparent. ztunnel và Waypoint đều forward header đó. Nếu bạn thấy trace "mất" giữa hai service, thường do custom HttpMessageHandler trong code đã strip header — đừng đổ lỗi cho mesh. Kiểm tra DelegatingHandler chain trước.

11. Bí quyết Production — Mười việc nên làm ngay

  1. Chuẩn hóa GatewayClass ở platform level, cấm app team tự tạo Gateway công khai.
  2. Đặt tên Waypoint theo namespace (ví dụ waypoint-payment) để dễ trace và dashboard.
  3. Resource request/limit cho ztunnel: khởi đầu 100m CPU + 128Mi RAM, scale theo bandwidth node.
  4. PodDisruptionBudget cho ztunnel DaemonSet — mất ztunnel là mất mTLS toàn node.
  5. NetworkPolicy chặn port 15008 (HBONE) ngoài cluster, bảo vệ khỏi HBONE spoofing.
  6. Bật PeerAuthentication STRICT sau khi migration xong — ép mTLS bắt buộc.
  7. Ingress qua Gateway API, không mix với Ingress v1 — tránh hai controller cùng nắm cert.
  8. Rate-limit global tại Waypoint cho các API public; rate-limit local cho internal theo SLO.
  9. Sampling trace 5–10% ở mesh, 100% ở app cho request error — tiết kiệm TSDB mà không mất insight.
  10. Chuẩn bị rollback plan cho mỗi pha migration: label istio.io/dataplane-mode- (với dấu trừ) sẽ revert một namespace về sidecar hoặc none.

12. Tổng kết — Mesh trở thành hạ tầng "vô hình"

Istio Ambient Mesh + Kubernetes Gateway API là câu trả lời chín muồi cho bài toán mesh đã chin năm: làm sao để bảo mật, quan sát, và điều hướng traffic giữa hàng nghìn pod mà không bắt app team chịu chi phí vận hành của Envoy sidecar. Kiến trúc hai tầng ztunnel + Waypoint cho phép tầng hóa chi phí — mỗi workload chỉ trả đúng những gì nó cần: mTLS cho mọi người, L7 policy cho một số.

Kết hợp với Gateway API làm chuẩn API đa vendor (Istio, Cilium, Envoy Gateway cùng chấp nhận), cloud-native 2026 lần đầu có một ngôn ngữ thống nhất cho routing từ Internet vào cho tới giữa các service nội bộ. Team .NET/Vue/Go/Rust đều được hưởng lợi: app code ít lo kiến trúc mạng, platform team có điểm kiểm soát duy nhất, security team có audit trail dựa trên workload identity thay vì IP.

Cái hay nhất của Ambient có lẽ không nằm ở các con số performance, mà ở tinh thần: mesh phải là tính năng có thể bật dần từng phần, có thể tháo ra, không phải một cam kết all-in nhốt team vào một lựa chọn cả năm trời. Đó là bài học system design đáng giá nhất cho mọi lớp hạ tầng chúng ta xây dựng — từ mesh, message queue, cho đến AI agent platform.