Gateway API adalah API routing dan load balancing generasi berikutnya untuk Kubernetes. Topik ini menjelaskan cara mengonfigurasi rute HTTP, memodifikasi header permintaan, dan mendistribusikan permintaan berdasarkan bobot dalam kluster ACK Edge menggunakan komponen Gateway with Inference Extension.
Cara kerja
Komponen Gateway with Inference Extension didasarkan pada proyek Envoy Gateway dan mendukung semua fitur dasar Gateway API serta sumber daya ekstensi Envoy Gateway.
Arsitektur Envoy Gateway mencakup:
Control plane: Control plane terdiri dari komponen Envoy Gateway yang mendengarkan aturan lalu lintas dalam kluster, membuat dan mengelola instans proxy Envoy secara dinamis, serta memperbarui aturan pengalihan secara real time. Control plane tidak langsung meneruskan lalu lintas layanan.
Data plane: Data plane terdiri dari instans proxy Envoy yang memproses dan meneruskan lalu lintas layanan.
Dalam kluster ACK Edge, metode penerapan Envoy Gateway berbeda dibandingkan dengan kluster ACK standar:
Perbedaan | ACK Standar | ACK Edge |
Metode eksposur layanan | LoadBalancer | NodePort |
Penerapan control plane | Tingkat kluster | Satu set diterapkan per kelompok node |
Penerapan data plane | Tingkat kluster | Diterapkan berdasarkan kelompok node |
Banyak kelompok node | Berbagi satu gateway | Harus membuat gateway terpisah untuk setiap kelompok node |
Topologi layanan | Tidak perlu konfigurasi | Memerlukan anotasi |
Penerapan saat ini dikonfigurasi dengan kebijakan distribusi kelompok node. Anda dapat menyesuaikan jumlah replika dalam manajemen komponen untuk memastikan bahwa setidaknya satu replika control plane berjalan di setiap kelompok node.

Lingkup
Anda telah membuat kluster versi 1.30 atau yang lebih baru.
Komponen Gateway with Inference Extension telah diinstal.
Persiapan
Langkah 1: Buat aplikasi uji coba
Simpan contoh berikut sebagai backend.yaml dan jalankan perintah kubectl apply -f backend.yaml untuk membuat aplikasi uji coba: backend dan backend-2.
Untuk skenario ACK Edge, Anda harus mengonfigurasi topologi layanan. Tambahkan anotasi openyurt.io/topologyKeys: openyurt.io/nodepool ke Service untuk memastikan bahwa lalu lintas hanya diteruskan ke Pod dalam kelompok node yang sama. Untuk informasi selengkapnya, lihat Manajemen topologi layanan kelompok node.apiVersion: v1
kind: ServiceAccount
metadata:
name: backend
---
apiVersion: v1
kind: Service
metadata:
name: backend
annotations:
openyurt.io/topologyKeys: openyurt.io/nodepool # Konfigurasikan topologi kelompok node
labels:
app: backend
service: backend
spec:
ports:
- name: http
port: 3000
targetPort: 3000
selector:
app: backend
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: backend
spec:
replicas: 1
selector:
matchLabels:
app: backend
version: v1
template:
metadata:
labels:
app: backend
version: v1
spec:
serviceAccountName: backend
containers:
- image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/envoygateway-echo-basic:v20231214-v1.0.0-140-gf544a46e
imagePullPolicy: IfNotPresent
name: backend
ports:
- containerPort: 3000
env:
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: backend-2
---
apiVersion: v1
kind: Service
metadata:
name: backend-2
annotations:
openyurt.io/topologyKeys: openyurt.io/nodepool # Konfigurasikan topologi kelompok node
labels:
app: backend-2
service: backend-2
spec:
ports:
- name: http
port: 3000
targetPort: 3000
selector:
app: backend-2
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: backend-2
spec:
replicas: 1
selector:
matchLabels:
app: backend-2
version: v1
template:
metadata:
labels:
app: backend-2
version: v1
spec:
serviceAccountName: backend-2
containers:
- image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/envoygateway-echo-basic:v20231214-v1.0.0-140-gf544a46e
imagePullPolicy: IfNotPresent
name: backend-2
ports:
- containerPort: 3000
env:
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespaceLangkah 2: Konfirmasi GatewayClass
Setelah Anda menginstal komponen Gateway with Inference Extension, sebuah GatewayClass dibuat secara default. Jalankan perintah berikut untuk mengonfirmasi:
kubectl get gatewayclassOutput yang diharapkan:
NAME CONTROLLER ACCEPTED AGE
ack-gateway gateway.envoyproxy.io/gatewayclass-controller True 2m31sJika sumber daya GatewayClass tidak ditemukan, Anda dapat membuatnya secara manual. Simpan contoh berikut sebagai gatewayclass.yaml dan jalankan perintah kubectl apply -f gatewayclass.yaml untuk membuatnya.
apiVersion: gateway.networking.k8s.io/v1
kind: GatewayClass
metadata:
name: ack-gateway
spec:
controllerName: gateway.envoyproxy.io/gatewayclass-controllerLangkah 3: Buat konfigurasi EnvoyProxy kustom
Dalam kluster ACK Edge, Anda dapat membuat konfigurasi EnvoyProxy kustom untuk setiap kelompok node guna menentukan kelompok node penjadwalan untuk Pod data plane dan metode eksposur layanan.
Ganti NPXXX dalam contoh berikut dengan ID kelompok node aktual Anda. Kemudian, simpan konfigurasi sebagai gateway-config.yaml dan jalankan perintah kubectl apply -f gateway-config.yaml.
Anda dapat menemukan ID kelompok node di halaman di Konsol ACK.
apiVersion: gateway.envoyproxy.io/v1alpha1
kind: EnvoyProxy
metadata:
name: custom-proxy-config
spec:
provider:
type: Kubernetes
kubernetes:
envoyDeployment:
pod:
nodeSelector:
alibabacloud.com/nodepool-id: NPXXX # Ganti dengan ID kelompok node aktual Anda
envoyService:
annotations:
openyurt.io/topologyKeys: openyurt.io/nodepool # Konfigurasikan topologi layanan
type: NodePort # ACK Edge menggunakan NodePort untuk mengekspos layananKonfigurasi ini mencakup tiga pengaturan utama untuk skenario ACK Edge:
Item konfigurasi | Deskripsi |
| Menjadwalkan Pod data plane gateway ke kelompok node yang ditentukan |
Anotasi | Mengonfigurasi topologi layanan untuk memastikan trafik tetap berada dalam kelompok node |
| Menggunakan NodePort untuk mengekspos layanan. LoadBalancer tidak digunakan dalam skenario edge. |
Langkah 4: Buat resource Gateway
Simpan contoh berikut sebagai gateway.yaml dan jalankan perintah kubectl apply -f gateway.yaml.
Control plane komponen secara otomatis membuat deployment EnvoyProxy dan layanan NodePort berdasarkan resource Gateway. Komponen ini juga memulai listener pada port yang ditentukan di node tersebut.
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
name: ack-gateway
spec:
gatewayClassName: ack-gateway
listeners:
- name: http
protocol: HTTP
port: 80
infrastructure:
parametersRef:
group: gateway.envoyproxy.io
kind: EnvoyProxy
name: custom-proxy-config # Asosiasikan dengan konfigurasi kustom yang dibuat di Langkah 3Langkah 5: Dapatkan titik akhir gateway
Layanan gateway diekspos sebagai NodePort. Titik akhir layanan yang sesuai adalah alamat IP salah satu node dalam kelompok node dan port layanannya.
Kueri port layanan.
kubectl get service -n kube-system -l gateway.envoyproxy.io/owning-gateway-name=ack-gatewayOutput yang diharapkan:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE envoy-default-ack-gateway-7452df7d NodePort 192.168.86.174 <none> 80:30364/TCP 19mAnda dapat mengatur variabel lingkungan host gateway. Ganti
NODEIPdengan alamat IP salah satu node dalam kelompok node danNODEPORTdengan nomor port yang diperoleh pada langkah sebelumnya.export GATEWAY_HOST=NODEIP:NODEPORT