全部产品
Search
文档中心

Container Service for Kubernetes:Mengekspos layanan dengan menggunakan Gateway API melalui instans ALB

更新时间:Nov 11, 2025

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

  1. Masuk ke Konsol ACS. Di panel navigasi sebelah kiri, klik Clusters.

  2. Pada halaman Clusters, temukan kluster target dan klik namanya. Di panel navigasi sebelah kiri, pilih Workloads > Custom Resources.

  3. Klik gateway.networking.k8s.io dan lihat GatewayClass di bawah v1.

    image

kubectl

kubectl get gatewayclass

Output yang diharapkan:

NAME   CONTROLLER                         ACCEPTED   AGE
alb    gateways.alibabacloud.com/alb/v1   True       1m

Men-deploy aplikasi contoh

  1. Buat file httpbin.yaml.

    Catatan

    Dalam topik ini, Service untuk aplikasi menggunakan ClusterIP secara default. Jika kluster Anda menggunakan plug-in jaringan Flannel, ubah spec.type dari Service menjadi NodePort.

    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-httpbin
  2. Deploy aplikasi.

    kubectl apply -f httpbin.yaml

Men-deploy Gateway dan rute

Penting

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.

  1. 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: 80
  2. Deploy Gateway dan aturan routing.

    kubectl apply -f gateway.yaml
  3. Tunggu sekitar 2 menit lalu periksa status pembuatan Gateway.

    kubectl get gateway alb

    Output yang diharapkan:

    NAME   CLASS   ADDRESS                                                  PROGRAMMED   AGE
    alb    alb     alb-0mwhq4ck6xxxxxxxxx.cn-hangzhou.alb.aliyuncsslb.com   True         2m12s

    Output tersebut menunjukkan bahwa Gateway telah dibuat.

  4. Periksa status pembuatan rute.

    kubectl describe httproute demo-route|grep Status -A 20

    Output 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:   alb
  5. Uji akses ke aplikasi.

    1. Dapatkan alamat Gateway.

      export ALB_DOMAIN=$(kubectl get gateway alb -n default -o jsonpath='{.status.addresses[?(@.type=="Hostname")].value}')
    2. Akses aplikasi.

      curl -H "Host: demo.ingress.top" http://${ALB_DOMAIN}/version

      Output 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.

  1. 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: 80

    File ini membuat sumber daya HTTPRoute bernama demo-filter. Setelah Anda men-deploy sumber daya ini, ketika mengakses aplikasi go-httpbin menggunakan nama domain filter.ingress.top, header permintaan my-header: foo akan ditambahkan secara otomatis ke permintaan tersebut.

  2. Deploy aturan routing.

    kubectl apply -f httproute-filter.yaml
  3. Akses aplikasi.

    curl -H "Host: filter.ingress.top" http://${ALB_DOMAIN}/header

    Output 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.

  1. Buat file nginx.yaml.

    Perluas untuk melihat konten YAML

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: old-nginx
    spec:
      replicas: 1
      selector:
        matchLabels:
          run: old-nginx
      template:
        metadata:
          labels:
            run: old-nginx
        spec:
          containers:
          - image: registry.cn-hangzhou.aliyuncs.com/acs-sample/old-nginx
            imagePullPolicy: Always
            name: old-nginx
            ports:
            - containerPort: 80
              protocol: TCP
          restartPolicy: Always
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: old-nginx
    spec:
      type: ClusterIP 
      ports:
      - port: 80
        protocol: TCP
        targetPort: 80
      selector:
        run: old-nginx
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: new-nginx
    spec:
      replicas: 1
      selector:
        matchLabels:
          run: new-nginx
      template:
        metadata:
          labels:
            run: new-nginx
        spec:
          containers:
          - image: registry.cn-hangzhou.aliyuncs.com/acs-sample/new-nginx
            imagePullPolicy: Always
            name: new-nginx
            ports:
            - containerPort: 80
              protocol: TCP
          restartPolicy: Always
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: new-nginx
    spec:
      type: ClusterIP 
      ports:
      - port: 80
        protocol: TCP
        targetPort: 80
      selector:
        run: new-nginx

    File di atas men-deploy dua aplikasi NGINX. Layanan old-nginx mengembalikan string old, sedangkan layanan new-nginx mengembalikan string new. Sumber daya yang dideploy berada di namespace default.

  2. 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 100

    Aturan routing ini mengatur bobot yang sama untuk layanan old-nginx dan new-nginx. Oleh karena itu, saat mengakses aplikasi, lalu lintas didistribusikan antara layanan new-nginx dan old-nginx dengan rasio 1:1.

  3. Deploy aplikasi dan aturan routing.

    kubectl apply -f nginx.yaml
    kubectl apply -f httproute-weight.yaml
  4. Akses aplikasi sebanyak 10 kali.

    for i in {1..10}; do curl -H "Host: weight.ingress.top" http://${ALB_DOMAIN}/; done

    Output yang diharapkan:

    old
    new
    new
    old
    new
    old
    old
    new
    new
    old

    Output tersebut menunjukkan bahwa lalu lintas didistribusikan antara layanan new-nginx dan old-nginx dengan rasio 1:1.

Operasi terkait

Konfigurasikan sertifikat untuk aplikasi

Anda dapat mengonfigurasi sertifikat TLS untuk aplikasi dalam sumber daya Gateway.

  1. 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 -noout
  2. Buat Secret TLS.

    kubectl create secret tls ingress.top --key server.key --cert server.crt
  3. Buat 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.top
  4. Perbarui Gateway.

    gateway.gateway.networking.k8s.io/alb configured
  5. Setelah status Programmed Gateway berubah menjadi True, Anda dapat memverifikasi konfigurasi sertifikat.

    openssl s_client -servername ingress.top -connect ${ALB_DOMAIN}:443

    Output 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.

    Catatan

    Anda dapat menjalankan curl -H "Host: demo.ingress.top" -k https://${ALB_DOMAIN}/version untuk mengakses aplikasi. Output yang diharapkan sama seperti pada Uji akses ke aplikasi.