Men-deploy aplikasi Windows di Kubernetes terkelola

Last reviewed 2024-08-14 UTC

Dokumen ini menjelaskan cara 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 bagi 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.
  • Men-deploy dan memverifikasi aplikasi Windows.
  • Konfigurasikan 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:

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

Sebelum memulai

  1. Di konsol Google Cloud, pada halaman pemilih project, pilih atau buat project Google Cloud.

    Buka pemilih project

  2. Make sure that billing is enabled for your Google Cloud project.

  3. Aktifkan API Cloud Shell, and Cloud Service Mesh.

    Mengaktifkan API

  4. Di konsol Google Cloud, aktifkan Cloud Shell.

    Aktifkan Cloud Shell

Jika berjalan di lingkungan Virtual Private Cloud (VPC) bersama, Anda juga harus 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 menyimpan 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 tiga 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 project ID Google Cloud 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. Cantumkan 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 mandiri (NEG).

Saat Anda men-deploy aplikasi berbasis Windows dan Layanan Kubernetes di cluster regional, tindakan ini akan membuat NEG untuk setiap zona tempat aplikasi berjalan. Selanjutnya, panduan deployment ini akan 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 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 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 gateway Envoy yang berbeda.

  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 responsivitas 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 untuk 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 untuk 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 pemilihan rute 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 project ID 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 akan 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.

Men-deploy dua gateway Envoy replika. Pendekatan ini membantu membuat gateway fault tolerant dan menyediakan redundansi. Untuk menskalakan gateway Envoy secara otomatis berdasarkan beban, Anda dapat mengonfigurasi Horizontal Pod Autoscaler secara opsional. Jika 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 Envoy Admin bernama /stats. Fitur ini juga digunakan untuk tujuan berikut:

    • Sebagai endpoint responsivitas 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
    

Membuat resource Kubernetes Gateway

Membuat resource Kubernetes Gateway 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 Kubernetes Secrets. 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 yang berbeda.

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. Tanda tangani 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. Tanda tangani 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 berikut:

  • Impor sertifikat yang ditandatangani sendiri ke cluster GKE sebagai Kubernetes Secret.
  • Buat alamat IP statis untuk VPC internal.
  • Buat resource Kubernetes Gateway API.
  • Pastikan 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, Kubernetes Gateway tidak memiliki rute default. Gateway menampilkan error halaman tidak ditemukan (404) saat permintaan dikirim ke gateway.

  5. Konfigurasikan file YAML route default untuk Kubernetes Gateway 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 Kubernetes Gateway 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 akan 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 Ringkasan Prometheus Envoy Istio.
    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 Integrations.
    3. Klik Istio Envoy Prometheus Overview untuk melihat dasbor.

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

Pembersihan

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

Menghapus project

  1. Di konsol Google Cloud, buka halaman Manage resource.

    Buka Manage resource

  2. Pada daftar project, pilih project yang ingin Anda hapus, lalu klik Delete.
  3. Pada dialog, ketik project ID, lalu klik Shut down untuk menghapus project.

Langkah selanjutnya

Kontributor

Penulis: Eitan Eibschutz | Staff Technical Solutions Consultant

Kontributor lainnya: