Mengekspos gateway traffic masuk menggunakan load balancer eksternal

Ringkasan

Dengan Cloud Service Mesh, Anda dapat men-deploy dan mengelola gateway masuk sebagai bagian dari mesh layanan. Anda dapat mengonfigurasi load balancing lebih lanjut untuk cluster dengan Cloud Service Mesh menggunakan load balancer eksternal (load balancer fisik atau software di luar cluster) untuk mengirim traffic ke gateway ingress.

Halaman ini menunjukkan cara mengonfigurasi load balancer eksternal dengan Cloud Service Mesh. Atau, Anda dapat menyiapkan ingress dengan beberapa konfigurasi backend.

Sebelum memulai

Untuk menyelesaikan langkah-langkah dalam dokumen ini, Anda memerlukan resource berikut:

  • Cluster Kubernetes dengan Cloud Service Mesh terinstal.

  • Load balancer eksternal yang dapat mengakses node tempat cluster Anda berjalan. Anda mengonfigurasi load balancer eksternal ini untuk berada di depan gateway ingress cluster menggunakan alamat IP eksternal load balancer.

Menyiapkan lingkungan Anda

Jalankan perintah berikut dari workstation yang dapat mengakses cluster yang ingin Anda gunakan. Pastikan alat kubectl dikonfigurasi untuk menggunakan konteks cluster khusus untuk cluster Anda.

  1. Tetapkan variabel lingkungan.

    export ASM_INGRESSGATEWAY_NAMESPACE=asm-ingressgateway
    export ASM_INGRESSGATEWAY_DEPLOYMENT_NAME=asm-ingressgateway
    export ASM_INGRESSGATEWAY_SERVICE_NAME=asm-ingressgateway
    export ASM_INGRESSGATEWAY_NODE_LABEL=asm-ingressgateway
    
  2. Tetapkan IP address load balancer eksternal.

    export EXTERNAL_LB_IP_ADDRESS=EXTERNAL_LB_IP_ADDRESS
    
  3. [\Opsional/] Beri label pada node gateway masuk. Tindakan ini memastikan bahwa gateway di-deploy ke node tertentu dalam cluster.

    kubectl label nodes INGRESSGATEWAY_NODE_IP ${ASM_INGRESSGATEWAY_NODE_LABEL}=
    
    • INGRESSGATEWAY_NODE_IP: adalah node di cluster Kubernetes Anda yang menghosting gateway ingress. Jalankan perintah kubectl ini untuk sebanyak mungkin node ingress yang Anda miliki.

Membuat gateway masuk

Sebelum menyelesaikan petunjuk di bagian ini, Anda harus menentukan implementasi platform kontrol. Gunakan petunjuk di Mengidentifikasi penerapan bidang kontrol untuk melakukannya.

  1. Buat namespace. Namespace ini digunakan untuk men-deploy gateway entrance.

    kubectl create namespace ${ASM_INGRESSGATEWAY_NAMESPACE}
    
  1. Aktifkan namespace untuk injeksi. Langkah-langkahnya bergantung pada implementasi bidang kontrol Anda.

    Dikelola (TD)

    1. Terapkan label injeksi default ke namespace:
    kubectl label namespace ${ASM_INGRESSGATEWAY_NAMESPACE} \
        istio.io/rev- istio-injection=enabled --overwrite
    

    Dikelola (Istiod)

    Direkomendasikan: Jalankan perintah berikut untuk menerapkan label injeksi default ke namespace:

      kubectl label namespace ${ASM_INGRESSGATEWAY_NAMESPACE} \
          istio.io/rev- istio-injection=enabled --overwrite
    

    Jika Anda adalah pengguna lama dengan platform kontrol Istiod Terkelola: Sebaiknya gunakan injeksi default, tetapi injeksi berbasis revisi didukung. Gunakan petunjuk berikut:

    1. Jalankan perintah berikut untuk menemukan saluran rilis yang tersedia:

      kubectl -n istio-system get controlplanerevision
      

      Outputnya mirip dengan hal berikut ini:

      NAME                AGE
      asm-managed-rapid   6d7h
      

      CATATAN: Jika dua revisi bidang kontrol muncul dalam daftar di atas, hapus salah satunya. Memiliki beberapa saluran bidang kontrol di cluster tidak didukung.

      Dalam output, nilai di kolom NAME adalah label revisi yang sesuai dengan saluran rilis yang tersedia untuk versi Cloud Service Mesh.

    2. Terapkan label revisi ke namespace:

      kubectl label namespace ${ASM_INGRESSGATEWAY_NAMESPACE} \
          istio-injection- istio.io/rev=REVISION_LABEL --overwrite
      

    Dalam cluster

    Direkomendasikan: Jalankan perintah berikut untuk menerapkan label injeksi default ke namespace:

      kubectl label namespace ${ASM_INGRESSGATEWAY_NAMESPACE} \
          istio.io/rev- istio-injection=enabled --overwrite
    

    Sebaiknya gunakan injeksi default, tetapi injeksi berbasis revisi didukung: Gunakan petunjuk berikut:

    1. Gunakan perintah berikut untuk menemukan label revisi di istiod:

      kubectl get deploy -n istio-system -l app=istiod -o \
         jsonpath={.items[*].metadata.labels.'istio\.io\/rev'}'{"\n"}'
      
    2. Terapkan label revisi ke namespace. Dalam perintah berikut, REVISION_LABEL adalah nilai label revisi istiod yang Anda catat di langkah sebelumnya.

      kubectl label namespace ${ASM_INGRESSGATEWAY_NAMESPACE} \
          istio-injection- istio.io/rev=REVISION_LABEL --overwrite
      
  2. Terapkan file manifes gateway masuk.

    kubectl --namespace ${ASM_INGRESSGATEWAY_NAMESPACE} apply --filename https://raw.githubusercontent.com/GoogleCloudPlatform/anthos-service-mesh-samples/main/docs/ingress-gateway-external-lb/ingress-gateway.yaml
    

    Output yang diharapkan:

    serviceaccount/asm-ingressgateway created
    role.rbac.authorization.k8s.io/asm-ingressgateway created
    rolebinding.rbac.authorization.k8s.io/asm-ingressgateway created
    deployment.apps/asm-ingressgateway created
    service/asm-ingressgateway created
    poddisruptionbudget.policy/asm-ingressgateway created
    horizontalpodautoscaler.autoscaling/asm-ingressgateway created
    
  3. Terapkan patch pada layanan ingressgateway dengan alamat IP load balancer eksternal.

    cat <<EOF > asm-external-ip-patch.yaml
    spec:
      externalIPs:
        - ${EXTERNAL_LB_IP_ADDRESS}
      loadBalancerIP: ${EXTERNAL_LB_IP_ADDRESS}
    EOF
    
    kubectl --namespace ${ASM_INGRESSGATEWAY_NAMESPACE} patch service/${ASM_INGRESSGATEWAY_SERVICE_NAME} --patch "$(cat asm-external-ip-patch.yaml)"
    
  4. [Opsional] Terapkan patch pada deployment ingressgateway untuk afinitas label node gateway traffic masuk.

    cat <<EOF > asm-ingress-node-label-patch.yaml
    spec:
      template:
        spec:
          affinity:
            nodeAffinity:
              requiredDuringSchedulingIgnoredDuringExecution:
                nodeSelectorTerms:
                - matchExpressions:
                  - key: ${ASM_INGRESSGATEWAY_NODE_LABEL}
                    operator: Exists
    EOF
    
    kubectl --namespace ${ASM_INGRESSGATEWAY_NAMESPACE} patch deployment/${ASM_INGRESSGATEWAY_DEPLOYMENT_NAME} --patch "$(cat asm-ingress-node-label-patch.yaml)"
    

Menyiapkan load balancer eksternal

Di bagian ini, Anda akan mengonfigurasi load balancer eksternal untuk terhubung dengan gateway traffic masuk dari cluster.

Mengambil informasi port Service gateway masuk

  1. Dapatkan NodePorts.

    export HTTP_INGRESS_PORT=$(kubectl --namespace ${ASM_INGRESSGATEWAY_NAMESPACE} get service/${ASM_INGRESSGATEWAY_SERVICE_NAME} --output jsonpath='{.spec.ports[?(@.name=="http2")].nodePort}')
    export HTTPS_INGRESS_PORT=$(kubectl --namespace ${ASM_INGRESSGATEWAY_NAMESPACE} get service/${ASM_INGRESSGATEWAY_SERVICE_NAME} --output jsonpath='{.spec.ports[?(@.name=="https")].nodePort}')
    export STATUS_PORT=$(kubectl --namespace ${ASM_INGRESSGATEWAY_NAMESPACE} get service/${ASM_INGRESSGATEWAY_SERVICE_NAME} --output jsonpath='{.spec.ports[?(@.name=="status-port")].nodePort}')
    
  2. Menampilkan NodePorts.

    echo HTTP_INGRESS_PORT=${HTTP_INGRESS_PORT}
    echo HTTPS_INGRESS_PORT=${HTTPS_INGRESS_PORT}
    echo STATUS_PORT=${STATUS_PORT}
    

Mengonfigurasi load balancer eksternal

Gunakan NodePorts yang ditampilkan di langkah sebelumnya untuk mengonfigurasi konektivitas antara load balancer eksternal dan gateway traffic masuk.

  1. Konfigurasikan health check di konfigurasi load balancer Anda.

    hosts:    CLUSTER_NODE_IP
    Protocol: HTTP
    Port:     STATUS_PORT
    Path:     /healthz/ready
    
    • CLUSTER_NODE_IP: adalah alamat IP node di cluster Kubernetes Anda yang menghosting gateway ingress. Alamat IP ini harus dapat dijangkau dari load balancer eksternal Anda. Anda mungkin harus menyiapkan konfigurasi ini beberapa kali, satu kali per node cluster.

    • STATUS_PORT: adalah NodePort tempat API status kesehatan gateway ingress ditampilkan. Anda dapat menyalin informasi ini dari langkah sebelumnya. Nilainya sama untuk setiap node dalam cluster.

  2. Konfigurasikan node pool di load balancer untuk merutekan traffic HTTP dan HTTPS. Gunakan konfigurasi IP:PORT berikut untuk traffic di port 80 (HTTP) dan port 443 (HTTPS).

    80  ->  CLUSTER_NODE_IP:HTTP_INGRESS_PORT
    443 ->  CLUSTER_NODE_IP:HTTPS_INGRESS_PORT
    
    • CLUSTER_NODE_IP: adalah alamat IP node di cluster Kubernetes Anda yang menghosting gateway ingress. Alamat IP ini harus dapat dijangkau dari load balancer eksternal Anda. Anda mungkin harus menyiapkan konfigurasi ini beberapa kali, satu kali per node cluster.

    • HTTP_INGRESS_PORT: adalah NodePort tempat traffic HTTP gateway masuk diekspos. Anda dapat menyalin informasi ini dari langkah sebelumnya. Nilainya sama untuk setiap node dalam cluster.

    • HTTPS_INGRESS_PORT: adalah NodePort yang digunakan untuk mengekspos traffic HTTPS gateway masuk. Anda dapat menyalin informasi ini dari langkah sebelumnya. Nilainya sama untuk setiap node dalam cluster.

Untuk memverifikasi penyiapan, pastikan health check di load balancer Anda berhasil.

Langkah selanjutnya