Membuat load balancer internal di berbagai jaringan VPC


Halaman ini menjelaskan cara membuat Load Balancer Jaringan passthrough internal pada Google Kubernetes Engine (GKE) di jaringan VPC.

Sebelum membaca halaman ini, pastikan Anda sudah memahami konsep berikut:

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 lakukan inisialisasi gcloud CLI. Jika sebelumnya Anda telah menginstal gcloud CLI, dapatkan versi terbaru dengan menjalankan gcloud components update.

Membuat load balancer internal dengan Private Service Connect

Sebagai produsen layanan, Anda dapat menggunakan lampiran layanan agar layanan tersedia untuk konsumen di jaringan VPC lain dengan Private Service Connect. Anda dapat membuat, mengelola, dan menghapus lampiran layanan dengan resource kustom ServiceAttachment.

Persyaratan dan batasan

  • Batasan untuk Private Service Connect berlaku.
  • Anda dapat membuat lampiran layanan di GKE versi 1.21.4-gke.300 dan yang lebih baru.
  • Anda tidak dapat menggunakan subnet yang sama dalam beberapa konfigurasi lampiran layanan.
  • Anda harus membuat layanan GKE yang menggunakan Load Balancer Jaringan passthrough internal.
  • Anda tidak dapat menentukan subnet di project yang berbeda (VPC Bersama) untuk versi GKE sebelum 1.22.4-gke.100. Untuk VPC Bersama, pastikan semua persyaratan untuk VPC Bersama terpenuhi.

Membuat ServiceAttachment

  1. Buat subnet

    Anda harus membuat subnet baru untuk setiap ServiceAttachment.

    gcloud beta compute networks subnets create SUBNET_NAME \
        --project PROJECT_ID \
        --network NETWORK_NAME \
        --region REGION \
        --range SUBNET_RANGE \
        --purpose PRIVATE_SERVICE_CONNECT
    

    Ganti kode berikut:

    • SUBNET_NAME: nama subnet baru. Pada GKE versi 1.22.4-gke.100 dan yang lebih baru, Anda dapat menentukan subnet dalam project yang berbeda menggunakan URL referensi yang sepenuhnya memenuhi syarat untuk kolom ini. Anda bisa mendapatkan URL referensi yang sepenuhnya memenuhi syarat menggunakan perintah gcloud compute networks subnets describe.
    • PROJECT_ID: ID project Google Cloud Anda.
    • NETWORK_NAME: nama jaringan VPC untuk subnet.
    • REGION: region untuk subnet baru. Anda harus menggunakan region yang sama dengan layanan yang Anda buat.
    • SUBNET_RANGE: rentang alamat IP yang akan digunakan untuk subnet.
  2. Deploy workload.

    Manifes berikut menjelaskan Deployment yang menjalankan image container aplikasi web contoh. Simpan manifes sebagai my-deployment.yaml:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: psc-ilb
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: psc-ilb
      template:
        metadata:
          labels:
            app: psc-ilb
        spec:
          containers:
          - name: whereami
            image: us-docker.pkg.dev/google-samples/containers/gke/whereami:v1
            ports:
              - name: http
                containerPort: 8080
            readinessProbe:
              httpGet:
                path: /healthz
                port: 8080
                scheme: HTTP
              initialDelaySeconds: 5
              timeoutSeconds: 1
    
  3. Terapkan manifes ke cluster Anda:

    kubectl apply -f my-deployment.yaml
    
  4. Buat layanan. Manifes berikut menjelaskan layanan yang membuat Load Balancer Jaringan passthrough internal pada port TCP 8080. Simpan manifes sebagai my-service.yaml:

     apiVersion: v1
     kind: Service
     metadata:
       name: SERVICE_NAME
       annotations:
         networking.gke.io/load-balancer-type: "Internal"
     spec:
       type: LoadBalancer
       selector:
         app: psc-ilb
       ports:
       - port: 80
         targetPort: 8080
         protocol: TCP
    

    Ganti kode berikut:

    • SERVICE_NAME: nama layanan baru.
  5. Terapkan manifes ke cluster Anda:

    kubectl apply -f my-service.yaml
    
  6. Buat ServiceAttachment.

    Manifes berikut menjelaskan ServiceAttachment yang menampilkan layanan yang Anda buat untuk konsumen layanan. Simpan manifes sebagai my-psc.yaml:

    apiVersion: networking.gke.io/v1
    kind: ServiceAttachment
    metadata:
     name: SERVICE_ATTACHMENT_NAME
     namespace: default
    spec:
     connectionPreference: ACCEPT_AUTOMATIC
     natSubnets:
     - SUBNET_NAME
     proxyProtocol: false
     resourceRef:
       kind: Service
       name: SERVICE_NAME
    

    Ganti kode berikut:

    • SERVICE_ATTACHMENT_NAME: nama lampiran layanan baru.
    • SUBNET_NAME: nama subnet baru. Pada GKE versi 1.22.4-gke.100 dan yang lebih baru, Anda dapat menentukan subnet dalam project yang berbeda menggunakan URL referensi yang sepenuhnya memenuhi syarat untuk kolom ini. Anda bisa mendapatkan URL referensi yang sepenuhnya memenuhi syarat menggunakan perintah gcloud compute networks subnets describe. Untuk konfigurasi VPC Bersama, gunakan format berikut: projects/HOST_PROJECT_ID/regions/COMPUTE_REGION/subnetworks/SUBNET_NAME.

    Untuk informasi selengkapnya tentang kolom manifes, lihat kolom lampiran layanan.

  7. Terapkan manifes ke cluster Anda:

    kubectl apply -f my-psc.yaml
    
  8. Pastikan pengontrol Private Service Connect membuat lampiran layanan:

    gcloud beta compute service-attachments list
    

    Output menampilkan lampiran layanan dengan nama yang dibuat secara otomatis:

    NAME        REGION       PRODUCER_FORWARDING_RULE          CONNECTION_PREFERENCE
    k8s1-sa-... REGION_NAME  a3fea439c870148bdba5e59c9ea9451a  ACCEPT_AUTOMATIC
    

