Menyiapkan Load Balancer Aplikasi eksternal dengan Ingress

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

Halaman ini ditujukan bagi spesialis Jaringan yang mendesain dan membangun arsitektur jaringan untuk organisasi mereka serta menginstal, mengonfigurasi, dan mendukung peralatan jaringan. Untuk mempelajari lebih lanjut peran umum dan contoh tugas yang kami referensikan dalam Google Cloud konten, lihat Peran dan tugas pengguna GKE umum.

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

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

Google Cloud Pemeriksaan uptime 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 Google Cloud konsol, Cloud Monitoring API, atau dengan menggunakan library klien Cloud Monitoring. Untuk mengetahui 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.)