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, pastikan Anda memahami konsep jaringan GKE.

Sebelum memulai

Sebelum memulai, pastikan Anda telah melakukan tugas berikut:

  • Aktifkan Google Kubernetes Engine API.
  • Aktifkan Google Kubernetes Engine API
  • Jika ingin menggunakan Google Cloud CLI untuk tugas ini, instal lalu lakukan inisialisasi gcloud CLI. Jika sebelumnya Anda telah menginstal gcloud CLI, dapatkan versi terbaru dengan menjalankan perintah gcloud components update. Versi gcloud CLI yang lebih lama mungkin tidak mendukung perintah yang dijalankan dalam dokumen ini.

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 Google Cloud konsol atau Google Cloud CLI.

Konsol

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

    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 alamat IP statis

Load Balancer Aplikasi eksternal menyediakan satu alamat IP stabil yang dapat Anda gunakan untuk merutekan permintaan ke satu atau beberapa Layanan. Jika menginginkan alamat IP permanen, Anda harus mencadangkan alamat IP eksternal statis global sebelum membuat Ingress.

Jika Anda mengubah Ingress yang ada untuk menggunakan alamat IP statis, bukan alamat IP sementara, GKE dapat mengubah alamat IP load balancer saat GKE membuat ulang aturan penerusan load balancer.

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 untuk tugas ini langsung di Google Cloud konsol, 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, tetapi sebaiknya gunakan Layanan type ClusterIP kecuali jika Anda secara eksplisit memerlukan nodePort yang disediakan oleh Layanan NodePort. Layanan LoadBalancer tidak didukung sebagai backend Ingress.
  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 Google Cloud Layanan backend untuk setiap backend.service. Setiap layanan backend terkait dengan Layanan Kubernetes, dan setiap layanan backend harus merujuk ke Google Cloud health check. Health check ini berbeda dengan pemeriksaan keaktifan atau kesiapan Kubernetes karena health check diterapkan di luar cluster. Untuk mempelajari lebih lanjut, lihat Health check

    • Saat klien mengirim permintaan ke load balancer dengan jalur URL /, GKE akan meneruskan permintaan tersebut ke hello-world-1 Layanan pada 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 path dan pathType properti, lihat Jalur URL.

    • Jika Anda ingin mencadangkan alamat IP eksternal statis global, sertakan anotasi kubernetes.io/ingress.global-static-ip-name dalam objek Ingress seperti yang ditunjukkan di sini:

     apiVersion: networking.k8s.io/v1
     kind: Ingress
     metadata:
       name: my-ingress
       annotations:
         kubernetes.io/ingress.global-static-ip-name: my-static-address
     ```
    
  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
    

    Output akan mirip dengan yang berikut ini:

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

Cara kerja Ingress untuk load balancing eksternal

Bagian ini menjelaskan komponen dan konfigurasi yang memungkinkan load balancing eksternal untuk aplikasi GKE Anda, termasuk pencocokan jalur URL, grup endpoint jaringan, dan integrasi VPC Bersama.

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.

Network endpoint groups

Jika cluster Anda mendukung Load balancing berbasis container, sebaiknya gunakan grup endpoint jaringan (NEG). Saat Anda membuat Ingress, GKE akan membuat Load Balancer Aplikasi di project, dan NEG dibuat di setiap zona tempat cluster berjalan. Endpoint di NEG dan endpoint Layanan tetap disinkronkan. Untuk GKE cluster 1.17 dan yang lebih baru, load balancing berbasis container bersifat default dan tidak memerlukan anotasi Layanan cloud.google.com/neg: '{"ingress": true}' eksplisit, dalam kondisi tertentu. Untuk cluster di mana NEG bukan default, sangat direkomendasikan untuk menggunakan load balancing berbasis container, tetapi harus diaktifkan secara eksplisit per Layanan. Anotasi harus diterapkan ke Layanan dengan cara berikut:

kind: Service
...
  annotations:
    cloud.google.com/neg: '{"ingress": true}'
...

Saat Anda menambahkan anotasi ini, BackendService baru akan dibuat untuk Layanan yang ada. Hal ini dapat mengakibatkan penonaktifan sementara untuk Layanan Anda.

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 Google Cloud health check.

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 Google Cloud health check 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 networking.gke.io/suppress-firewall-xpn-error: "true" anotasi ke resource Ingress.

Ringkasan anotasi Ingress eksternal

Anda dapat menggunakan anotasi berikut untuk mengonfigurasi perilaku resource Ingress eksternal dan objek Layanan Kubernetes terkait.

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 Ingress GKE. 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.
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 berikutnya