Melihat ServiceAttachment

Anda dapat melihat detail ServiceAttachment dengan perintah berikut:

kubectl describe serviceattachment SERVICE_ATTACHMENT_NAME

Outputnya mirip dengan ini:

Name:        <sa-name>
Namespace:    default
Labels:       <none>
Annotations:  <none>
API Version:  networking.gke.io/v1beta1
Kind:         ServiceAttachment
Metadata:
  ...
Status:
  Forwarding Rule URL:      https://www.googleapis.com/compute/beta/projects/<project>/regions/<region>/forwardingRules/<fr-name>
  Last Modified Timestamp:  2021-07-08T01:32:39Z
  Service Attachment URL:   https://www.googleapis.com/compute/beta/projects/<projects>/regions/<region>/serviceAttachments/<gce-service-attachment-name>
Events:                     <none>

Menggunakan ServiceAttachment

Untuk menggunakan layanan Anda dari project lain, lakukan langkah-langkah berikut:

  1. Dapatkan URL ServiceAttachment:

    kubectl get serviceattachment SERVICE_ATTACHMENT_NAME -o=jsonpath="{.status.serviceAttachmentURL}"
    

    Outputnya mirip dengan ini:

      serviceAttachmentURL: https://www.googleapis.com/compute/alpha/projects/<project>/region/<region>/serviceAttachments/k8s1-...my-sa
    
  2. Buat endpoint Private Service Connect menggunakan URL ServiceAttachment.

  3. Pastikan Anda dapat terhubung ke Layanan yang di-deploy di project produsen menggunakan perintah curl dari VM di project konsumen:

    curl PSC_IP_ADDRESS
    

    Ganti PSC_IP_ADDRESS dengan alamat IP aturan penerusan di project konsumen.

    Outputnya mirip dengan ini:

    {
      "cluster_name":"cluster",
      "host_header":"10.128.15.200",
      "node_name":"gke-psc-default-pool-be9b6e0e-dvxg.c.gke_project.internal",
      "pod_name":"foo-7bf648dcfd-l5jf8",
      "pod_name_emoji":"👚",
      "project_id":"gke_project",
      "timestamp":"2021-06-29T21:32:03",
      "zone":"ZONE_NAME"
    }
    

Mengupdate ServiceAttachment

