Men-deploy aplikasi Windows di Kubernetes terkelola

Last reviewed 2024-08-14 UTC

Dokumen ini menjelaskan cara Anda men-deploy arsitektur referensi dalam Mengelola dan menskalakan jaringan untuk aplikasi Windows yang berjalan di Kubernetes terkelola.

Petunjuk ini ditujukan untuk arsitek cloud, administrator jaringan, dan tenaga profesional IT yang bertanggung jawab atas desain dan pengelolaan aplikasi Windows yang berjalan di cluster Google Kubernetes Engine (GKE).

Arsitektur

Diagram berikut menunjukkan arsitektur referensi yang Anda gunakan saat men-deploy aplikasi Windows yang berjalan di cluster GKE terkelola.

Data mengalir melalui Load Balancer Aplikasi internal dan gateway Envoy.

Seperti yang ditunjukkan pada diagram sebelumnya, panah mewakili alur kerja untuk mengelola jaringan untuk aplikasi Windows yang berjalan di GKE menggunakan Cloud Service Mesh dan gateway Envoy. Cluster GKE regional mencakup node pool Windows dan Linux. Cloud Service Mesh membuat dan mengelola rute traffic ke Pod Windows.

Tujuan

  • Buat dan siapkan cluster GKE untuk menjalankan aplikasi Windows dan proxy Envoy.
  • Deploy dan verifikasi aplikasi Windows.
  • Konfigurasi Cloud Service Mesh sebagai bidang kontrol untuk gateway Envoy.
  • Gunakan Kubernetes Gateway API untuk menyediakan Load Balancer Aplikasi internal dan mengekspos gateway Envoy.
  • Memahami operasi deployment berkelanjutan yang Anda buat.

Biaya

Deployment arsitektur ini menggunakan komponen Google Cloud yang dapat ditagih berikut:Google Cloud

Setelah menyelesaikan deployment ini, Anda dapat menghindari penagihan berkelanjutan dengan menghapus resource yang Anda buat. Untuk mengetahui informasi selengkapnya, lihat Pembersihan.

