Menyiapkan Load Balancer Aplikasi eksternal dengan Ingress


Tutorial ini menunjukkan cara menjalankan aplikasi web di balik Load Balancer Aplikasi eksternal dengan mengonfigurasi resource Ingress.

Latar belakang

Google Kubernetes Engine (GKE) menawarkan dukungan terintegrasi untuk dua jenis Cloud Load Balancing untuk aplikasi yang dapat diakses publik:

  1. Ingress

  2. Load Balancer Jaringan passthrough eksternal

Dalam tutorial ini, Anda akan menggunakan Ingress.

Ingress

Saat menentukan kind: Ingress dalam manifes resource, Anda menginstruksikan GKE untuk membuat resource Ingress. Dengan menyertakan anotasi dan mendukung workload dan Layanan, Anda dapat membuat pengontrol Ingress kustom. Jika tidak, GKE akan melakukan panggilan Google Cloud API yang sesuai untuk membuat Load Balancer Aplikasi eksternal. Aturan host peta URL load balancing dan pencocok jalur mereferensikan satu atau beberapa layanan backend, di mana setiap layanan backend sesuai dengan Layanan GKE jenis NodePort, seperti direferensikan di Ingress. Backend untuk setiap layanan backend adalah grup instance atau grup endpoint jaringan (NEG). NEG dibuat saat Anda mengonfigurasi load balancing native container sebagai bagian dari konfigurasi untuk Ingress Anda. Untuk setiap layanan backend, GKE membuat health check Google Cloud, berdasarkan setelan pemeriksaan kesiapan workload yang direferensikan oleh Layanan GKE terkait.

Jika Anda mengekspos layanan HTTP(S) yang dihosting di GKE, load balancing HTTP(S) adalah metode yang direkomendasikan untuk load balancing.

Tujuan

  • Membuat cluster GKE.
  • Men-deploy aplikasi web contoh ke cluster.
  • Mengekspos aplikasi contoh ke internet di balik Load Balancer Aplikasi eksternal.

Biaya

Dalam dokumen ini, Anda menggunakan komponen Google Cloud yang dapat ditagih berikut:

Untuk membuat perkiraan biaya berdasarkan proyeksi penggunaan Anda, gunakan kalkulator harga. Pengguna baru Google Cloud mungkin memenuhi syarat untuk mendapatkan uji coba gratis.

Setelah menyelesaikan tugas yang dijelaskan dalam dokumen ini, Anda dapat menghindari penagihan berkelanjutan dengan menghapus resource yang Anda buat. Untuk mengetahui informasi selengkapnya, lihat Pembersihan.

Sebelum memulai

Lakukan langkah-langkah berikut untuk mengaktifkan Kubernetes Engine API:
  1. Buka halaman Kubernetes Engine di Konsol Google Cloud.
  2. Buat atau pilih project.
  3. Tunggu hingga API dan layanan terkait diaktifkan. Proses ini dapat memerlukan waktu beberapa menit.
  4. Pastikan penagihan telah diaktifkan untuk project Google Cloud Anda.

Instal alat command line berikut yang digunakan dalam tutorial ini:

  • gcloud digunakan untuk membuat dan menghapus cluster Kubernetes Engine. gcloud disertakan dalam gcloud CLI.
  • kubectl digunakan untuk mengelola Kubernetes, sistem orkestrasi cluster yang digunakan oleh Kubernetes Engine. Anda dapat menginstal kubectl menggunakan gcloud:
    gcloud components install kubectl

Clone kode contoh dari GitHub:

git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples
cd kubernetes-engine-samples/networking/load-balancing

Menetapkan default untuk alat command line gcloud

Untuk menghemat waktu saat mengetik opsi project ID dan Zona Compute Engine di alat command line gcloud, Anda dapat menetapkan setelan default:
gcloud config set project project-id
gcloud config set compute/zone compute-zone

Membuat cluster GKE

Buat cluster GKE Autopilot:

gcloud container clusters create-auto loadbalancedcluster

Men-deploy aplikasi web

Manifes berikut menjelaskan Deployment yang menjalankan contoh image container aplikasi web di server HTTP pada port 8080:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web
  namespace: default
spec:
  selector:
    matchLabels:
      run: web
  template:
    metadata:
      labels:
        run: web
    spec:
      containers:
      - image: us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0
        imagePullPolicy: IfNotPresent
        name: web
        ports:
        - containerPort: 8080
          protocol: TCP

Terapkan resource ke cluster:

kubectl apply -f web-deployment.yaml

Mengekspos Deployment dalam cluster Anda

Manifes berikut menjelaskan Layanan yang membuat deployment web dapat diakses dalam cluster container Anda:

apiVersion: v1
kind: Service
metadata:
  name: web
  namespace: default
