Load balancing berbasis container melalui Ingress

Halaman ini menjelaskan cara menggunakan load balancing berbasis container di Google Kubernetes Engine (GKE). Load balancing berbasis container memungkinkan load balancer langsung menarget Pod Kubernetes dan mendistribusikan traffic ke Pod secara merata.

Untuk mengetahui informasi selengkapnya tentang manfaat, persyaratan, dan batasan load balancing berbasis container, lihat Load balancing berbasis container.

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. gcloud CLI versi sebelumnya mungkin tidak mendukung menjalankan perintah dalam dokumen ini.
  • Pastikan Anda memiliki cluster VPC native yang sudah ada. Jika Anda memerlukannya, buat cluster. Cluster GKE bersifat VPC native secara default.

Menggunakan load balancing berbasis container

Bagian berikut akan memandu Anda melakukan konfigurasi load balancing berbasis container di GKE.

Membuat Deployment

Contoh Deployment berikut, neg-demo-app, menjalankan satu instance server HTTP dalam container. Sebaiknya gunakan workload yang menggunakan masukan kesiapan Pod.

Menggunakan masukan kesiapan Pod

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    run: neg-demo-app # Label for the Deployment
  name: neg-demo-app # Name of Deployment
spec:
  selector:
    matchLabels:
      run: neg-demo-app
  template: # Pod template
    metadata:
      labels:
        run: neg-demo-app # Labels Pods from this Deployment
    spec: # Pod specification; each Pod created by this Deployment has this specification
      containers:
      - image: registry.k8s.io/serve_hostname:v1.4 # Application to run in Deployment's Pods
        name: hostname # Container name
        ports:
        - containerPort: 9376
          protocol: TCP
  

Menggunakan penundaan yang di-harcode

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    run: neg-demo-app # Label for the Deployment
  name: neg-demo-app # Name of Deployment
spec:
  minReadySeconds: 60 # Number of seconds to wait after a Pod is created and its status is Ready
  selector:
    matchLabels:
      run: neg-demo-app
  template: # Pod template
    metadata:
      labels:
        run: neg-demo-app # Labels Pods from this Deployment
    spec: # Pod specification; each Pod created by this Deployment has this specification
      containers:
      - image: registry.k8s.io/serve_hostname:v1.4 # Application to run in Deployment's Pods
        name: hostname # Container name
      # Note: The following line is necessary only on clusters running GKE v1.11 and lower.
      # For details, see https://cloud.google.com/kubernetes-engine/docs/how-to/container-native-load-balancing#align_rollouts
        ports:
        - containerPort: 9376
          protocol: TCP
      terminationGracePeriodSeconds: 60 # Number of seconds to wait for connections to terminate before shutting down Pods
  

Dalam Deployment ini, setiap container menjalankan server HTTP. Server HTTP menampilkan nama host server aplikasi (nama Pod tempat server berjalan) sebagai respons.

Simpan manifes ini sebagai neg-demo-app.yaml, lalu buat Deployment:

kubectl apply -f neg-demo-app.yaml

Membuat Layanan untuk load balancer berbasis container

Setelah membuat Deployment, Anda perlu mengelompokkan Pod-nya ke dalam Layanan.

Contoh Layanan berikut, neg-demo-svc, menargetkan contoh Deployment yang Anda buat di bagian sebelumnya:

apiVersion: v1
kind: Service
metadata:
  name: neg-demo-svc # Name of Service
spec: # Service's specification
  type: ClusterIP
  selector:
    run: neg-demo-app # Selects Pods labelled run: neg-demo-app
  ports:
  - name: http
    port: 80 # Service's port
    protocol: TCP
    targetPort: 9376

Load balancer tidak dibuat sebelum Anda membuat Ingress untuk Layanan.

Simpan manifes ini sebagai neg-demo-svc.yaml, lalu buat Service:

kubectl apply -f neg-demo-svc.yaml

Membuat Ingress untuk Layanan

Contoh Ingress berikut, neg-demo-ing, menargetkan Layanan yang Anda buat:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: neg-demo-ing
spec:
  defaultBackend:
    service:
      name: neg-demo-svc # Name of the Service targeted by the Ingress
      port:
        number: 80 # Should match the port used by the Service

Simpan manifes ini sebagai neg-demo-ing.yaml, lalu buat Ingress:

kubectl apply -f neg-demo-ing.yaml

Setelah membuat Ingress, Load Balancer Aplikasi akan dibuat di project, dan Grup Endpoint Jaringan(NEG) akan dibuat di setiap zona tempat cluster berjalan. Endpoint di NEG dan endpoint Layanan terus disinkronkan.

Verifikasi Ingress

Setelah men-deploy workload, mengelompokkan Pod-nya ke dalam Layanan, dan membuat Ingress untuk Layanan, Anda harus memverifikasi bahwa Ingress telah berhasil menyediakan load balancer berbasis container.

Ambil status Ingress:

kubectl describe ingress neg-demo-ing

Output mencakup peristiwa ADD dan CREATE:

Events:
Type     Reason   Age                From                     Message
----     ------   ----               ----                     -------
Normal   ADD      16m                loadbalancer-controller  default/neg-demo-ing
Normal   Service  4s                 loadbalancer-controller  default backend set to neg-demo-svc:32524
Normal   CREATE   2s                 loadbalancer-controller  ip: 192.0.2.0

Menguji load balancer

Bagian berikut menjelaskan cara menguji fungsi load balancer berbasis container.

Membuka alamat IP Ingress

Tunggu beberapa menit hingga Load Balancer Aplikasi dikonfigurasi.

Anda dapat memverifikasi bahwa load balancer berbasis container berfungsi dengan membuka alamat IP Ingress.

Untuk mendapatkan alamat IP Ingress, jalankan perintah berikut:

kubectl get ingress neg-demo-ing

Dalam output perintah, alamat IP Ingress ditampilkan di kolom ADDRESS. Buka alamat IP di browser web.

Memeriksa status responsivitas layanan backend

Anda juga bisa mendapatkan status responsivitas layanan backend load balancer.

  1. Dapatkan daftar layanan backend yang berjalan di project Anda:

    gcloud compute backend-services list
    

    Catat nama layanan backend yang menyertakan nama Layanan, seperti neg-demo-svc.

  2. Dapatkan status responsivitas layanan backend:

    gcloud compute backend-services get-health BACKEND_SERVICE_NAME --global
    

    Ganti BACKEND_SERVICE_NAME dengan nama layanan backend.

Menguji Ingress

Cara lain untuk menguji apakah load balancer berfungsi sesuai ekspektasi adalah dengan menskalakan Deployment contoh, mengirimkan permintaan pengujian ke Ingress, dan memverifikasi bahwa jumlah replika yang merespons sudah benar.

  1. Menskalakan Deployment neg-demo-app dari satu instance menjadi dua instance:

    kubectl scale deployment neg-demo-app --replicas 2
    

    Pemrosesan perintah ini mungkin memerlukan waktu beberapa menit.

  2. Pastikan peluncuran selesai:

    kubectl get deployment neg-demo-app
    

    Output harus menyertakan dua replika yang tersedia:

    NAME           DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
    neg-demo-app   2         2         2            2           26m
    
  3. Dapatkan alamat IP Ingress:

    kubectl describe ingress neg-demo-ing
    

    Jika perintah ini menampilkan error 404, tunggu beberapa menit hingga load balancer dimulai, lalu coba lagi.

  4. Hitung jumlah respons yang berbeda dari load balancer:

    for i in `seq 1 100`; do \
      curl --connect-timeout 1 -s IP_ADDRESS && echo; \
    done  | sort | uniq -c
    

    Ganti IP_ADDRESS dengan alamat IP Ingress.

    Outputnya mirip dengan hal berikut ini:

    44 neg-demo-app-7f7dfd7bc6-dcn95
    56 neg-demo-app-7f7dfd7bc6-jrmzf
    

    Dalam output ini, jumlah respons yang berbeda sama dengan jumlah replika, yang menunjukkan bahwa semua Pod backend melayani traffic.

Pembersihan

Setelah menyelesaikan tugas di halaman ini, ikuti langkah-langkah berikut untuk menghapus resource guna mencegah timbulnya biaya yang tidak diinginkan pada akun Anda:

Menghapus cluster

gcloud

gcloud container clusters delete neg-demo-cluster

Konsol

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

    Buka Google Kubernetes Engine

  2. Pilih neg-demo-cluster lalu klik Delete.

  3. Saat diminta untuk mengonfirmasi, klik Delete.

Langkah berikutnya