Mengonfigurasi Ingress untuk Load Balancer Aplikasi eksternal


Halaman ini menunjukkan cara mengonfigurasi Load Balancer Aplikasi eksternal dengan membuat objek Ingress Kubernetes.

Sebelum membaca halaman ini, Anda harus sudah memahami konsep jejaring GKE.

Sebelum memulai

Sebelum memulai, pastikan Anda telah menjalankan tugas berikut:

  • Aktifkan Google Kubernetes Engine API.
  • Aktifkan Google Kubernetes Engine API
  • Jika ingin menggunakan Google Cloud CLI untuk tugas ini, instal lalu initialize gcloud CLI. Jika sebelumnya Anda telah menginstal gcloud CLI, dapatkan versi terbaru dengan menjalankan gcloud components update.

Mengaktifkan add-on HttpLoadBalancing

Cluster Anda harus mengaktifkan add-on HttpLoadBalancing. Add-on ini diaktifkan secara default. Dalam cluster Autopilot, Anda tidak dapat menonaktifkan add-on ini.

Anda dapat mengaktifkan add-on HttpLoadBalancing menggunakan Konsol Google Cloud atau Google Cloud CLI.

Konsol

  1. Buka halaman Google Kubernetes Engine di konsol Google Cloud.

    Buka Google Kubernetes Engine

  2. Klik nama cluster yang ingin diubah.

  3. Di bagian Networking, di kolom HTTP Load Balancing, klik Edit HTTP Load Balancing.

  4. Centang kotak Enable HTTP load balancing.

  5. Klik Save Changes.

gcloud

gcloud container clusters update CLUSTER_NAME --update-addons=HttpLoadBalancing=ENABLED

Ganti CLUSTER_NAME dengan nama cluster Anda.

Membuat Load Balancer Aplikasi eksternal

Dalam latihan ini, Anda akan mengonfigurasi Load Balancer Aplikasi eksternal untuk merutekan permintaan ke berbagai Layanan, bergantung pada jalur URL.


Untuk mengikuti panduan langkah demi langkah tugas ini langsung di Konsol Google Cloud, klik Pandu saya:

Pandu saya


Membuat Deployment dan Layanan

Buat dua Deployment dengan Layanan bernama hello-world-1 dan hello-world-2:

  1. Simpan manifes berikut sebagai hello-world-deployment-1.yaml:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: hello-world-deployment-1
    spec:
      selector:
        matchLabels:
          greeting: hello
          version: one
      replicas: 3
      template:
        metadata:
          labels:
            greeting: hello
            version: one
        spec:
          containers:
          - name: hello-app-1
            image: "us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0"
            env:
            - name: "PORT"
              value: "50000"
    

    Manifes ini menjelaskan contoh Deployment dengan tiga replika.

  2. Terapkan manifes ke cluster:

    kubectl apply -f hello-world-deployment-1.yaml
    
  3. Simpan manifes berikut sebagai hello-world-service-1.yaml:

    apiVersion: v1
    kind: Service
    metadata:
      name: hello-world-1
    spec:
      type: NodePort
      selector:
        greeting: hello
        version: one
      ports:
      - protocol: TCP
        port: 60000
        targetPort: 50000
    

    Manifes ini menjelaskan Layanan dengan properti berikut:

    • Setiap Pod yang memiliki label greeting: hello dan label version: one adalah anggota Layanan.
    • GKE meneruskan permintaan yang dikirim ke Layanan di TCP port 60000 ke salah satu Pod anggota di port TCP 50000.
    • Jenis Layanan adalah NodePort, yang diperlukan kecuali jika Anda menggunakan load balancing berbasis container. Jika menggunakan load balancing berbasis container, tidak ada batasan jenis layanan. Sebaiknya gunakan type: ClusterIP.
  4. Terapkan manifes ke cluster:

    kubectl apply -f hello-world-service-1.yaml
    
  5. Simpan manifes berikut sebagai hello-world-deployment-2.yaml:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: hello-world-deployment-2
    spec:
      selector:
        matchLabels:
          greeting: hello
          version: two
      replicas: 3
      template:
        metadata:
          labels:
            greeting: hello
            version: two
        spec:
          containers:
          - name: hello-app-2
            image: "us-docker.pkg.dev/google-samples/containers/gke/hello-app:2.0"
            env:
            - name: "PORT"
              value: "8080"
    

    Manifes ini menjelaskan contoh Deployment dengan tiga replika.

  6. Terapkan manifes ke cluster:

    kubectl apply -f hello-world-deployment-2.yaml
    
  7. Simpan manifes berikut sebagai hello-world-service-2.yaml:

    apiVersion: v1
    kind: Service
    metadata:
      name: hello-world-2
    spec:
      type: NodePort
      selector:
        greeting: hello
        version: two
      ports:
      - protocol: TCP
        port: 80
        targetPort: 8080
    

    Manifes ini menjelaskan Layanan dengan properti berikut:

    • Setiap Pod yang memiliki label greeting: hello dan label version: two adalah anggota Layanan.
    • GKE meneruskan permintaan yang dikirim ke Layanan di TCP port 80 ke salah satu Pod anggota di port TCP 8080.
  8. Terapkan manifes ke cluster:

    kubectl apply -f hello-world-service-2.yaml
    