spec:
  ports:
  - port: 8080
    protocol: TCP
    targetPort: 8080
  selector:
    run: web
  type: NodePort
  1. Terapkan resource ke cluster:

    kubectl apply -f web-service.yaml
    

    Saat membuat Layanan jenis NodePort dengan perintah ini, GKE menyediakan Layanan Anda pada nomor port tinggi yang dipilih secara acak (misalnya 32640) di semua node di cluster Anda.

  2. Pastikan bahwa Layanan dibuat dan port node dialokasikan:

    kubectl get service web
    
    Output:
    NAME      TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
    web       NodePort   10.35.245.219   <none>        8080:32640/TCP   5m
    

    Pada contoh output, port node untuk Layanan web adalah 32640. Perlu diketahui juga bahwa tidak ada IP eksternal yang dialokasikan untuk Layanan ini. Karena node GKE tidak dapat diakses secara eksternal secara default, pembuatan Layanan ini tidak membuat aplikasi Anda dapat diakses dari internet.

Agar aplikasi server web HTTP(S) dapat diakses secara publik, Anda harus membuat resource Ingress.

Membuat resource Ingress

Ingress adalah resource Kubernetes yang merangkum kumpulan aturan dan konfigurasi untuk merutekan traffic HTTP(S) eksternal ke layanan internal.

Di GKE, Ingress diimplementasikan menggunakan Cloud Load Balancing. Saat Anda membuat Ingress di cluster, GKE akan membuat load balancer HTTP(S) dan mengonfigurasinya untuk merutekan traffic ke aplikasi Anda.

Manifes berikut menjelaskan resource Ingress yang mengarahkan traffic ke Layanan web Anda:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: basic-ingress
spec:
  defaultBackend:
    service:
      name: web
      port:
        number: 8080

Terapkan resource ke cluster:

kubectl apply -f basic-ingress.yaml

Setelah Anda men-deploy manifes ini, Kubernetes akan membuat resource Ingress di cluster Anda. Pengontrol GKE Ingress membuat dan mengonfigurasi Load Balancer HTTP(S) sesuai dengan informasi di Ingress, mengarahkan semua lalu lintas HTTP eksternal (pada porta 80) ke Layanan NodePort web yang Anda ekspos.

Mengunjungi aplikasi Anda

Cari tahu alamat IP eksternal load balancer yang menayangkan aplikasi Anda dengan menjalankan:

kubectl get ingress basic-ingress
Output:
NAME            HOSTS     ADDRESS         PORTS     AGE
basic-ingress   *         203.0.113.12    80        2m

Buka alamat IP eksternal aplikasi Anda di browser dan lihat respons HTTP teks biasa seperti berikut:

Hello, world!
Version: 1.0.0
Hostname: web-6498765b79-fq5q5

Anda dapat membuka Load Balancing di Konsol Google Cloud dan memeriksa resource jaringan yang dibuat oleh pengontrol GKE Ingress.

(Opsional) Mengonfigurasi alamat IP statis

Saat mengekspos server web pada nama domain, Anda memerlukan alamat IP eksternal aplikasi berupa IP statis yang tidak akan berubah.

Secara default, GKE mengalokasikan alamat IP eksternal sementara untuk aplikasi HTTP yang diekspos melalui Ingress. Alamat sementara dapat berubah. Jika berencana menjalankan aplikasi untuk waktu yang lama, Anda harus menggunakan alamat IP eksternal statis.

Perlu diperhatikan bahwa setelah Anda mengonfigurasi IP statis untuk resource Ingress, menghapus Ingress tidak akan menghapus alamat IP statis yang terkait dengannya. Pastikan untuk membersihkan alamat IP statis yang dikonfigurasi saat Anda tidak lagi berencana untuk menggunakannya lagi.

Untuk mengonfigurasi alamat IP statis, selesaikan langkah-langkah berikut:

  1. Cadangkan alamat IP eksternal statis dengan nama web-static-ip:

    gcloud

    gcloud compute addresses create web-static-ip --global
    

    Config Connector

    Catatan: Langkah ini memerlukan Config Connector. Ikuti petunjuk penginstalan untuk menginstal Config Connector di cluster Anda.

    apiVersion: compute.cnrm.cloud.google.com/v1beta1
    kind: ComputeAddress
    metadata:
      name: web-static-ip
    spec:
      location: global
    Untuk men-deploy manifes ini, download manifes ke komputer Anda sebagai compute-address.yaml, dan jalankan:
    kubectl apply -f compute-address.yaml

  2. Manifes basic-ingress-static.yaml menambahkan anotasi pada Ingress untuk menggunakan resource IP statis bernama web-static-ip:

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: basic-ingress
      annotations:
        kubernetes.io/ingress.global-static-ip-name: "web-static-ip"
    spec:
      defaultBackend:
        service:
          name: web
          port:
            number: 8080

    Lihat manifes:

    cat basic-ingress-static.yaml
    
  3. Terapkan resource ke cluster:

    kubectl apply -f basic-ingress-static.yaml
    
  4. Periksa alamat IP eksternal:

    kubectl get ingress basic-ingress
    

    Tunggu hingga alamat IP aplikasi Anda berubah untuk menggunakan alamat IP yang dicadangkan dari resource web-static-ip.

    Mungkin perlu waktu beberapa menit untuk mengupdate resource Ingress yang ada, mengonfigurasi ulang load balancer, dan menerapkan aturan load balancing di seluruh dunia. Setelah operasi ini selesai, GKE akan merilis alamat IP sementara yang sebelumnya dialokasikan untuk aplikasi Anda.