Anda dapat mengupdate ServiceAttachment dengan langkah-langkah berikut:

  1. Edit manifes ServiceAttachment di my-psc.yaml:

    apiVersion: networking.gke.io/v1
    kind: ServiceAttachment
    metadata:
      name: my-sa
      namespace: default
    spec:
      connectionPreference: ACCEPT_AUTOMATIC
      natSubnets:
      - my-nat-subnet
      proxyProtocol: false
      resourceRef:
        kind: Service
        name: ilb-service
    
  2. Terapkan manifes ke cluster Anda:

    kubectl apply -f my-psc.yaml
    

Menghapus ServiceAttachment

Anda tidak dapat menghapus Load Balancer Jaringan passthrough internal yang terhubung ke lampiran layanan. Anda harus menghapus lampiran layanan dan Layanan GKE secara terpisah.

  1. Hapus lampiran layanan:

    kubectl delete serviceattachment SERVICE_ATTACHMENT_NAME --wait=false
    

    Perintah ini menandai lampiran layanan untuk dihapus, tetapi resource akan tetap ada. Anda juga dapat menunggu hingga penghapusan selesai dengan menghilangkan flag --wait.

  2. Hapus Layanan:

    kubectl delete svc SERVICE_NAME
    
  3. Hapus subnet:

    gcloud compute networks subnets delete SUBNET_NAME
    

Kolom ServiceAttachment

ServiceAttachment memiliki kolom berikut:

  • connectionPreference: preferensi koneksi yang menentukan cara pelanggan terhubung ke layanan. Anda dapat menggunakan persetujuan project otomatis dengan ACCEPT_AUTOMATIC atau persetujuan project eksplisit dengan ACCEPT_MANUAL. Untuk mengetahui informasi selengkapnya, lihat Memublikasikan layanan menggunakan Private Service Connect.
  • natSubnets: daftar nama resource subnetwork untuk lampiran layanan.
  • proxyProtocol: jika ditetapkan ke true, IP sumber konsumen dan ID koneksi Private Service Connect akan tersedia dalam permintaan. Kolom ini bersifat opsional dan setelan defaultnya adalah false.
  • consumerAllowList: daftar project konsumen yang diizinkan untuk terhubung ke ServiceAttachment. Kolom ini hanya dapat digunakan jika connectionPreference disetel ke ACCEPT_MANUAL. Untuk mengetahui informasi selengkapnya tentang kolom ini, lihat Memublikasikan layanan menggunakan Private Service Connect.
    • project: ID atau nomor project untuk project konsumen.
    • connectionLimit: batas koneksi untuk project konsumen. Kolom ini bersifat opsional.
    • forceSendFields: nama kolom yang dikirim untuk disertakan dalam permintaan API. Kolom ini bersifat opsional.
    • nullFields: nama kolom yang disertakan dalam permintaan API dengan nilai null. Kolom ini bersifat opsional.
  • consumerRejectList: daftar project ID atau nomor project konsumen yang tidak diizinkan untuk terhubung ke ServiceAttachment. Kolom ini hanya dapat digunakan jika connectionPreference disetel ke ACCEPT_MANUAL. Untuk mengetahui informasi selengkapnya tentang kolom ini, lihat Memublikasikan layanan menggunakan Private Service Connect.
  • resourceRef: referensi ke resource Kubernetes.

    • kind: jenis resource Kubernetes. Anda harus menggunakan Service.
    • name: nama resource Kubernetes yang harus berada di namespace yang sama dengan Load Balancer Jaringan passthrough internal.

Pemecahan masalah

Anda dapat melihat pesan error dengan perintah berikut:

kubectl get events -n NAMESPACE

Ganti NAMESPACE dengan namespace Load Balancer Jaringan passthrough internal.

Pesan error seperti di bawah ini muncul jika Anda mencoba menghapus Load Balancer Jaringan passthrough internal yang sedang digunakan lampiran layanan. Anda harus menghapus ServiceAttachment sebelum menghapus Load Balancer Jaringan passthrough internal.

Error syncing load balancer: failed to ensure load balancer: googleapi:
Error 400: The forwarding_rule resource '<fwd-rule-URL>' is already being used
by '<svc-attachment-URL>', resourceInUseByAnotherResource.

Langkah selanjutnya