Sebelum memulai

  1. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  2. Verify that billing is enabled for your Google Cloud project.

  3. Enable the Cloud Shell, and Cloud Service Mesh APIs.

    Enable the APIs

  4. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    Jika berjalan di lingkungan Virtual Private Cloud (VPC) bersama, Anda juga perlu mengikuti petunjuk untuk membuat subnet khusus proxy dan aturan firewall secara manual untuk pemeriksaan responsivitas Cloud Load Balancing.

    Membuat cluster GKE

    Gunakan langkah-langkah berikut untuk membuat cluster GKE. Anda menggunakan cluster GKE untuk memuat dan menjalankan aplikasi Windows dan proxy Envoy dalam deployment ini.

    1. Di Cloud Shell, jalankan perintah Google Cloud CLI berikut untuk membuat cluster GKE regional dengan satu node di setiap region:

      gcloud container clusters create my-cluster
          --enable-ip-alias \
          --num-nodes=1 \
          --release-channel stable \
          --enable-dataplane-v2 \
          --region us-central1 \
          --scopes=cloud-platform \
          --gateway-api=standard
      
    2. Tambahkan node pool Windows ke cluster GKE:

      gcloud container node-pools create win-pool \
          --cluster=my-cluster \
          --image-type=windows_ltsc_containerd \
          --no-enable-autoupgrade \
          --region=us-central1 \
          --num-nodes=1 \
          --machine-type=n1-standard-2 \
          --windows-os-version=ltsc2019
      

      Penyelesaian operasi ini mungkin memerlukan waktu sekitar 20 menit.

    3. Simpan Google Cloud project ID Anda dalam variabel lingkungan:

      export PROJECT_ID=$(gcloud config get project)
      
    4. Hubungkan ke cluster GKE

      gcloud container clusters get-credentials my-cluster --region us-central1
      
    5. Mencantumkan semua node di cluster GKE:

      kubectl get nodes
      

      Output akan menampilkan tiga node Linux dan tiga node Windows.

      Setelah cluster GKE siap, Anda dapat men-deploy dua aplikasi pengujian berbasis Windows.

    Men-deploy dua aplikasi pengujian

    Di bagian ini, Anda akan men-deploy dua aplikasi pengujian berbasis Windows. Kedua aplikasi pengujian mencetak nama host tempat aplikasi berjalan. Anda juga membuat Layanan Kubernetes untuk mengekspos aplikasi melalui grup endpoint jaringan (NEG) mandiri.

    Saat Anda men-deploy aplikasi berbasis Windows dan Layanan Kubernetes di cluster regional, NEG akan dibuat untuk setiap zona tempat aplikasi berjalan. Selanjutnya, panduan deployment ini membahas cara mengonfigurasi NEG ini sebagai backend untuk layanan Cloud Service Mesh.

    1. Di Cloud Shell, terapkan file YAML berikut dengan kubectl untuk men-deploy aplikasi pengujian pertama. Perintah ini men-deploy tiga instance aplikasi pengujian, satu di setiap zona regional.

      apiVersion: apps/v1
      kind: Deployment
      metadata:
        labels:
          app: win-webserver-1
        name: win-webserver-1
      spec:
        replicas: 3
        selector:
          matchLabels:
            app: win-webserver-1
        template:
          metadata:
            labels:
              app: win-webserver-1
            name: win-webserver-1
          spec:
           containers:
            - name: windowswebserver
              image: k8s.gcr.io/e2e-test-images/agnhost:2.36
              command: ["/agnhost"]
              args: ["netexec", "--http-port", "80"]
           topologySpreadConstraints:
            - maxSkew: 1
              topologyKey: kubernetes.io/hostname
              whenUnsatisfiable: DoNotSchedule
              labelSelector:
                matchLabels:
                  app: win-webserver-1
           nodeSelector:
            kubernetes.io/os: windows
      
    2. Terapkan Layanan Kubernetes yang cocok dan ekspos dengan NEG:

      apiVersion: v1
      kind: Service
      metadata:
        name: win-webserver-1
        annotations:
          cloud.google.com/neg: '{"exposed_ports": {"80":{"name": "win-webserver-1"}}}'
      spec:
        type: ClusterIP
        selector:
          app: win-webserver-1
        ports:
        - name: http
          protocol: TCP
          port: 80
          targetPort: 80
      
    3. Verifikasi deployment:

      kubectl get pods
      

      Output menunjukkan bahwa aplikasi memiliki tiga Pod Windows yang sedang berjalan.

      NAME                               READY   STATUS    RESTARTS   AGE
      win-webserver-1-7bb4c57f6d-hnpgd   1/1     Running   0          5m58s
      win-webserver-1-7bb4c57f6d-rgqsb   1/1     Running   0          5m58s
      win-webserver-1-7bb4c57f6d-xp7ww   1/1     Running   0          5m58s
      
    4. Pastikan bahwa Layanan Kubernetes telah dibuat:

      $ kubectl get svc
      

      Outputnya akan terlihat seperti berikut:

      NAME              TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
      kubernetes        ClusterIP   10.64.0.1            443/TCP   58m
      win-webserver-1   ClusterIP   10.64.6.20           80/TCP    3m35s
      
    5. Jalankan perintah describe untuk kubectl guna memverifikasi bahwa NEG yang sesuai telah dibuat untuk Layanan Kubernetes di setiap zona tempat aplikasi berjalan:

      $ kubectl describe service win-webserver-1
      

      Outputnya akan terlihat seperti berikut:

      Name:              win-webserver-1
      Namespace:         default
      Labels:            
      Annotations:       cloud.google.com/neg: {"exposed_ports": {"80":{"name": "win-webserver-1"}}}
                         cloud.google.com/neg-status: {"network_endpoint_groups":{"80":"win-webserver-1"},"zones":["us-central1-a","us-central1-b","us-central1-c"]}
      Selector:          app=win-webserver-1
      Type:              ClusterIP
      IP Family Policy:  SingleStack
      IP Families:       IPv4
      IP:                10.64.6.20
      IPs:               10.64.6.20
      Port:              http  80/TCP
      TargetPort:        80/TCP
      Endpoints:         10.60.3.5:80,10.60.4.5:80,10.60.5.5:80
      Session Affinity:  None
      Events:
        Type    Reason  Age    From            Message
        ----    ------  ----   ----            -------
        Normal  Create  4m25s  neg-controller  Created NEG "win-webserver-1" for default/win-webserver-1-win-webserver-1-http/80-80-GCE_VM_IP_PORT-L7 in "us-central1-a".
        Normal  Create  4m18s  neg-controller  Created NEG "win-webserver-1" for default/win-webserver-1-win-webserver-1-http/80-80-GCE_VM_IP_PORT-L7 in "us-central1-b".
        Normal  Create  4m11s  neg-controller  Created NEG "win-webserver-1" for default/win-webserver-1-win-webserver-1-http/80-80-GCE_VM_IP_PORT-L7 in "us-central1-c".
        Normal  Attach  4m9s   neg-controller  Attach 1 network endpoint(s) (NEG "win-webserver-1" in zone "us-central1-a")
        Normal  Attach  4m8s   neg-controller  Attach 1 network endpoint(s) (NEG "win-webserver-1" in zone "us-central1-c")
        Normal  Attach  4m8s   neg-controller  Attach 1 network endpoint(s) (NEG "win-webserver-1" in zone "us-central1-b")
      

      Output dari perintah sebelumnya menunjukkan bahwa NEG dibuat untuk setiap zona.

    6. Opsional: Gunakan gcloud CLI untuk memverifikasi bahwa NEG telah dibuat:

      gcloud compute network-endpoint-groups list
      

      Outputnya adalah sebagai berikut:

      NAME                                                        LOCATION            ENDPOINT_TYPE     SIZE
      win-webserver-1                                us-central1-a  GCE_VM_IP_PORT  1
      win-webserver-1                                us-central1-b  GCE_VM_IP_PORT  1
      win-webserver-1                                us-central1-c  GCE_VM_IP_PORT  1
      
    7. Untuk men-deploy aplikasi pengujian kedua, terapkan file YAML berikut:

      apiVersion: apps/v1
      kind: Deployment
      metadata:
        labels:
          app: win-webserver-2
        name: win-webserver-2
      spec:
        replicas: 3
        selector:
          matchLabels:
            app: win-webserver-2
        template:
          metadata:
            labels:
              app: win-webserver-2
            name: win-webserver-2
          spec:
           containers:
            - name: windowswebserver
              image: k8s.gcr.io/e2e-test-images/agnhost:2.36
              command: ["/agnhost"]
              args: ["netexec", "--http-port", "80"]
           topologySpreadConstraints:
            - maxSkew: 1
              topologyKey: kubernetes.io/hostname
              whenUnsatisfiable: DoNotSchedule
              labelSelector:
                matchLabels:
                  app: win-webserver-2
           nodeSelector:
            kubernetes.io/os: windows
      
    8. Buat Layanan Kubernetes yang sesuai:

      apiVersion: v1
      kind: Service
      metadata:
        name: win-webserver-2
        annotations:
          cloud.google.com/neg: '{"exposed_ports": {"80":{"name": "win-webserver-2"}}}'
      spec:
        type: ClusterIP
        selector:
          app: win-webserver-2
        ports:
        - name: http
          protocol: TCP
          port: 80
          targetPort: 80
      
    9. Verifikasi deployment aplikasi:

      kubectl get pods
      

      Periksa output dan pastikan ada tiga Pod yang berjalan.

    10. Pastikan Layanan Kubernetes dan tiga NEG telah dibuat:

      kubectl describe service win-webserver-2
      

    Mengonfigurasi Cloud Service Mesh

    Di bagian ini, Cloud Service Mesh dikonfigurasi sebagai bidang kontrol untuk gateway Envoy.

    Anda memetakan gateway Envoy ke konfigurasi perutean Cloud Service Mesh yang relevan dengan menentukan parameter scope_name. Parameter scope_name memungkinkan Anda mengonfigurasi aturan pemilihan rute yang berbeda untuk berbagai gateway Envoy.

    1. Di Cloud Shell, buat aturan firewall yang mengizinkan traffic masuk dari layanan Google yang memeriksa responsivitas aplikasi:

      gcloud compute firewall-rules create allow-health-checks \
        --network=default \
        --direction=INGRESS \
        --action=ALLOW \
        --rules=tcp \
        --source-ranges="35.191.0.0/16,130.211.0.0/22,209.85.152.0/22,209.85.204.0/22"
      
    2. Periksa responsivitas aplikasi pertama:

      gcloud compute health-checks create http win-app-1-health-check \
        --enable-logging \
        --request-path="/healthz" \
        --use-serving-port
      
    3. Periksa daya tanggap aplikasi kedua:

      gcloud compute health-checks create http win-app-2-health-check \
        --enable-logging \
        --request-path="/healthz" \
        --use-serving-port
      
    4. Buat layanan backend Cloud Service Mesh untuk aplikasi pertama:

      gcloud compute backend-services create win-app-1-service \
       --global \
       --load-balancing-scheme=INTERNAL_SELF_MANAGED \
       --port-name=http \
       --health-checks win-app-1-health-check
      
    5. Buat layanan backend Cloud Service Mesh untuk aplikasi kedua:

      gcloud compute backend-services create win-app-2-service \
       --global \
       --load-balancing-scheme=INTERNAL_SELF_MANAGED \
       --port-name=http \
       --health-checks win-app-2-health-check
      
    6. Tambahkan NEG yang Anda buat sebelumnya. NEG ini dikaitkan dengan aplikasi pertama yang Anda buat sebagai backend ke layanan backend Cloud Service Mesh. Contoh kode ini menambahkan satu NEG untuk setiap zona di cluster regional yang Anda buat.

      BACKEND_SERVICE=win-app-1-service
      APP1_NEG_NAME=win-webserver-1
      MAX_RATE_PER_ENDPOINT=10
      
      gcloud compute backend-services add-backend $BACKEND_SERVICE \
        --global \
        --network-endpoint-group $APP1_NEG_NAME \
        --network-endpoint-group-zone us-central1-b \
        --balancing-mode RATE \
        --max-rate-per-endpoint $MAX_RATE_PER_ENDPOINT
      
      gcloud compute backend-services add-backend $BACKEND_SERVICE \
        --global \
        --network-endpoint-group $APP1_NEG_NAME \
        --network-endpoint-group-zone us-central1-a \
        --balancing-mode RATE \
        --max-rate-per-endpoint $MAX_RATE_PER_ENDPOINT
      
      gcloud compute backend-services add-backend $BACKEND_SERVICE \
        --global \
        --network-endpoint-group $APP1_NEG_NAME \
        --network-endpoint-group-zone us-central1-c \
        --balancing-mode RATE \
        --max-rate-per-endpoint $MAX_RATE_PER_ENDPOINT
      
    7. Menambahkan NEG tambahan. NEG ini dikaitkan dengan aplikasi kedua yang Anda buat sebagai backend ke layanan backend Cloud Service Mesh. Contoh kode ini menambahkan satu NEG untuk setiap zona di cluster regional yang Anda buat.

      BACKEND_SERVICE=win-app-2-service
      APP2_NEG_NAME=win-webserver-2
      
      gcloud compute backend-services add-backend $BACKEND_SERVICE \
        --global \
        --network-endpoint-group $APP2_NEG_NAME \
        --network-endpoint-group-zone us-central1-b \
        --balancing-mode RATE \
        --max-rate-per-endpoint $MAX_RATE_PER_ENDPOINT
      
      gcloud compute backend-services add-backend $BACKEND_SERVICE \
        --global \
        --network-endpoint-group $APP2_NEG_NAME \
        --network-endpoint-group-zone us-central1-a \
        --balancing-mode RATE \
        --max-rate-per-endpoint $MAX_RATE_PER_ENDPOINT
      
      gcloud compute backend-services add-backend $BACKEND_SERVICE \
        --global \
        --network-endpoint-group $APP2_NEG_NAME \
        --network-endpoint-group-zone us-central1-c \
        --balancing-mode RATE \
        --max-rate-per-endpoint $MAX_RATE_PER_ENDPOINT
      

    Mengonfigurasi resource Cloud Service Mesh tambahan

    Setelah mengonfigurasi layanan Cloud Service Mesh, Anda perlu mengonfigurasi dua resource tambahan untuk menyelesaikan penyiapan Cloud Service Mesh.

    Pertama, langkah-langkah ini menunjukkan cara mengonfigurasi resource Gateway. Resource Gateway adalah resource virtual yang digunakan untuk membuat aturan perutean Cloud Service Mesh. Aturan perutean Cloud Service Mesh digunakan untuk mengonfigurasi proxy Envoy sebagai gateway.

    Selanjutnya, langkah-langkah ini menunjukkan cara mengonfigurasi resource HTTPRoute untuk setiap layanan backend. Resource HTTPRoute memetakan permintaan HTTP ke layanan backend yang relevan.

    1. Di Cloud Shell, buat file YAML bernama gateway.yaml yang menentukan resource Gateway:

      cat <<EOF> gateway.yaml
      name: gateway80
      scope: gateway-proxy
      ports:
      - 8080
      type: OPEN_MESH
      EOF
      
    2. Buat resource Gateway dengan memanggil file gateway.yaml:

      gcloud network-services gateways import gateway80 \
        --source=gateway.yaml \
        --location=global
      

      Nama Gateway akan menjadi projects/$PROJECT_ID/locations/global/gateways/gateway80.

      Anda menggunakan nama Gateway ini saat membuat HTTPRoutes untuk setiap layanan backend.

    Buat HTTPRoutes untuk setiap layanan backend:

    1. Di Cloud Shell, simpan ID project Google Cloud Anda dalam variabel lingkungan:

      export PROJECT_ID=$(gcloud config get project)
      
    2. Buat file YAML HTTPRoute untuk aplikasi pertama:

      cat <<EOF> win-app-1-route.yaml
      name: win-app-1-http-route
      hostnames:
      - win-app-1
      gateways:
      - projects/$PROJECT_ID/locations/global/gateways/gateway80
      rules:
      - action:
         destinations:
         - serviceName: "projects/$PROJECT_ID/locations/global/backendServices/win-app-1-service"
      EOF
      
    3. Buat resource HTTPRoute untuk aplikasi pertama:

      gcloud network-services http-routes import win-app-1-http-route \
        --source=win-app-1-route.yaml \
        --location=global
      
    4. Buat file YAML HTTPRoute untuk aplikasi kedua:

      cat <<EOF> win-app-2-route.yaml
      name: win-app-2-http-route
      hostnames:
      - win-app-2
      gateways:
      - projects/$PROJECT_ID/locations/global/gateways/gateway80
      rules:
      - action:
         destinations:
       - serviceName: "projects/$PROJECT_ID/locations/global/backendServices/win-app-2-service"
      EOF
      
    5. Buat resource HTTPRoute untuk aplikasi kedua:

      gcloud network-services http-routes import win-app-2-http-route \
        --source=win-app-2-route.yaml \
        --location=global
      

    Men-deploy dan mengekspos gateway Envoy

    Setelah membuat dua aplikasi pengujian berbasis Windows dan Cloud Service Mesh, Anda men-deploy gateway Envoy dengan membuat file YAML deployment. File YAML deployment menyelesaikan tugas berikut:

    • Melakukan bootstrap gateway Envoy.
    • Mengonfigurasi gateway Envoy untuk menggunakan Cloud Service Mesh sebagai bidang kontrolnya.
    • Mengonfigurasi gateway Envoy untuk menggunakan HTTPRoutes untuk gateway bernama Gateway80.

    Deploy dua gateway Envoy replika. Pendekatan ini membantu membuat gateway tahan terhadap kesalahan dan menyediakan redundansi. Untuk menskalakan gateway Envoy secara otomatis berdasarkan beban, Anda dapat mengonfigurasi Horizontal Pod Autoscaler secara opsional. Jika Anda memutuskan untuk mengonfigurasi Horizontal Pod Autoscaler, Anda harus mengikuti petunjuk di Mengonfigurasi penskalaan otomatis Pod horizontal.

    1. Di Cloud Shell, buat file YAML:

      apiVersion: apps/v1
      kind: Deployment
          metadata:
        creationTimestamp: null
        labels:
          app: td-envoy-gateway
        name: td-envoy-gateway
      spec:
        replicas: 2
        selector:
          matchLabels:
            app: td-envoy-gateway
        template:
          metadata:
            creationTimestamp: null
            labels:
              app: td-envoy-gateway
          spec:
            containers:
            - name: envoy
              image: envoyproxy/envoy:v1.21.6
              imagePullPolicy: Always
              resources:
                limits:
                  cpu: "2"
                  memory: 1Gi
                requests:
                  cpu: 100m
                  memory: 128Mi
              env:
              - name: ENVOY_UID
                value: "1337"
              volumeMounts:
                - mountPath: /etc/envoy
                  name: envoy-bootstrap
            initContainers:
            - name: td-bootstrap-writer
              image: gcr.io/trafficdirector-prod/xds-client-bootstrap-generator
              imagePullPolicy: Always
              args:
                - --project_number='my_project_number'
                - --scope_name='gateway-proxy'
                - --envoy_port=8080
                - --bootstrap_file_output_path=/var/lib/data/envoy.yaml
                - --traffic_director_url=trafficdirector.googleapis.com:443
                - --expose_stats_port=15005
              volumeMounts:
                - mountPath: /var/lib/data
                  name: envoy-bootstrap
            volumes:
              - name: envoy-bootstrap
                emptyDir: {}
      
      • Ganti my_project_number dengan nomor project Anda.

        • Anda dapat menemukan nomor project dengan menjalankan perintah berikut:
        gcloud projects describe $(gcloud config get project)
         --format="value(projectNumber)"
        

      Port 15005 digunakan untuk mengekspos endpoint Admin Envoy yang bernama /stats. Info ini juga digunakan untuk tujuan berikut:

      • Sebagai endpoint responsif dari Load Balancer Aplikasi internal.
      • Sebagai cara untuk menggunakan metrik Google Cloud Managed Service for Prometheus dari Envoy.

      Saat dua Pod Envoy Gateway berjalan, buat layanan jenis ClusterIP untuk mengeksposnya. Anda juga harus membuat file YAML bernama BackendConfig. BackendConfig menentukan pemeriksaan responsivitas non-standar. Pemeriksaan tersebut digunakan untuk memverifikasi responsivitas gateway Envoy.

    2. Untuk membuat konfigurasi backend dengan pemeriksaan responsivitas non-standar, buat file YAML bernama envoy-backendconfig:

      apiVersion: cloud.google.com/v1
      kind: BackendConfig
      metadata:
        name: envoy-backendconfig
      spec:
        healthCheck:
          checkIntervalSec: 5
          timeoutSec: 5
          healthyThreshold: 2
          unhealthyThreshold: 3
          type: HTTP
          requestPath: /stats
          port: 15005
      

      Pemeriksaan responsivitas akan menggunakan endpoint /stats di port 15005 untuk terus memeriksa responsivitas gateway Envoy.

    3. Buat layanan gateway Envoy:

      apiVersion: v1
      kind: Service
      metadata:
        name: td-envoy-gateway
        annotations:
          cloud.google.com/backend-config: '{"default": "envoy-backendconfig"}'
      spec:
        type: ClusterIP
        selector:
          app: td-envoy-gateway
        ports:
        - name: http
          protocol: TCP
          port: 8080
          targetPort: 8080
        - name: stats
          protocol: TCP
          port: 15005
          targetPort: 15005
      
    4. Lihat layanan gateway Envoy yang Anda buat:

      kubectl get svc td-envoy-gateway
      

    Buat resource Gateway Kubernetes

    Membuat resource Gateway Kubernetes akan menyediakan Load Balancer Aplikasi internal untuk mengekspos gateway Envoy.

    Sebelum membuat resource tersebut, Anda harus membuat dua contoh sertifikat yang ditandatangani sendiri, lalu mengimpornya ke cluster GKE sebagai Secret Kubernetes. Sertifikat ini memungkinkan arsitektur gateway berikut:

    • Setiap aplikasi ditayangkan melalui HTTPS.
    • Setiap aplikasi menggunakan sertifikat khusus.

    Saat menggunakan sertifikat yang dikelola sendiri, Load Balancer Aplikasi internal dapat menggunakan hingga batas maksimum sertifikat untuk mengekspos aplikasi dengan nama domain yang sepenuhnya memenuhi syarat.

    Untuk membuat sertifikat, gunakan openssl.

    1. Di Cloud Shell, buat file konfigurasi untuk sertifikat pertama:

      cat <<EOF >CONFIG_FILE
      [req]
      default_bits              = 2048
      req_extensions            = extension_requirements
      distinguished_name        = dn_requirements
      prompt                    = no
      [extension_requirements]
      basicConstraints          = CA:FALSE
      keyUsage                  = nonRepudiation, digitalSignature, keyEncipherment
      subjectAltName            = @sans_list
      [dn_requirements]
      0.organizationName        = example
      commonName                = win-webserver-1.example.com
      [sans_list]
      DNS.1                     = win-webserver-1.example.com
      EOF
      
    2. Buat kunci pribadi untuk sertifikat pertama:

      openssl genrsa -out sample_private_key 2048
      
    3. Buat permintaan sertifikat:

      openssl req -new -key sample_private_key -out CSR_FILE -config CONFIG_FILE
      
    4. Tandatangani dan buat sertifikat pertama:

      openssl x509 -req -signkey sample_private_key -in CSR_FILE -out sample.crt     -extfile CONFIG_FILE -extensions extension_requirements -days 90
      
    5. Buat file konfigurasi untuk sertifikat kedua:

      cat <<EOF >CONFIG_FILE2
      [req]
      default_bits              = 2048
      req_extensions            = extension_requirements
      distinguished_name        = dn_requirements
      prompt                    = no
      [extension_requirements]
      basicConstraints          = CA:FALSE
      keyUsage                  = nonRepudiation, digitalSignature, keyEncipherment
      subjectAltName            = @sans_list
      [dn_requirements]
      0.organizationName        = example
      commonName                = win-webserver-2.example.com
      [sans_list]
      DNS.1                     = win-webserver-2.example.com
      EOF
      
    6. Buat kunci pribadi untuk sertifikat kedua:

      openssl genrsa -out sample_private_key2 2048
      
    7. Buat permintaan sertifikat:

      openssl req -new -key sample_private_key2 -out CSR_FILE2 -config CONFIG_FILE2
      
    8. Tandatangani dan buat sertifikat kedua:

      openssl x509 -req -signkey sample_private_key2 -in CSR_FILE2 -out sample2.crt     -extfile CONFIG_FILE2 -extensions extension_requirements -days 90
      

    Mengimpor sertifikat sebagai Secret Kubernetes

    Di bagian ini, Anda akan menyelesaikan tugas-tugas berikut:

    • Impor sertifikat yang ditandatangani sendiri ke cluster GKE sebagai Secret Kubernetes.
    • Buat alamat IP statis untuk VPC internal.
    • Buat resource Kubernetes Gateway API.
    • Pastikan bahwa sertifikat berfungsi.
    1. Di Cloud Shell, impor sertifikat pertama sebagai Secret Kubernetes:

      kubectl create secret tls sample-cert --cert sample.crt --key sample_private_key
      
    2. Impor sertifikat kedua sebagai Secret Kubernetes:

      kubectl create secret tls sample-cert-2 --cert sample2.crt --key sample_private_key2
      
    3. Untuk mengaktifkan Load Balancer Aplikasi internal, buat alamat IP statis di VPC internal:

      gcloud compute addresses create sample-ingress-ip --region us-central1 --subnet default
      
    4. Buat file YAML resource Kubernetes Gateway API:

      kind: Gateway
      apiVersion: gateway.networking.k8s.io/v1beta1
      metadata:
        name: internal-https
      spec:
        gatewayClassName: gke-l7-rilb
        addresses:
          - type: NamedAddress
            value: sample-ingress-ip
        listeners:
        - name: https
          protocol: HTTPS
          port: 443
          tls:
            mode: Terminate
            certificateRefs:
            - name: sample-cert
            - name: sample-cert-2
      

      Secara default, Gateway Kubernetes tidak memiliki rute default. Gateway menampilkan error halaman tidak ditemukan (404) saat permintaan dikirim ke gateway.

    5. Konfigurasi file YAML route default untuk Gateway Kubernetes yang meneruskan semua permintaan masuk ke gateway Envoy:

        kind: HTTPRoute
        apiVersion: gateway.networking.k8s.io/v1beta1
        metadata:
          name: envoy-default-backend
        spec:
          parentRefs:
          - kind: Gateway
            name: internal-https
          rules:
          - backendRefs:
            - name: td-envoy-gateway
              port: 8080
      

      Verifikasi alur lengkap dengan mengirim permintaan HTTP ke kedua aplikasi. Untuk memverifikasi bahwa gateway Envoy merutekan traffic ke Pod aplikasi yang benar, periksa header Host HTTP.

    6. Temukan dan simpan alamat IP Gateway Kubernetes dalam variabel lingkungan:

      export EXTERNAL_IP=$(kubectl get gateway internal-https -o json | jq .status.addresses[0].value -r)
      
    7. Kirim permintaan ke aplikasi pertama:

      curl --insecure -H "Host: win-app-1" https://$EXTERNAL_IP/hostName
      
    8. Kirim permintaan ke aplikasi kedua:

      curl --insecure -H "Host: win-app-2" https://$EXTERNAL_IP/hostName
      
    9. Pastikan nama host yang ditampilkan dari permintaan cocok dengan Pod yang menjalankan win-app-1 dan win-app-2:

      kubectl get pods
      

      Output akan menampilkan win-app-1 dan win-app-2.

    Memantau gateway Envoy

    Pantau gateway Envoy Anda dengan Google Cloud Managed Service for Prometheus.

    Google Cloud Managed Service for Prometheus harus diaktifkan secara default di cluster yang Anda buat sebelumnya.

    1. Di Cloud Shell, buat resource PodMonitoring dengan menerapkan file YAML berikut:

      apiVersion: monitoring.googleapis.com/v1
      kind: PodMonitoring
      metadata:
        name: prom-envoy
      spec:
        selector:
          matchLabels:
            app: td-envoy-gateway
        endpoints:
        - port: 15005
          interval: 30s
          path: /stats/prometheus
      

      Setelah menerapkan file YAML, sistem akan mulai mengumpulkan metrik Google Cloud Managed Service for Prometheus di dasbor.

    2. Untuk membuat dasbor metrik Google Cloud Managed Service for Prometheus, ikuti petunjuk berikut:

      1. Login ke konsol Google Cloud .
      2. Buka menu .
      3. Klik Operasi > Pemantauan > Dasbor.
    3. Untuk mengimpor dasbor, ikuti petunjuk berikut:

      1. Di layar Dasbor, klik Sample Library.
      2. Masukkan envoy di kotak filter.
      3. Klik Istio Envoy Prometheus Overview.
      4. Pilih kotak centang.
      5. Klik Impor, lalu klik Konfirmasi untuk mengimpor dasbor.
    4. Untuk melihat dasbor, ikuti petunjuk berikut:

      1. Klik Daftar Dasbor.
      2. Pilih Integrasi.
      3. Klik Istio Envoy Prometheus Overview untuk melihat dasbor.

    Sekarang Anda dapat melihat metrik terpenting dari gateway Envoy Anda. Anda juga dapat mengonfigurasi pemberitahuan berdasarkan kriteria Anda. Sebelum membersihkan, kirim beberapa permintaan pengujian lagi ke aplikasi dan lihat cara dasbor diperbarui dengan metrik terbaru.

    Pembersihan

    Agar tidak dikenai biaya pada Google Cloud akun Anda untuk resource yang digunakan dalam deployment ini, hapus project yang berisi resource tersebut, atau simpan project dan hapus setiap resource.

    Menghapus project

    1. In the Google Cloud console, go to the Manage resources page.

      Go to Manage resources

    2. In the project list, select the project that you want to delete, and then click Delete.
    3. In the dialog, type the project ID, and then click Shut down to delete the project.

    Langkah berikutnya

    Kontributor

    Penulis: Eitan Eibschutz | Staff Technical Solutions Consultant

    Kontributor lainnya: