Gateway API adalah proyek resmi Kubernetes dan API generasi berikutnya untuk routing serta load balancing Kubernetes yang memungkinkan Anda mengonfigurasi aturan lalu lintas. Topik ini menjelaskan cara menggunakan Gateway API untuk mengekspos layanan ke lalu lintas dari luar kluster melalui instans Application Load Balancer (ALB).
Informasi latar belakang
Gateway API adalah kumpulan sumber daya Kubernetes yang digunakan untuk memodelkan lalu lintas jaringan layanan. Tujuan Gateway API adalah menyediakan model jaringan layanan yang ekspresif, dapat diperluas, dan berorientasi peran.
ALB Ingress Controller telah mendukung Gateway API sejak versi 2.17.0. Anda dapat menginstal ALB Ingress Controller dan menggunakan Gateway API untuk mengekspos layanan melalui instans ALB.
Prasyarat
Kluster ACK managed cluster yang menjalankan Kubernetes 1.24 atau lebih baru telah dibuat.
ALB Ingress Controller versi 2.17.0 atau lebih baru telah diinstal di kluster.
Gateway API versi 1.1.0 atau lebih baru telah diinstal di kluster.
Dua virtual switch yang mendukung ALB telah dibuat di VPC tempat kluster ditempatkan.
Verifikasi lingkungan
Jika kluster Anda memenuhi prasyarat, sumber daya GatewayClass bernama alb akan dibuat secara otomatis. Anda dapat memverifikasi hal ini dengan cara berikut.
Konsol
Masuk ke Konsol ACS. Di panel navigasi sebelah kiri, klik Clusters.
Pada halaman Clusters, temukan kluster target dan klik namanya. Di panel navigasi sebelah kiri, pilih .
Klik gateway.networking.k8s.io dan lihat GatewayClass di bawah v1.