Membuat Ingress

Buat Ingress yang menentukan aturan untuk permintaan pemilihan rute bergantung pada jalur URL dalam permintaan. Saat Anda membuat Ingress, pengontrol Ingress GKE akan membuat dan mengonfigurasi Load Balancer Aplikasi eksternal.

  1. Simpan manifes berikut sebagai my-ingress.yaml:

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: my-ingress
      annotations:
        # If the class annotation is not specified it defaults to "gce".
        kubernetes.io/ingress.class: "gce"
    spec:
      rules:
      - http:
          paths:
          - path: /*
            pathType: ImplementationSpecific
            backend:
              service:
                name: hello-world-1
                port:
                  number: 60000
          - path: /v2
            pathType: ImplementationSpecific
            backend:
              service:
                name: hello-world-2
                port:
                  number: 80
    

    Manifes ini menjelaskan Ingress dengan properti berikut:

    • Ada dua class Ingress GKE. Untuk menentukan class Ingress, Anda harus menggunakan anotasi kubernetes.io/ingress.class. Anda tidak dapat menentukan Ingress GKE menggunakan spec.ingressClassName.

    • Class gce men-deploy Load Balancer Aplikasi eksternal.

    • Class gce-internal men-deploy Load Balancer Aplikasi internal.

    • Saat Anda men-deploy resource Ingress tanpa anotasi spec.ingressClassName dan kubernetes.io/ingress.class, GKE akan membuat Load Balancer Aplikasi eksternal. Perilaku ini sama dengan yang terjadi jika Anda menentukan anotasi kubernetes.io/ingress.class: gce. Untuk informasi selengkapnya, lihat Perilaku pengontrol Ingress GKE.

    • GKE membuat Layanan backend Google Cloud untuk setiap backend.service.

    • Saat klien mengirim permintaan ke load balancer dengan jalur URL /, GKE akan meneruskan permintaan tersebut ke Layanan hello-world-1 di port 60000. Saat klien mengirim permintaan ke load balancer menggunakan jalur URL /v2, GKE akan meneruskan permintaan tersebut ke Layanan hello-world-2 pada port 80. Untuk informasi selengkapnya tentang properti path dan pathType, lihat Jalur URL.

  2. Terapkan manifes ke cluster:

    kubectl apply -f my-ingress.yaml
    

Menguji Load Balancer Aplikasi eksternal

Tunggu sekitar lima menit hingga load balancer dikonfigurasi, lalu uji Load Balancer Aplikasi eksternal:

  1. Lihat Ingress:

    kubectl get ingress my-ingress --output yaml
    

    Output akan menampilkan alamat IP Load Balancer Aplikasi eksternal:

    status:
      loadBalancer:
        ingress:
        - ip: 203.0.113.1
    
  2. Uji jalur /:

    curl LOAD_BALANCER_IP_ADDRESS/
    

    Ganti LOAD_BALANCER_IP_ADDRESS dengan alamat IP eksternal load balancer.

    Output akan mirip dengan yang berikut ini:

    Hello, world!
    Version: 1.0.0
    Hostname: ...
    

    Jika output berisi error 404, tunggu beberapa menit.

  3. Uji jalur /v2:

    curl load-balancer-ip/v2
    

    Outputnya mirip dengan hal berikut ini:

    Hello, world!
    Version: 2.0.0
    Hostname: ...
    

Cara kerja Ingress untuk load balancing eksternal

Load Balancer Aplikasi eksternal bertindak sebagai proxy antara klien dan aplikasi Anda. Jika Anda ingin menerima permintaan HTTPS dari klien, load balancer harus memiliki sertifikat agar dapat membuktikan identitasnya kepada klien. Load balancer juga harus memiliki kunci pribadi untuk menyelesaikan handshake HTTPS. Untuk informasi selengkapnya, lihat:

Jalur URL

Satu-satunya karakter pengganti yang didukung untuk kolom path dari suatu Ingress adalah karakter *. Karakter * harus mengikuti garis miring (/) dan harus merupakan karakter terakhir dalam pola. Misalnya, /*, /foo/*, dan /foo/bar/* adalah pola yang valid, tetapi *, /foo/bar*, dan /foo/*/bar itu tidak.

Pola yang lebih spesifik lebih diutamakan daripada pola yang kurang spesifik. Jika Anda memiliki /foo/* dan /foo/bar/*, /foo/bar/bat akan diambil untuk mencocokkan /foo/bar/*. Untuk informasi selengkapnya tentang batasan jalur dan pencocokan pola, lihat dokumentasi Maps URL.

Untuk cluster GKE yang menjalankan versi lebih lama dari 1.21.3-gke.1600, satu-satunya nilai yang didukung untuk kolom pathType adalah ImplementationSpecific. Untuk cluster yang menjalankan versi 1.21.3-gke.1600 atau yang lebih baru, nilai Prefix dan Exact juga didukung untuk pathType.

Menonaktifkan HTTP

Jika ingin semua traffic antara klien dan load balancer menggunakan HTTPS, Anda dapat menonaktifkan HTTP. Untuk informasi selengkapnya, lihat Menonaktifkan HTTP.

HTTPS antara load balancer dan aplikasi

Jika aplikasi Anda, yang berjalan di Pod GKE, dapat menerima permintaan HTTPS, Anda dapat mengonfigurasi load balancer untuk menggunakan HTTPS saat meneruskan permintaan ke aplikasi Anda. Untuk informasi selengkapnya, lihat HTTPS (TLS) antara load balancer dan aplikasi.

HTTP/2 antara klien dan load balancer

Klien dapat menggunakan HTTP/2 untuk mengirimkan permintaan ke load balancer. Konfigurasi tidak diperlukan.

HTTP/2 antara load balancer dan aplikasi

Jika aplikasi Anda, yang berjalan di Pod GKE, mampu menerima permintaan HTTP/2, Anda dapat mengonfigurasi load balancer untuk menggunakan HTTP/2 saat meneruskan permintaan ke aplikasi Anda. Untuk informasi selengkapnya, lihat HTTP/2 untuk load balancing dengan Ingress.

Grup endpoint jaringan

Jika cluster Anda mendukung Load balancing berbasis container, sebaiknya gunakan grup endpoint jaringan (NEG). Untuk GKE cluster 1.17 dan yang lebih baru, serta dalam kondisi tertentu, load balancing berbasis container bersifat default dan tidak memerlukan anotasi Layanan cloud.google.com/neg: '{"ingress": true}' eksplisit.

VPC Bersama

Jika cluster GKE tempat Anda men-deploy resource Ingress berada dalam project layanan, dan Anda ingin bidang kontrol GKE mengelola resource firewall di project host Anda, akun layanan GKE project layanan tersebut harus memberikan izin IAM yang sesuai pada project host sesuai Mengelola resource firewall untuk cluster dengan VPC Bersama. Hal ini memungkinkan pengontrol Ingress membuat aturan firewall untuk mengizinkan traffic masuk dan traffic untuk health check Google Cloud.

Berikut contoh peristiwa yang mungkin ada dalam log resource Ingress. Error ini terjadi saat pengontrol Ingress tidak dapat membuat aturan firewall guna mengizinkan traffic masuk untuk health check Google Cloud jika izin tidak dikonfigurasi dengan benar.

Firewall change required by security admin: `gcloud compute firewall-rules update <RULE_NAME> --description "GCE L7 firewall rule" --allow tcp:<PORT> --source-ranges 130.211.0.0/22,35.191.0.0/16 --target-tags <TARGET_TAG> --project <HOST_PROJECT>

Jika memilih untuk menyediakan aturan firewall secara manual dari project host, Anda dapat membisukan peristiwa firewallXPNError dengan menambahkan anotasi networking.gke.io/suppress-firewall-xpn-error: "true" ke resource Ingress.

Ringkasan anotasi Ingress eksternal

Anotasi Ingress

Anotasi Deskripsi
kubernetes.io/ingress.allow-http Menentukan apakah traffic HTTP diizinkan antara klien dan load balancer HTTP(S). Nilai yang mungkin adalah "benar" dan "salah". Defaultnya adalah "benar". Lihat Menonaktifkan HTTP.
ingress.gcp.kubernetes.io/pre-shared-cert Gunakan anotasi ini untuk melampirkan resource sertifikat ke resource GKE Ingress. Untuk informasi selengkapnya, lihat Menggunakan beberapa sertifikat SSL dengan Load Balancer Aplikasi eksternal.
kubernetes.io/ingress.global-static-ip-name Gunakan anotasi ini untuk menentukan bahwa load balancer harus menggunakan alamat IP eksternal statis yang telah Anda buat sebelumnya. Lihat Alamat IP statis untuk load balancer HTTP(S).
networking.gke.io/v1beta1.FrontendConfig Gunakan anotasi ini untuk menyesuaikan konfigurasi load balancer yang ditampilkan kepada klien. Untuk informasi selengkapnya, lihat Konfigurasi Ingress.
networking.gke.io/suppress-firewall-xpn-error Untuk Load Balancer Ingress, jika Kubernetes tidak dapat mengubah aturan firewall karena izin tidak memadai, peristiwa firewallXPNError akan dibuat setiap beberapa menit. Di GLBC 1.4 dan yang lebih baru, Anda dapat membisukan peristiwa firewallXPNError dengan menambahkan anotasi networking.gke.io/suppress-firewall-xpn-error: "true" ke resource masuk. Anda dapat menghapus anotasi ini untuk membunyikannya. Nilai yang mungkin adalah true dan false. Nilai defaultnya adalah false.
Anotasi Deskripsi
cloud.google.com/app-protocols Gunakan anotasi ini untuk menetapkan protokol komunikasi antara load balancer dan aplikasi. Protokol yang memungkinkan adalah HTTP, HTTPS, dan HTTP2. Lihat HTTPS antara load balancer dan aplikasi serta HTTP/2 untuk load balancing dengan Ingress.
cloud.google.com/backend-config Gunakan anotasi ini untuk mengonfigurasi layanan backend yang terkait dengan Layanan. Untuk informasi selengkapnya, lihat Konfigurasi Ingress.
cloud.google.com/neg Gunakan anotasi ini untuk menentukan bahwa load balancer harus menggunakan grup endpoint jaringan. Lihat Menggunakan Load Balancing Berbasis Container.

Langkah selanjutnya