(Opsional) Menyalurkan beberapa aplikasi di load balancer

Anda dapat menjalankan beberapa layanan pada satu load balancer dan IP publik dengan mengonfigurasi aturan perutean di Ingress. Dengan menghosting beberapa layanan di Ingress yang sama, Anda dapat menghindari pembuatan load balancer tambahan (yang merupakan resource yang dapat ditagih) untuk setiap Layanan yang Anda ekspos ke internet.

Manifes berikut menjelaskan Deployment dengan versi 2.0 dari aplikasi web yang sama:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web2
  namespace: default
spec:
  selector:
    matchLabels:
      run: web2
  template:
    metadata:
      labels:
        run: web2
    spec:
      containers:
      - image: us-docker.pkg.dev/google-samples/containers/gke/hello-app:2.0
        imagePullPolicy: IfNotPresent
        name: web2
        ports:
        - containerPort: 8080
          protocol: TCP

Terapkan resource ke cluster:

kubectl apply -f web-deployment-v2.yaml

Manifes berikut menjelaskan Layanan yang mengekspos web2 secara internal ke cluster pada Layanan NodePort yang disebut web2:

apiVersion: v1
kind: Service
metadata:
  name: web2
  namespace: default
spec:
  ports:
  - port: 8080
    protocol: TCP
    targetPort: 8080
  selector:
    run: web2
  type: NodePort

Terapkan resource ke cluster:

kubectl apply -f web-service-v2.yaml

Manifes berikut menjelaskan resource Ingress yang:

  • mengarahkan permintaan dengan jalur yang dimulai dengan /v2/ ke Layanan web2
  • mengarahkan semua permintaan lain ke Layanan web
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: fanout-ingress
spec:
  rules:
  - http:
      paths:
      - path: /*
        pathType: ImplementationSpecific
        backend:
          service:
            name: web
            port:
              number: 8080
      - path: /v2/*
        pathType: ImplementationSpecific
        backend:
          service:
            name: web2
            port:
              number: 8080

Terapkan resource ke cluster:

kubectl create -f fanout-ingress.yaml

Setelah Ingress di-deploy, jalankan kubectl get ingress fanout-ingress untuk mencari tahu alamat IP publik cluster.

Kemudian, buka alamat IP untuk melihat bahwa kedua aplikasi dapat dijangkau di load balancer yang sama:

  • Buka http://<IP_ADDRESS>/ dan perhatikan bahwa responsnya berisi Version: 1.0.0 (karena permintaan dirutekan ke Layanan web)
  • Buka http://<IP_ADDRESS>/v2/ dan perhatikan bahwa responsnya berisi Version: 2.0.0 (karena permintaan dirutekan ke Layanan web2)

Satu-satunya karakter pengganti yang didukung untuk kolom path pada 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.

(Opsional) Memantau ketersediaan dan latensi layanan Anda

Cek uptime Google Cloud melakukan pemantauan kotak hitam aplikasi dari sudut pandang pengguna, yang menentukan latensi dan ketersediaan dari beberapa IP eksternal ke alamat IP load balancer. Sebagai perbandingan, health check Google Cloud melakukan pemeriksaan internal terhadap IP Pod, yang menentukan ketersediaan di tingkat instance. Pemeriksaan ini bersifat komplementer dan memberikan gambaran menyeluruh tentang kondisi aplikasi.

Anda dapat membuat cek uptime menggunakan Konsol Google Cloud, Cloud Monitoring API, atau dengan menggunakan library klien Cloud Monitoring. Untuk informasi selengkapnya, lihat Mengelola cek uptime. Jika Anda ingin membuat cek uptime menggunakan konsol Google Cloud, lakukan hal berikut:

  1. Buka halaman Services & Ingress di Konsol Google Cloud.

    Buka Services & Ingress

  2. Klik nama Layanan yang ingin Anda buatkan cek uptimenya.

  3. Klik Create Uptime Check.

  4. Di panel Create Uptime Check, masukkan judul untuk cek uptime, lalu klik Next untuk melanjutkan ke setelan Target.

    Kolom Target pada cek uptime otomatis diisi menggunakan informasi dari load balancer Layanan.

    Untuk dokumentasi lengkap tentang semua kolom dalam cek uptime, lihat Membuat cek uptime.

  5. Klik Next untuk melanjutkan ke setelan Response Validation.

  6. Klik Next untuk melanjutkan ke bagian Alert and Notification.

    Untuk memantau cek uptime, Anda dapat membuat kebijakan pemberitahuan atau melihat dasbor cek uptime. Kebijakan pemberitahuan dapat memberi tahu Anda melalui email atau melalui saluran yang berbeda jika cek uptime Anda gagal. Untuk mengetahui informasi umum tentang kebijakan pemberitahuan, lihat Pengantar pemberitahuan.

  7. Klik Create.

Keterangan

Secara default, Ingress melakukan health check berkala dengan membuat permintaan GET di jalur / untuk menentukan respons aplikasi, dan mengharapkan respons 200. Jika ingin memeriksa jalur lain atau mengharapkan kode respons yang berbeda, Anda dapat menggunakan jalur health check kustom.

Ingress mendukung kasus penggunaan lanjutan, seperti:

  • Hosting virtual berbasis nama: Anda dapat menggunakan Ingress untuk menggunakan kembali load balancer untuk beberapa nama domain, subdomain, serta menampilkan beberapa Layanan pada satu alamat IP dan load balancer. Lihat contoh fanout sederhana dan hosting virtual berbasis nama guna mempelajari cara mengonfigurasi Ingress untuk tugas-tugas ini.

  • Penghentian HTTPS: Anda dapat mengonfigurasi Ingress untuk menghentikan traffic HTTPS menggunakan Cloud Load Balancer.

Saat Ingress dihapus, pengontrol GKE Ingress akan otomatis membersihkan resource terkait (kecuali alamat IP statis yang dicadangkan.)

Pembersihan

Agar tidak menimbulkan biaya pada akun Google Cloud Anda untuk resource yang digunakan dalam tutorial ini, hapus project yang berisi resource tersebut, atau simpan project dan hapus masing-masing resource.

  1. Hapus semua aturan penerusan yang dibuat secara manual dan proxy target yang merujuk ke Ingress:

    Proxy target yang terputus-putus yang mereferensikan peta URL yang dikelola oleh pengontrol GKE Ingress akan menyebabkan kegagalan penghapusan Ingress di GKE versi 1.15.4-gke.22+. Periksa resource Ingress untuk menemukan peristiwa dengan pesan error yang mirip dengan berikut ini:

     Error during GC: error running load balancer garbage collection routine: googleapi: Error 400: The url_map resource 'projects/project-id/global/urlMaps/k8s2-um-tlw9rhgp-default-my-ingress-9ifnni82' is already being used by 'projects/project-id/global/targetHttpsProxies/k8s2-um-tlw9rhgp-default-my82-target-proxy', resourceInUseByAnotherResource
     

    Dalam pesan error sebelumnya, k8s2-um-tlw9rhgp-default-my82-target-proxy adalah proxy https target yang dibuat secara manual dan masih merujuk ke peta URL k8s2-um-tlw9rhgp-default-my-ingress-9ifnni82 yang dibuat dan dikelola oleh pengontrol Ingress.

    Resource frontend yang dibuat secara manual ini (aturan penerusan dan proxy target) harus dihapus sebelum melanjutkan penghapusan Ingress.

  2. Menghapus Ingress: Langkah ini akan membatalkan alokasi alamat IP eksternal sementara dan resource load balancing yang terkait dengan aplikasi Anda:

    kubectl delete ingress basic-ingress

    Jika Anda mengikuti langkah opsional untuk membuat Ingress guna merutekan permintaan berdasarkan jalur, hapus Ingress tersebut:

    kubectl delete ingress fanout-ingress

  3. Hapus alamat IP statis: Selesaikan langkah ini hanya jika Anda mengikuti langkah opsional untuk membuat alamat IP statis.

    • Jika Anda mengikuti "Opsi 1" untuk mengonversi alamat IP sementara yang ada menjadi IP statis, kunjungi Konsol Google Cloud untuk menghapus alamat IP statis.

    • Jika Anda mengikuti "Opsi 2" untuk membuat alamat IP statis baru, jalankan perintah berikut untuk menghapus alamat IP statis:

      gcloud compute addresses delete web-static-ip --global
  4. Hapus cluster: Langkah ini akan menghapus node komputasi cluster container Anda dan resource lain seperti Deployment di cluster tersebut:

    gcloud container clusters delete loadbalancedcluster

Langkah selanjutnya