Mengekspos gateway masuk menggunakan load balancer eksternal

Ringkasan

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

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

Sebelum memulai

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

  • Cluster Kubernetes dengan Cloud Service Mesh terinstal.

  • Load balancer eksternal yang dapat mengakses node tempat cluster Anda berada sedang berjalan. Anda akan mengonfigurasi load balancer eksternal ini untuk menangani traffic masuk gateway cluster Anda melalui External IP Address.

Menyiapkan lingkungan Anda

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

  1. Menetapkan 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 node gateway masuk. Hal 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 Kubernetes Anda yang menghosting gateway masuknya. Jalankan perintah kubectl ini sebagai jumlah node masuk yang Anda miliki.

Membuat gateway masuk

  1. Buat namespace. Namespace ini akan digunakan untuk men-deploy traffic masuk gateway.

    kubectl create namespace ${ASM_INGRESSGATEWAY_NAMESPACE}
    
  2. Mengaktifkan namespace untuk injeksi. Langkah-langkahnya bergantung pada jenis Cloud Service Mesh Anda (baik yang terkelola maupun dalam cluster).

    Terkelola

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

      kubectl -n istio-system get controlplanerevision
      

      Outputnya mirip dengan hal berikut ini:

      NAME                AGE
      asm-managed         6d7h
      asm-managed-rapid   6d7h
      

      Pada output, nilai pada 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

    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 ini, REVISION adalah nilai revisi istiod label yang Anda catat pada langkah sebelumnya.

      kubectl label namespace ${ASM_INGRESSGATEWAY_NAMESPACE} \
        istio-injection- istio.io/rev=REVISION --overwrite
      
  3. 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
    
  4. Tambahkan patch 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)"
    
  5. [Opsional] Menambahkan patch deployment ingressgateway untuk gateway masuk afinitas label node.

    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 yang akan terhubung dengan gateway masuknya 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 pada langkah sebelumnya untuk mengonfigurasi konektivitas antara load balancer eksternal dan gateway masuk.

  1. Mengonfigurasi 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 yang menghosting gateway masuk. Alamat IP ini harus dapat dijangkau dari load balancer eksternal. Anda mungkin harus menyiapkan beberapa kali, sekali per node cluster.

    • STATUS_PORT: adalah NodePort yang digunakan untuk traffic masuk API status kesehatan gateway terekspos. Anda dapat menyalin informasi ini dari langkah sebelumnya. Jumlahnya akan sama untuk setiap node dalam cluster.

  2. Mengonfigurasi node pool di load balancer untuk merutekan HTTP dan HTTPS kemacetan. 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 yang menghosting gateway masuk. Alamat IP ini harus dapat dijangkau dari load balancer eksternal. Anda mungkin harus menyiapkan beberapa kali, sekali per node cluster.

    • HTTP_INGRESS_PORT: adalah NodePort yang digunakan traffic HTTP gateway masuk terekspos. Anda dapat menyalin informasi ini dari langkah sebelumnya. Jumlahnya akan sama untuk setiap node dalam cluster.

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

Untuk memverifikasi penyiapan, pastikan health check pada load balancer Anda lulus.

Langkah selanjutnya