Gerbang masuk (ingress gateway) merupakan titik masuk lalu lintas tunggal untuk layanan dalam instans Service Mesh (ASM) Anda. Jika seluruh Pod gerbang berjalan pada node atau zona yang sama, kegagalan pada node atau zona tersebut akan menyebabkan seluruh gerbang mati dan memblokir seluruh lalu lintas masuk (inbound traffic). Mendistribusikan Pod gerbang di berbagai node atau zona menghilangkan titik kegagalan tunggal ini dan menjaga aliran lalu lintas tetap berjalan selama gangguan infrastruktur.
Pendekatan yang digunakan tergantung pada tipe kluster Anda:
| Tipe kluster | Strategi | Alasan |
|---|---|---|
| Kluster ACK | Pod anti-affinity | Menyebarluaskan Pod di berbagai node atau zona melalui aturan penjadwalan Kubernetes |
| Kluster ACK Serverless | Anotasi Pod ECI | Pod anti-affinity tidak didukung di kluster serverless; gunakan distribusi berbasis zona melalui vSwitch sebagai gantinya |
Prasyarat
Sebelum memulai, pastikan Anda telah:
Membuat instans ASM. Untuk informasi lebih lanjut, lihat Buat instans ASM.
Membuat kluster Container Service for Kubernetes (ACK) atau kluster ACK Serverless. Lihat Buat kluster ACK yang dikelola atau Buat kluster ACK Serverless.
Distribusikan Pod gerbang di kluster ACK
Konfigurasikan kebijakan pod anti-affinity dalam resource IstioGateway Anda untuk mencegah penjadwal (scheduler) menempatkan beberapa Pod gerbang pada node atau zona yang sama.
Pilih batasan penjadwalan
Kubernetes menyediakan dua mode anti-affinity. Pilih berdasarkan kapasitas kluster Anda:
| Mode | Nama field | Perilaku | Kapan digunakan |
|---|---|---|---|
| Soft (default) | preferredDuringSchedulingIgnoredDuringExecution | Penjadwal berusaha mematuhi aturan ini tetapi tetap menjadwalkan Pod jika tidak ada node yang memenuhi syarat | Jumlah node terbatas atau bervariasi karena autoscaling |
| Hard | requiredDuringSchedulingIgnoredDuringExecution | Penjadwal secara ketat menegakkan aturan ini; Pod tetap dalam status pending jika tidak ada node yang memenuhi syarat | Kluster memiliki cukup node untuk menjamin satu Pod per node atau zona |
Contoh di bawah menggunakan batasan soft. Untuk beralih ke batasan hard, ganti preferredDuringSchedulingIgnoredDuringExecution dengan requiredDuringSchedulingIgnoredDuringExecution serta hapus field weight.
Sebarkan Pod di berbagai node
Atur topologyKey menjadi kubernetes.io/hostname agar setiap node menjalankan paling banyak satu Pod gerbang:
apiVersion: istio.alibabacloud.com/v1beta1
kind: IstioGateway
metadata:
name: ingressgateway-1
namespace: istio-system
spec:
clusterIds:
- "c954ee9df88f64f229591f0ea4c61****"
cpu:
targetAverageUtilization: 80
externalTrafficPolicy: Local
maxReplicas: 4
minReplicas: 2
ports:
- name: status-port
port: 15020
targetPort: 15020
- name: http2
port: 80
targetPort: 80
- name: https
port: 443
targetPort: 80
- name: tls
port: 15443
targetPort: 15443
replicaCount: 1
resources:
limits:
cpu: '2'
memory: 2G
requests:
cpu: 200m
memory: 256Mi
sds:
enabled: true
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 2000m
memory: 1024Mi
serviceType: LoadBalancer
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- podAffinityTerm:
labelSelector:
matchExpressions:
- key: app
operator: In
values:
- istio-ingressgateway-1 # Harus sesuai dengan label app gerbang
topologyKey: kubernetes.io/hostname # Satu Pod per node
weight: 100
rollingMaxSurge: "100%"
rollingMaxUnavailable: "25%"Sebarkan Pod di berbagai zona
Untuk mendistribusikan Pod di berbagai zona ketersediaan (availability zones) alih-alih di node individual, ubah topologyKey menjadi topology.kubernetes.io/zone. Semua field lain tetap sama:
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- podAffinityTerm:
labelSelector:
matchExpressions:
- key: app
operator: In
values:
- istio-ingressgateway-1
topologyKey: topology.kubernetes.io/zone # Satu Pod per zona
weight: 100Distribusi tingkat zona melindungi dari gangguan yang mencakup seluruh zona, tetapi memerlukan kluster Anda mencakup beberapa zona. Distribusi tingkat node sudah cukup jika semua node berada dalam satu zona.
Referensi field anti-affinity
| Field | Deskripsi |
|---|---|
preferredDuringSchedulingIgnoredDuringExecution | Anti-affinity soft. Penjadwal lebih memilih mematuhi aturan ini tetapi tidak memblokir penjadwalan jika tidak ada node yang memenuhi syarat. |
requiredDuringSchedulingIgnoredDuringExecution | Anti-affinity hard. Penjadwal secara ketat menegakkan aturan ini. Pod tetap dalam status pending jika tidak ada node yang memenuhi syarat. |
matchExpressions | Memilih Pod berdasarkan label. Dalam contoh ini, key: app, operator: In, values: istio-ingressgateway-1 menargetkan Pod dengan label app=istio-ingressgateway-1. |
topologyKey | Menentukan cakupan aturan anti-affinity. Atur ke kubernetes.io/hostname untuk distribusi tingkat node atau topology.kubernetes.io/zone untuk distribusi tingkat zona. |
weight | Prioritas aturan ini (1–100). Bobot 100 memberikan prioritas tertinggi selama penjadwalan. Hanya berlaku untuk anti-affinity soft. |
Distribusikan Pod gerbang di kluster ACK Serverless
Kluster ACK Serverless tidak mendukung pod anti-affinity karena Pod berjalan sebagai instans Elastic Container Instance (ECI) tanpa node tetap. Sebagai gantinya, gunakan anotasi Pod untuk mendistribusikan Pod ECI di berbagai zona.
Konfigurasikan beberapa zona dalam kluster ACK Serverless Anda. Untuk informasi lebih lanjut, lihat Buat ECI di berbagai zona.
Tambahkan
podAnnotationske resourceIstioGatewayAnda untuk mengaitkan gerbang dengan vSwitch di berbagai zona:Anotasi Deskripsi k8s.aliyun.com/eci-vswitchID vSwitch yang termasuk dalam virtual private cloud (VPC) dari zona yang akan dikaitkan. Setiap vSwitch berada di zona berbeda, sehingga Pod didistribusikan di zona-zona tersebut. k8s.aliyun.com/eci-schedule-strategyStrategi penjadwalan untuk Pod ECI. VSwitchRandommenetapkan Pod ECI ke zona secara acak.apiVersion: istio.alibabacloud.com/v1beta1 kind: IstioGateway metadata: name: ingressgateway namespace: istio-system spec: clusterIds: - "c954ee9df88f64f229591f0ea4c61****" cpu: targetAverageUtilization: 80 externalTrafficPolicy: Local maxReplicas: 4 minReplicas: 2 ports: - name: status-port port: 15020 targetPort: 15020 - name: http2 port: 80 targetPort: 80 - name: https port: 443 targetPort: 80 - name: tls port: 15443 targetPort: 15443 replicaCount: 1 resources: limits: cpu: '2' memory: 2G requests: cpu: 200m memory: 256Mi sds: enabled: true resources: requests: cpu: 100m memory: 128Mi limits: cpu: 2000m memory: 1024Mi serviceType: LoadBalancer podAnnotations: k8s.aliyun.com/eci-vswitch: "vsw-bp1b07j0miob3khtn****,vsw-bp12b85hh323se8ft****" k8s.aliyun.com/eci-schedule-strategy: "VSwitchRandom" rollingMaxSurge: "100%" rollingMaxUnavailable: "25%"
Langkah tambahan untuk meningkatkan ketersediaan
Distribusi Pod hanyalah salah satu lapisan ketersediaan gerbang masuk. Untuk lingkungan produksi, pertimbangkan menggabungkannya dengan langkah-langkah berikut:
| Ukuran | Tujuan |
|---|---|
HorizontalPodAutoscaler | Secara otomatis mengubah jumlah Pod gerbang berdasarkan penggunaan CPU atau memori. Resource IstioGateway sudah mendukung fitur ini melalui minReplicas, maxReplicas, dan cpu.targetAverageUtilization. |
| Pemeriksaan kesehatan dan pemantauan | Pantau status Pod gerbang dan siapkan alert untuk restart Pod atau kegagalan penjadwalan guna mendeteksi masalah ketersediaan sedini mungkin. |