kubectl
kubectl get gatewayclassOutput yang diharapkan:
NAME CONTROLLER ACCEPTED AGE
alb gateways.alibabacloud.com/alb/v1 True 1mMen-deploy aplikasi contoh
Buat file httpbin.yaml.
CatatanDalam topik ini, Service untuk aplikasi menggunakan
ClusterIPsecara default. Jika kluster Anda menggunakan plug-in jaringan Flannel, ubahspec.typedari Service menjadiNodePort.apiVersion: apps/v1 kind: Deployment metadata: name: go-httpbin namespace: default spec: replicas: 1 selector: matchLabels: app: go-httpbin template: metadata: labels: app: go-httpbin version: v1 spec: containers: - image: registry.cn-hangzhou.aliyuncs.com/mse/go-httpbin args: - "--port=8090" - "--version=v1" imagePullPolicy: Always name: go-httpbin ports: - containerPort: 8090 --- apiVersion: v1 kind: Service metadata: name: go-httpbin namespace: default spec: type: ClusterIP ports: - port: 80 targetPort: 8090 protocol: TCP selector: app: go-httpbinDeploy aplikasi.
kubectl apply -f httpbin.yaml
Men-deploy Gateway dan rute
Operasi ini membuat instans ALB dan menimbulkan biaya. Instans ALB yang dibuat oleh Gateway tidak dihapus secara otomatis saat Anda menghapus kluster. Untuk menghindari biaya tak terduga, hapus sumber daya Gateway sebelum menghapus kluster.
Buat file gateway.yaml.
apiVersion: gateway.networking.k8s.io/v1 kind: Gateway metadata: name: alb namespace: default spec: gatewayClassName: alb listeners: - name: http protocol: HTTP port: 80 hostname: "*.ingress.top" allowedRoutes: namespaces: from: Same --- apiVersion: gateway.networking.k8s.io/v1beta1 kind: HTTPRoute metadata: name: demo-route spec: parentRefs: # Referensi sumber daya Gateway - group: gateway.networking.k8s.io kind: Gateway name: alb hostnames: - demo.ingress.top # Atur host menjadi demo.domain.ingress.top rules: - matches: # Aturan pencocokan adalah pencocokan awalan untuk path - path: type: PathPrefix value: / backendRefs: # Backend adalah Service bernama go-httpbin pada port 80 - kind: Service name: go-httpbin port: 80Deploy Gateway dan aturan routing.
kubectl apply -f gateway.yamlTunggu sekitar 2 menit lalu periksa status pembuatan Gateway.
kubectl get gateway albOutput yang diharapkan:
NAME CLASS ADDRESS PROGRAMMED AGE alb alb alb-0mwhq4ck6xxxxxxxxx.cn-hangzhou.alb.aliyuncsslb.com True 2m12sOutput tersebut menunjukkan bahwa Gateway telah dibuat.
Periksa status pembuatan rute.
kubectl describe httproute demo-route|grep Status -A 20Output yang diharapkan:
Status: Parents: Conditions: Last Transition Time: 2025-05-23T08:21:25Z Message: Route is accepted. Observed Generation: 1 Reason: Accepted Status: True Type: Accepted Last Transition Time: 2025-05-23T08:21:25Z Message: Route is resolved. Observed Generation: 1 Reason: ResolvedRefs Status: True Type: ResolvedRefs Controller Name: gateways.alibabacloud.com/alb/v1 Parent Ref: Group: gateway.networking.k8s.io Kind: Gateway Name: albUji akses ke aplikasi.
Dapatkan alamat Gateway.
export ALB_DOMAIN=$(kubectl get gateway alb -n default -o jsonpath='{.status.addresses[?(@.type=="Hostname")].value}')Akses aplikasi.
curl -H "Host: demo.ingress.top" http://${ALB_DOMAIN}/versionOutput yang diharapkan:
version: v1 hostname: go-httpbin-547xxxxxf6-xxxxx
Skenario
Skenario 1: Gunakan filter untuk memodifikasi header permintaan
Fitur filter HTTPRoute memungkinkan Anda melakukan pemrosesan tambahan selama fase permintaan atau tanggapan. Contoh berikut menunjukkan cara menggunakan filter untuk menambahkan header permintaan ke permintaan yang dikirim ke backend.
Buat file httproute-filter.yaml.
apiVersion: gateway.networking.k8s.io/v1beta1 kind: HTTPRoute metadata: name: demo-filter spec: parentRefs: # Referensi sumber daya Gateway - group: gateway.networking.k8s.io kind: Gateway name: alb hostnames: - filter.ingress.top # Atur host menjadi filter.ingress.top rules: - matches: # Aturan pencocokan adalah pencocokan awalan untuk path - path: type: PathPrefix value: / filters: - type: RequestHeaderModifier # Tambahkan header permintaan my-header: foo requestHeaderModifier: add: - name: my-header value: foo backendRefs: # Backend adalah Service bernama go-httpbin pada port 80 - kind: Service name: go-httpbin port: 80File ini membuat sumber daya HTTPRoute bernama
demo-filter. Setelah Anda men-deploy sumber daya ini, ketika mengakses aplikasi go-httpbin menggunakan nama domainfilter.ingress.top, header permintaanmy-header: fooakan ditambahkan secara otomatis ke permintaan tersebut.Deploy aturan routing.
kubectl apply -f httproute-filter.yamlAkses aplikasi.
curl -H "Host: filter.ingress.top" http://${ALB_DOMAIN}/headerOutput yang diharapkan:
headers: { "Accept": [ "*/*" ], "Connection": [ "close" ], "Host": [ "filter.ingress.top" ], "My-Header": [ "foo" ], "Path": [ "/header" ], "Protocol": [ "HTTP/1.1" ], "Remoteip": [ "118.xx.xx.91" ], "URL": [ "/header" ], "User-Agent": [ "curl/8.9.1" ] } query param: , hostname: go-httpbin-547xxxxxf6-xxxxx
Skenario 2: Membagi lalu lintas berdasarkan bobot
Anda dapat mengatur bobot untuk beberapa layanan backend guna membagi lalu lintas permintaan.
Buat file nginx.yaml.
File di atas men-deploy dua aplikasi NGINX. Layanan
old-nginxmengembalikan stringold, sedangkan layanannew-nginxmengembalikan stringnew. Sumber daya yang dideploy berada di namespacedefault.Buat file httproute-weight.yaml.
apiVersion: gateway.networking.k8s.io/v1beta1 kind: HTTPRoute metadata: name: demo-weight spec: parentRefs: # Referensi sumber daya Gateway - group: gateway.networking.k8s.io kind: Gateway name: alb hostnames: - weight.ingress.top # Atur host menjadi weight.ingress.top rules: - matches: # Aturan pencocokan adalah pencocokan awalan untuk path - path: type: PathPrefix value: / backendRefs: # Atur backend dan bobot yang sesuai. Bobot bukan persentase dan tidak perlu berjumlah 100. - kind: Service name: old-nginx port: 80 weight: 100 # Atur bobot old-nginx menjadi 100 - kind: Service name: new-nginx port: 80 weight: 100 # Atur bobot new-nginx menjadi 100Aturan routing ini mengatur bobot yang sama untuk layanan
old-nginxdannew-nginx. Oleh karena itu, saat mengakses aplikasi, lalu lintas didistribusikan antara layanannew-nginxdanold-nginxdengan rasio 1:1.Deploy aplikasi dan aturan routing.
kubectl apply -f nginx.yaml kubectl apply -f httproute-weight.yamlAkses aplikasi sebanyak 10 kali.
for i in {1..10}; do curl -H "Host: weight.ingress.top" http://${ALB_DOMAIN}/; doneOutput yang diharapkan:
old new new old new old old new new oldOutput tersebut menunjukkan bahwa lalu lintas didistribusikan antara layanan
new-nginxdanold-nginxdengan rasio 1:1.
Operasi terkait
Konfigurasikan sertifikat untuk aplikasi
Anda dapat mengonfigurasi sertifikat TLS untuk aplikasi dalam sumber daya Gateway.
Buat sertifikat tanda tangan sendiri untuk nama domain
ingress.tap.openssl req -subj '/CN=ingress.top' -new -newkey rsa:2048 -sha256 \ -days 365 -nodes -x509 -keyout server.key -out server.crt \ -addext "subjectAltName = DNS:ingress.top" \ -addext "keyUsage = digitalSignature" \ -addext "extendedKeyUsage = serverAuth" 2> /dev/null; openssl x509 -in server.crt -subject -nooutBuat Secret TLS.
kubectl create secret tls ingress.top --key server.key --cert server.crtBuat file gateway-tls.yaml untuk memperbarui Gateway.
apiVersion: gateway.networking.k8s.io/v1 kind: Gateway metadata: name: alb namespace: default spec: gatewayClassName: alb listeners: - name: http protocol: HTTP port: 80 hostname: "*.ingress.top" allowedRoutes: namespaces: from: Same - name: https protocol: HTTPS port: 443 hostname: "*.ingress.top" allowedRoutes: namespaces: from: Same tls: # Konfigurasi TLS mode: Terminate certificateRefs: # Referensi secret yang dibuat - kind: Secret name: ingress.topPerbarui Gateway.
gateway.gateway.networking.k8s.io/alb configuredSetelah status Programmed Gateway berubah menjadi True, Anda dapat memverifikasi konfigurasi sertifikat.
openssl s_client -servername ingress.top -connect ${ALB_DOMAIN}:443Output yang diharapkan:
CONNECTED(00000003) depth=0 CN = ingress.top verify error:num=18:self-signed certificate verify return:1 depth=0 CN = ingress.top verify return:1 --- Certificate chain 0 s:CN = ingress.top i:CN = ingress.top a:PKEY: rsaEncryption, 2048 (bit); sigalg: RSA-SHA256 v:NotBefore: Jun 24 10:49:39 2025 GMT; NotAfter: Jun 24 10:49:39 2026 GMT --- Server certificate -----BEGIN CERTIFICATE----- ... ... ... -----END CERTIFICATE----- subject=CN = ingress.top issuer=CN = ingress.top --- No client certificate CA names sent Peer signing digest: SHA256 Peer signature type: RSA-PSS Server Temp Key: X25519, 253 bits --- SSL handshake has read 1506 bytes and written 410 bytes Verification error: self-signed certificate --- New, TLSv1.2, Cipher is ECDHE-RSA-AES128-GCM-SHA256 Server public key is 2048 bit Secure Renegotiation IS supported Compression: NONE Expansion: NONE No ALPN negotiated SSL-Session: Protocol : TLSv1.2 Cipher : ECDHE-RSA-AES128-GCM-SHA256 Session-ID: xxxxxxxxxxxxxxxxxxxxxxxxx Session-ID-ctx: Master-Key: xxxxxxxxxxxxxxxxxxxxxxxxxxx PSK identity: None PSK identity hint: None SRP username: None TLS session ticket lifetime hint: 300 (seconds) TLS session ticket: ... ... ... Start Time: 1750820008 Timeout : 7200 (sec) Verify return code: 18 (self-signed certificate) Extended master secret: yes ---Jika output yang mirip dengan di atas dikembalikan, sertifikat tersebut valid.
CatatanAnda dapat menjalankan
curl -H "Host: demo.ingress.top" -k https://${ALB_DOMAIN}/versionuntuk mengakses aplikasi. Output yang diharapkan sama seperti pada Uji akses ke aplikasi.