全部产品
Search
文档中心

Container Service for Kubernetes:Melakukan skalabilitas horizontal beberapa aplikasi berdasarkan metrik lalu lintas Nginx Ingress

更新时间:Nov 11, 2025

Menyebarkan beberapa instans meningkatkan stabilitas aplikasi tetapi dapat menyebabkan sumber daya menganggur dan biaya kluster yang lebih tinggi. Penskalaan manual membutuhkan banyak tenaga dan sering kali terlambat. Anda dapat menggunakan Nginx Ingress untuk menerapkan Horizontal Pod Autoscaler (HPA) pada beberapa aplikasi. HPA secara dinamis menyesuaikan jumlah replika Pod berdasarkan beban kerja, sehingga menjamin stabilitas aplikasi dan respons yang cepat, sekaligus mengoptimalkan pemanfaatan sumber daya serta mengurangi biaya. Topik ini menjelaskan cara menggunakan Nginx Ingress untuk menerapkan HPA pada beberapa aplikasi.

Ingress meneruskan permintaan eksternal ke Layanan di dalam kluster. Layanan tersebut kemudian mengirimkan permintaan ke Pod. Di lingkungan produksi, Anda dapat mengonfigurasi penskalaan otomatis berdasarkan volume permintaan yang diekspos oleh metrik nginx_ingress_controller_requests. Metrik bawaan dari Nginx Ingress Controller ini dapat digunakan untuk menerapkan HPA. Nginx Ingress Controller di kluster ACK merupakan versi yang ditingkatkan dari edisi komunitas dan lebih mudah digunakan.

Persiapan

Sebelum menggunakan Nginx Ingress untuk menerapkan Horizontal Pod Autoscaling (HPA) pada beberapa aplikasi, Anda harus mengonversi metrik Alibaba Cloud Prometheus menjadi metrik yang kompatibel dengan HPA.

  • Sebarkan komponen pemantauan Alibaba Cloud Prometheus. Untuk informasi selengkapnya, lihat Menggunakan Alibaba Cloud Prometheus untuk pemantauan.

  • Sebarkan komponen ack-alibaba-cloud-metrics-adapter dan konfigurasikan bidang prometheus.url-nya.

    Perluas untuk melihat cara mengonfigurasi prometheus.url

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

    2. Di halaman Clusters, temukan kluster yang diinginkan lalu klik namanya. Di panel sebelah kiri, pilih Applications > Helm.

    3. Di halaman Helm, temukan ack-alibaba-cloud-metrics-adapter lalu klik Update di kolom Actions.

    4. Di panel Update Release, atur bidang alibabaCloudMetricsAdapter.prometheus.url ke URL permintaan data Prometheus yang telah Anda peroleh, lalu klik OK.

      Untuk informasi selengkapnya, lihat Cara mengambil URL permintaan data Prometheus.
      Untuk informasi selengkapnya, lihat Deskripsi detail file konfigurasi komponen ack-alibaba-cloud-metrics-adapter.
  • Instal alat uji stres Apache Benchmark.

    Perluas untuk melihat contoh perintah

    • macOS: Gunakan Homebrew untuk menginstal.

      brew install httpd
    • Windows: Kunjungi Apache Lounge dan unduh versi Windows Apache. Gunakan baris perintah untuk menjalankan perintah cd guna menuju folder bin hasil ekstraksi, kemudian jalankan ab.exe untuk memulai program.

    • Ubuntu atau Debian:

      sudo apt update
      sudo apt install apache2-utils
    • CentOS 8 atau RHEL:

      sudo yum install httpd-tools

    Setelah instalasi selesai, jalankan ab -V untuk memverifikasi instalasi.

Dalam tutorial ini, Anda akan membuat dua Penyebaran (Deployment) beserta Layanan (Service) yang sesuai, serta mengonfigurasi sebuah Ingress dengan jalur akses berbeda untuk mengarahkan lalu lintas eksternal. Selanjutnya, Anda akan mengonfigurasi HPA untuk aplikasi berdasarkan metrik nginx_ingress_controller_requests dan menggunakan bidang selector.matchLabels.service untuk memfilter metrik tersebut. Hal ini memungkinkan Pod melakukan penskalaan masuk dan keluar sebagai respons terhadap perubahan lalu lintas.

Langkah 1: Membuat aplikasi dan layanan

Gunakan file YAML berikut untuk membuat Penyebaran aplikasi dan Layanan yang sesuai.

  1. Buat file bernama nginx1.yaml dan salin konten berikut ke dalamnya.

    Perluas untuk melihat contoh YAML

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: test-app
      namespace: default
      labels:
        app: test-app
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: test-app
      template:
        metadata:
          labels:
            app: test-app
        spec:
          containers:
          - image: registry-cn-hangzhou.ack.aliyuncs.com/acs/sample-app:v1-b070784-aliyun
            name: metrics-provider
            ports:
            - name: http
              containerPort: 8080
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: test-app
      namespace: default
      labels:
        app: test-app
    spec:
      ports:
        - port: 8080
          name: http
          protocol: TCP
          targetPort: 8080
      selector:
        app: test-app
      type: ClusterIP

    Jalankan perintah berikut untuk membuat aplikasi test-app dan Layanan yang sesuai.

    kubectl apply -f nginx1.yaml
  2. Buat file bernama nginx2.yaml dan salin konten berikut ke dalamnya.

    Perluas untuk melihat contoh YAML

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: sample-app
      namespace: default
      labels:
        app: sample-app
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: sample-app
      template:
        metadata:
          labels:
            app: sample-app
        spec:
          containers:
          - image: registry-cn-hangzhou.ack.aliyuncs.com/acs/sample-app:v1-b070784-aliyun
            name: metrics-provider
            ports:
            - name: http
              containerPort: 8080
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: sample-app
      namespace: default
      labels:
        app: sample-app
    spec:
      ports:
        - port: 80
          name: http
          protocol: TCP
          targetPort: 8080
      selector:
        app: sample-app
      type: ClusterIP

    Jalankan perintah berikut untuk membuat aplikasi sample-app dan Layanan yang sesuai.

    kubectl apply -f nginx2.yaml

Langkah 2: Membuat Ingress

  1. Buat file bernama ingress.yaml dan salin konten berikut ke dalamnya.

    Perluas untuk melihat contoh YAML

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: test-ingress
      namespace: default
    spec:
      ingressClassName: nginx
      rules:
        - host: test.example.com
          http:
            paths:
              - backend:
                  service:
                    name: sample-app
                    port:
                      number: 80
                path: /
                pathType: ImplementationSpecific
              - backend:
                  service:
                    name: test-app
                    port:
                      number: 8080
                path: /home
                pathType: ImplementationSpecific
    • host: Nama domain untuk mengakses Layanan. Contoh ini menggunakan test.example.com.

    • path: Jalur URL untuk akses. Saat permintaan tiba, permintaan tersebut dicocokkan dengan Layanan yang sesuai berdasarkan aturan routing, lalu dikirim ke Pod yang sesuai melalui Layanan tersebut.

    • backend: Terdiri atas nama Layanan dan port Layanan, yang menentukan Layanan tempat path saat ini meneruskan permintaan.

    Jalankan perintah berikut untuk menyebarkan sumber daya Ingress.

    kubectl apply -f ingress.yaml
  2. Jalankan perintah berikut untuk mengambil sumber daya Ingress.

    kubectl get ingress -o wide

    Keluaran yang diharapkan:

    NAME           CLASS   HOSTS              ADDRESS       PORTS   AGE                                                  
    test-ingress   nginx   test.example.com   10.XX.XX.10   80      55s

    Setelah penerapan berhasil, Anda dapat mengakses host menggunakan jalur / dan /home. Pengontrol NGINX Ingress secara otomatis mengarahkan permintaan Anda ke aplikasi sample-app dan test-app berdasarkan jalur permintaan. Anda dapat mengkueri metrik nginx_ingress_controller_requests di Alibaba Cloud Prometheus untuk mengambil informasi tentang permintaan ke setiap aplikasi.

Langkah 3: Mengonversi metrik Prometheus menjadi metrik yang kompatibel dengan HPA

Ubah file adapter-config

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

  2. Di halaman Clusters, temukan kluster yang diinginkan lalu klik namanya. Di panel navigasi sebelah kiri, pilih Applications > Helm.

  3. Di halaman Helm, klik ack-alibaba-cloud-metrics-adapter. Di bagian Resources, klik adapter-config, lalu klik Edit YAML di pojok kanan atas halaman.

  4. Ganti nilai bidang yang sesuai dengan nilai dalam kode berikut, lalu klik OK di bagian bawah halaman.

    Untuk informasi selengkapnya, lihat Penyesuaian otomatis Pod horizontal berdasarkan metrik Alibaba Cloud Prometheus.
    rules:
    - metricsQuery: sum(rate(<<.Series>>{<<.LabelMatchers>>}[2m]))
      name:
        as: ${1}_per_second
        matches: ^(.*)_requests
      resources:
        namespaced: false  
      seriesQuery: nginx_ingress_controller_requests

    image

Lihat keluaran metrik

Jalankan perintah berikut untuk melihat keluaran metrik.

kubectl get --raw "/apis/external.metrics.k8s.io/v1beta1/namespaces/*/nginx_ingress_controller_per_second" | jq .

Hasil kueri adalah sebagai berikut:

{
  "kind": "ExternalMetricValueList",
  "apiVersion": "external.metrics.k8s.io/v1beta1",
  "metadata": {},
  "items": [
    {
      "metricName": "nginx_ingress_controller_per_second",
      "metricLabels": {},
      "timestamp": "2025-07-25T07:56:04Z",
      "value": "0"
    }
  ]
}

Langkah 4: Membuat HPA

  1. Buat file bernama hpa.yaml dan salin konten berikut ke dalamnya.

    Perluas untuk melihat contoh YAML

    apiVersion: autoscaling/v2
    kind: HorizontalPodAutoscaler
    metadata:
      name: sample-hpa
      namespace: default
    spec:
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: sample-app
      minReplicas: 1
      maxReplicas: 10
      metrics:
        - type: External
          external:
            metric:
              name: nginx_ingress_controller_per_second
              selector:
                matchLabels:
    # Anda dapat menggunakan bidang ini untuk memfilter metrik. Bidang yang diatur di sini diteruskan ke label <<.LabelMatchers>> di adapter.config.
                  service: sample-app
    # Tipe metrik Eksternal hanya mendukung tipe target Value dan AverageValue.
            target:
              type: AverageValue
              averageValue: 30
    ---
    apiVersion: autoscaling/v2
    kind: HorizontalPodAutoscaler
    metadata:
      name: test-hpa
      namespace: default
    spec:
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: test-app
      minReplicas: 1
      maxReplicas: 10
      metrics:
        - type: External
          external:
            metric:
              name: nginx_ingress_controller_per_second
              selector:
                matchLabels:
    # Anda dapat menggunakan bidang ini untuk memfilter metrik. Bidang yang diatur di sini diteruskan ke label <<.LabelMatchers>> di adapter.config.
                  service: test-app
    # Tipe metrik Eksternal hanya mendukung tipe target Value dan AverageValue.
            target:
              type: AverageValue
              averageValue: 30

    Jalankan perintah berikut untuk menyebarkan HPA untuk aplikasi sample-app dan test-app.

    kubectl apply -f hpa.yaml
  2. Jalankan perintah berikut untuk memeriksa status penerapan HPA.

    kubectl get hpa

    Keluaran yang diharapkan:

    NAME         REFERENCE               TARGETS       MINPODS   MAXPODS   REPLICAS   AGE
    sample-hpa   Deployment/sample-app   0/30 (avg)   1         10        1          74s
    test-hpa     Deployment/test-app     0/30 (avg)   1         10        1          59m

Langkah 5: Verifikasi hasil

Setelah HPA diterapkan, gunakan alat Apache Benchmark untuk menjalankan uji stres. Amati apakah aplikasi melakukan penskalaan keluar seiring peningkatan jumlah permintaan.

  1. Jalankan perintah berikut untuk melakukan uji stres pada jalur /home host.

    ab -c 50 -n 5000 test.example.com/home
  2. Jalankan perintah berikut untuk memeriksa status HPA.

    kubectl get hpa

    Keluaran yang diharapkan:

    NAME         REFERENCE               TARGETS           MINPODS   MAXPODS   REPLICAS   AGE
    sample-hpa   Deployment/sample-app   0/30 (avg)        1         10        1          22m
    test-hpa     Deployment/test-app     22096m/30 (avg)   1         10        3          80m
  3. Jalankan perintah berikut untuk melakukan uji stres pada jalur root host.

    ab -c 50 -n 5000 test.example.com/
  4. Jalankan perintah berikut untuk memeriksa status HPA.

    kubectl get hpa

    Keluaran yang diharapkan:

    NAME         REFERENCE               TARGETS           MINPODS   MAXPODS   REPLICAS   AGE
    sample-hpa   Deployment/sample-app   27778m/30 (avg)   1         10        2          38m
    test-hpa     Deployment/test-app     0/30 (avg)        1         10        1          96m

    Hasil menunjukkan bahwa aplikasi berhasil melakukan penskalaan keluar ketika volume permintaan melebihi ambang batas.

Referensi

  • Pengeimbangan multi-zona merupakan metode penerapan umum untuk layanan intensif data dalam skenario ketersediaan tinggi. Ketika beban kerja meningkat, aplikasi yang menggunakan kebijakan penjadwalan seimbang multi-zona harus secara otomatis melakukan penskalaan keluar instans di beberapa zona untuk memenuhi kebutuhan penjadwalan kluster. Untuk informasi selengkapnya, lihat Menerapkan penskalaan elastis cepat dan simultan di beberapa zona.

  • Anda dapat membuat citra sistem operasi kustom untuk menyederhanakan penskalaan elastis dalam skenario kompleks. Untuk informasi selengkapnya, lihat Optimasi elastis dengan citra kustom.