Konfigurasikan ingress Istio dengan API Gateway Kubernetes untuk Azure Kubernetes Service (AKS)

Add-on mesh layanan Istio mendukung API manajemen lalu lintas ingress milik Istio dan API Gateway Kubernetes untuk manajemen lalu lintas ingress. Anda dapat menggunakan model penyebaran otomatis API Istio Gateway atau model penyebaran manual. Artikel ini menjelaskan cara mengonfigurasi manajemen lalu lintas ingress untuk add-on jala layanan Istio menggunakan API Gateway Kubernetes dengan model penyebaran otomatis.

Anda dapat menggunakan konfigurasi ini untuk ingress tanpa menambahkan sidecar ke aplikasi Anda. Bidang kontrol Istio terkelola dan proksi gateway masih berjalan. Anda harus memulai dan menyelesaikan peningkatan kenari untuk pembaruan revisi kecil, bahkan saat menggunakan add-on hanya untuk masuk.

Batasan dan pertimbangan

  • Add-on mesh layanan Istio dan implementasi API Gateway perutean aplikasi tidak dapat diaktifkan secara bersamaan. Anda harus menonaktifkan satu terlebih dahulu dan mengaktifkan yang lain dalam operasi terpisah.
  • Menggunakan API Gateway Kubernetes untuk manajemen trafik keluar dengan add-on Istio hanya didukung pada model penyebaran manual.
  • Kustomisasi ConfigMap untuk Gateway sumber daya harus termasuk dalam daftar izin kustomisasi sumber daya. Bidang yang tidak ada dalam daftar yang diizinkan tidak diizinkan dan diblokir melalui webhook terkelola add-on. Lihat kebijakan dukungan add-on Istio untuk informasi selengkapnya tentang fitur allowed, blocked, dan supported.
  • Add-on ini memungkinkan penggunaan sumber daya EnvoyFilter, tetapi dukungan Azure tidak mencakup masalah yang disebabkan oleh konfigurasi sumber daya tersebut. Lihat batasan add-on Istio dan kebijakan dukungan.
  • Mengonfigurasi akses ingress HTTPS ke layanan HTTPS—yaitu penerusan Server Name Indication (SNI)—melalui resource TLSRoute tidak didukung pada revisi add-on service mesh Istio asm-1-29. Dukungan untuk resource TLSRoute akan tersedia untuk revisi add-on service mesh Istio asm-1-30 dan yang lebih baru.
  • Menyuntikkan sidecar yang tidak dikelola Microsoft (misalnya, telemetri kustom, pencatatan log, atau agen keamanan) ke dalam pod proksi gateway ingress Istio yang dikelola oleh add-on tidak didukung secara resmi. Jika Anda memilih untuk menyisipkan sidecar Anda sendiri ke dalam pod proksi terkelola, Microsoft hanya memberikan dukungan sebatas upaya terbaik atas masalah apa pun yang Anda alami.

Prasyarat

Atur variabel lingkungan

Atur variabel lingkungan berikut untuk digunakan di seluruh artikel ini:

Variable Description
RESOURCE_GROUP Nama grup sumber daya yang berisi kluster AKS Anda.
CLUSTER_NAME Nama kluster AKS Anda.
LOCATION Wilayah Azure tempat kluster AKS Anda dideploy.
KEY_VAULT_NAME Nama sumber daya Azure Key Vault yang akan dibuat untuk menyimpan rahasia TLS. Jika Anda memiliki sumber daya yang sudah ada, gunakan nama tersebut.

Sebarkan aplikasi sampel

  • Pertama, sebarkan aplikasi sampel httpbin di default namespace menggunakan kubectl apply perintah .

    export ISTIO_RELEASE="release-1.27"
    kubectl apply -f https://raw.githubusercontent.com/istio/istio/$ISTIO_RELEASE/samples/httpbin/httpbin.yaml
    

Membuat Gateway Kubernetes dan HTTPRoute

Contoh manifes ini membuat layanan ingress load balancer eksternal yang dapat diakses dari luar kluster. Anda dapat menambahkan anotasi untuk membuat load balancer internal dan menyesuaikan pengaturan load balancer lainnya.

  • Sebarkan konfigurasi API Gateway di namespace default dengan gatewayClassName diatur ke istio dan HTTPRoute yang merutekan lalu lintas ke layanan httpbin menggunakan manifes berikut:

    kubectl apply -f - <<EOF
    apiVersion: gateway.networking.k8s.io/v1
    kind: Gateway
    metadata:
      name: httpbin-gateway
    spec:
      gatewayClassName: istio
      listeners:
      - name: http
        port: 80
        protocol: HTTP
        allowedRoutes:
          namespaces:
            from: Same
    ---
    apiVersion: gateway.networking.k8s.io/v1
    kind: HTTPRoute
    metadata:
      name: httpbin
    spec:
      parentRefs:
      - name: httpbin-gateway
      hostnames: ["httpbin.example.com"]
      rules:
      - matches:
        - path:
            type: PathPrefix
            value: /get
        backendRefs:
        - name: httpbin
          port: 8000
    EOF
    

    Nota

    Secara default, sarana kontrol Istio akan menambahkan GatewayClass nama ke nama istio sumber daya yang disediakannya untuk Gateway. Anda dapat memberi anotasi pada sumber daya Gateway Anda dengan gateway.istio.io/name-override untuk mengganti nama sumber daya yang disediakan. Nama sumber daya harus kurang dari 63 karakter dan harus berupa nama DNS yang valid.

    Nota

    Jika Anda melakukan peningkatan revisi kecil dan memiliki dua revisi add-on jala layanan Istio yang diinstal pada kluster Anda secara bersamaan, sarana kontrol untuk revisi minor yang lebih tinggi mengambil kepemilikan Gateways secara default. Anda dapat menambahkan istio.io/rev label ke Gateway untuk mengontrol revisi sarana kontrol mana yang memilikinya. Jika Anda menambahkan label revisi, pastikan Anda memperbaruinya sesuai dengan revisi sarana kontrol yang sesuai sebelum menggulung balik atau menyelesaikan operasi peningkatan.

Memverifikasi pembuatan sumber daya

  • Verifikasi bahwa sumber daya Deployment, Service, HorizontalPodAutoscaler, dan PodDisruptionBudget telah dibuat menggunakan perintah berikut kubectl get:

    kubectl get deployment httpbin-gateway-istio
    kubectl get service httpbin-gateway-istio
    kubectl get hpa httpbin-gateway-istio
    kubectl get pdb httpbin-gateway-istio
    

    Contoh output:

    # Deployment resource
    NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
    httpbin-gateway-istio   2/2     2            2           31m
    
    # Service resource
    NAME                    TYPE           CLUSTER-IP   EXTERNAL-IP      PORT(S)                        AGE
    httpbin-gateway-istio   LoadBalancer   10.0.65.45   <external-ip>    15021:32053/TCP,80:31587/TCP   33m
    
    # HPA resource
    NAME                    REFERENCE                          TARGETS       MINPODS   MAXPODS   REPLICAS   AGE
    httpbin-gateway-istio   Deployment/httpbin-gateway-istio   cpu: 3%/80%   2         5         3          34m
    
    # PDB resource
    NAME                    MIN AVAILABLE   MAX UNAVAILABLE   ALLOWED DISRUPTIONS   AGE
    httpbin-gateway-istio   1               N/A               2                     36m
    

Mengirim permintaan ke aplikasi sampel

  1. Coba kirim curl permintaan ke httpbin aplikasi. Pertama, atur INGRESS_HOST variabel lingkungan:

    kubectl wait --for=condition=programmed gateways.gateway.networking.k8s.io httpbin-gateway
    export INGRESS_HOST=$(kubectl get gateways.gateway.networking.k8s.io httpbin-gateway -ojsonpath='{.status.addresses[0].value}')
    
  2. Coba kirim permintaan HTTP ke httpbin.

    curl -s -I -HHost:httpbin.example.com "http://$INGRESS_HOST/get"
    

    Dalam output, Anda seharusnya melihat tanggapan HTTP 200.

Mengamankan lalu lintas masuk Istio dengan API Gateway Kubernetes

Add-on jala layanan Istio mendukung sinkronisasi rahasia dari Azure Key Vault untuk mengamankan lalu lintas masuk berbasis API Gateway dengan penghentian Transport Layer Security (TLS). Di bagian berikut, Anda menyinkronkan rahasia dari Azure Key Vault ke kluster AKS menggunakan penyedia Azure Key Vault untuk add-on Driver Secrets Store Container Storage Interface (CSI) dan menghentikan TLS di gateway masuk.

Membuat sertifikat dan kunci klien/server

  1. Buat sertifikat akar dan kunci privat untuk menandatangani sertifikat untuk layanan sampel:

    mkdir httpbin_certs
    openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -subj '/O=example Inc./CN=example.com' -keyout httpbin_certs/example.com.key -out httpbin_certs/example.com.crt
    
  2. Buat sertifikat dan kunci privat untuk httpbin.example.com:

    openssl req -out httpbin_certs/httpbin.example.com.csr -newkey rsa:2048 -nodes -keyout httpbin_certs/httpbin.example.com.key -subj "/CN=httpbin.example.com/O=httpbin organization"
    openssl x509 -req -sha256 -days 365 -CA httpbin_certs/example.com.crt -CAkey httpbin_certs/example.com.key -set_serial 0 -in httpbin_certs/httpbin.example.com.csr -out httpbin_certs/httpbin.example.com.crt
    

Menyiapkan Azure Key Vault dan membuat kunci rahasia

  1. Buat instans Azure Key Vault untuk menyediakan sertifikat dan input kunci ke add-on jala layanan Istio menggunakan perintah az keyvault create. Jika Anda sudah memiliki instans Azure Key Vault, Anda dapat melewati langkah ini.

    az keyvault create --name $KEY_VAULT_NAME --resource-group $RESOURCE_GROUP --location $LOCATION
    
  2. Aktifkan penyedia Azure Key Vault untuk Secrets Store (CSI) Driver add-on pada kluster Anda menggunakan perintah az aks enable-addons.

    az aks enable-addons --addons azure-keyvault-secrets-provider --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME
    
  3. Jika key vault Anda menggunakan kontrol akses berbasis peran (RBAC) Azure untuk model izin, ikuti instruksi di Memberikan akses ke kunci, sertifikat, dan rahasia Azure Key Vault dengan kontrol akses berbasis peran Azure untuk menetapkan peran Azure Pengguna Rahasia Key Vault untuk identitas terkelola yang ditetapkan pengguna add-on. Atau, jika brankas kunci Anda menggunakan model izin kebijakan akses brankas, otorisasikan identitas terkelola yang ditetapkan pengguna dari add-on untuk mengakses sumber daya Azure Key Vault dengan kebijakan akses menggunakan perintah az keyvault set-policy.

    OBJECT_ID=$(az aks show --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME --query 'addonProfiles.azureKeyvaultSecretsProvider.identity.objectId' -o tsv | tr -d '\r')
    CLIENT_ID=$(az aks show --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME --query 'addonProfiles.azureKeyvaultSecretsProvider.identity.clientId')
    TENANT_ID=$(az keyvault show --resource-group $RESOURCE_GROUP --name $KEY_VAULT_NAME --query 'properties.tenantId')
    
    az keyvault set-policy --name $KEY_VAULT_NAME --object-id $OBJECT_ID --secret-permissions get list
    
  4. Buat rahasia di Azure Key Vault menggunakan sertifikat dan kunci menggunakan perintah az keyvault secret set berikut:

    az keyvault secret set --vault-name $KEY_VAULT_NAME --name test-httpbin-key --file httpbin_certs/httpbin.example.com.key
    az keyvault secret set --vault-name $KEY_VAULT_NAME --name test-httpbin-crt --file httpbin_certs/httpbin.example.com.crt
    

Menyebarkan SecretProviderClass dan pod sampel

  1. Sebarkan SecretProviderClass untuk menyediakan parameter khusus Azure Key Vault ke driver CSI menggunakan manifes berikut. Dalam contoh ini, test-httpbin-key dan test-httpbin-crt adalah nama objek rahasia dalam Azure Key Vault.

    cat <<EOF | kubectl apply -f -
    apiVersion: secrets-store.csi.x-k8s.io/v1
    kind: SecretProviderClass
    metadata:
      name: httpbin-credential-spc
    spec:
      provider: azure
      secretObjects:
      - secretName: httpbin-credential
        type: kubernetes.io/tls
        data:
        - objectName: test-httpbin-key
          key: tls.key
        - objectName: test-httpbin-crt
          key: tls.crt
      parameters:
        useVMManagedIdentity: "true"
        userAssignedIdentityID: $CLIENT_ID 
        keyvaultName: $KEY_VAULT_NAME
        cloudName: ""
        objects:  |
          array:
            - |
              objectName: test-httpbin-key
              objectType: secret
              objectAlias: "test-httpbin-key"
            - |
              objectName: test-httpbin-crt
              objectType: secret
              objectAlias: "test-httpbin-crt"
        tenantId: $TENANT_ID
    EOF
    

    Nota

    Atau, untuk mereferensikan jenis objek sertifikat langsung dari Azure Key Vault, gunakan manifes berikut untuk menyebarkan SecretProviderClass. Dalam contoh ini, test-httpbin-cert-pfx adalah nama objek sertifikat di Azure Key Vault.

    cat <<EOF | kubectl apply -f -
    apiVersion: secrets-store.csi.x-k8s.io/v1
    kind: SecretProviderClass
    metadata:
      name: httpbin-credential-spc
    spec:
      provider: azure
      secretObjects:
      - secretName: httpbin-credential
        type: kubernetes.io/tls
        data:
        - objectName: test-httpbin-key
          key: tls.key
        - objectName: test-httpbin-crt
          key: tls.crt
      parameters:
        useVMManagedIdentity: "true"
        userAssignedIdentityID: $CLIENT_ID 
        keyvaultName: $KEY_VAULT_NAME
        cloudName: ""
        objects:  |
          array:
            - |
              objectName: test-httpbin-cert-pfx  #certificate object name from keyvault
              objectType: secret
              objectAlias: "test-httpbin-key"
            - |
              objectName: test-httpbin-cert-pfx #certificate object name from keyvault
              objectType: cert
              objectAlias: "test-httpbin-crt"
        tenantId: $TENANT_ID
    EOF
    
  2. Sebarkan pod sampel menggunakan manifes berikut. Penyedia Azure Key Vault untuk add-on Driver Secrets Store (CSI) memerlukan pod untuk mereferensikan sumber daya SecretProviderClass untuk memastikan sinkronisasi rahasia dari Azure Key Vault ke kluster.

    cat <<EOF | kubectl apply -f -
    apiVersion: v1
    kind: Pod
    metadata:
      name: secrets-store-sync-httpbin
    spec:
      containers:
        - name: busybox
          image: mcr.microsoft.com/oss/busybox/busybox:1.33.1
          command:
            - "/bin/sleep"
            - "10"
          volumeMounts:
          - name: secrets-store01-inline
            mountPath: "/mnt/secrets-store"
            readOnly: true
      volumes:
        - name: secrets-store01-inline
          csi:
            driver: secrets-store.csi.k8s.io
            readOnly: true
            volumeAttributes:
              secretProviderClass: "httpbin-credential-spc"
    EOF
    

Memverifikasi pembuatan rahasia TLS

  • httpbin-credential Verifikasi bahwa rahasia dibuat di default namespace seperti yang didefinisikan dalam sumber daya SecretProviderClass menggunakan perintah kubectl describe secret.

    kubectl describe secret/httpbin-credential
    

    Contoh output:

    Name:         httpbin-credential
    Namespace:    default
    Labels:       secrets-store.csi.k8s.io/managed=true
    Annotations:  <none>
    
    Type:  kubernetes.io/tls
    
    Data
    ====
    tls.crt:  1180 bytes
    tls.key:  1675 bytes
    

Menyebarkan Gateway TLS

  1. Buat Gateway Kubernetes yang mereferensikan httpbin-credential rahasia di bawah konfigurasi TLS menggunakan manifes berikut:

    cat <<EOF | kubectl apply -f -
    apiVersion: gateway.networking.k8s.io/v1
    kind: Gateway
    metadata:
      name: httpbin-gateway
    spec:
      gatewayClassName: istio
      listeners:
      - name: https
        hostname: "httpbin.example.com"
        port: 443
        protocol: HTTPS
        tls:
          mode: Terminate
          certificateRefs:
          - name: httpbin-credential
        allowedRoutes:
          namespaces:
            from: Selector
            selector:
              matchLabels:
                kubernetes.io/metadata.name: default
    EOF
    

    Nota

    Dalam definisi gateway, tls.certificateRefs.name harus cocok dengan secretName di sumber daya SecretProviderClass.

  2. Buat HTTPRoute yang sesuai untuk mengonfigurasi perutean lalu lintas masuk ke layanan httpbin melalui HTTPS menggunakan manifes berikut:

    cat <<EOF | kubectl apply -f -
    apiVersion: gateway.networking.k8s.io/v1
    kind: HTTPRoute
    metadata:
      name: httpbin
    spec:
      parentRefs:
      - name: httpbin-gateway
      hostnames: ["httpbin.example.com"]
      rules:
      - matches:
        - path:
            type: PathPrefix
            value: /status
        - path:
            type: PathPrefix
            value: /delay
        backendRefs:
        - name: httpbin
          port: 8000
    EOF
    
  3. Dapatkan alamat IP eksternal dari gateway ingress dan port yang aman menggunakan perintah berikut:

    kubectl wait --for=condition=programmed gateways.gateway.networking.k8s.io httpbin-gateway
    export INGRESS_HOST=$(kubectl get gateways.gateway.networking.k8s.io httpbin-gateway -o jsonpath='{.status.addresses[0].value}')
    export SECURE_INGRESS_PORT=$(kubectl get gateways.gateway.networking.k8s.io httpbin-gateway -o jsonpath='{.spec.listeners[?(@.name=="https")].port}')
    
  4. Kirim permintaan HTTPS untuk mengakses httpbin layanan:

    curl -v -HHost:httpbin.example.com --resolve "httpbin.example.com:$SECURE_INGRESS_PORT:$INGRESS_HOST" \
    --cacert httpbin_certs/example.com.crt "https://httpbin.example.com:$SECURE_INGRESS_PORT/status/418"
    

    Output perlu menunjukkan layanan httpbin mengembalikan kode 418 I’m a Teapot.

    Nota

    Untuk mengonfigurasi akses masuk HTTPS ke layanan HTTPS, perbarui mode TLS dalam definisi gateway ke Passthrough. Konfigurasi ini menginstruksikan gateway untuk melewati lalu lintas masuk apa adanya, tanpa mengakhiri TLS.

Kustomisasi anotasi

Anda dapat menambahkan anotasi di bawah spec.infrastructure.annotations untuk mengonfigurasi pengaturan load balancer untuk Gateway. Misalnya, untuk membuat load balancer internal yang terpasang pada subnet tertentu, Anda dapat membuat dengan anotasi Gateway berikut:

spec:
  # ... existing spec content ...
  infrastructure:
    annotations: 
      service.beta.kubernetes.io/azure-load-balancer-internal: "true"
      service.beta.kubernetes.io/azure-load-balancer-internal-subnet: "my-subnet"

Kustomisasi ConfigMap

Add-on mesh layanan Istio mendukung penyesuaian atas sumber daya yang dihasilkan untuk Gateways, termasuk:

  • Pelayanan
  • Penyebaran
  • Pod Autoscaler Horizontal (HPA)
  • Anggaran Gangguan Pod (Pod Disruption Budget)

Pengaturan default untuk sumber daya ini diatur dalam istio-gateway-class-defaults ConfigMap di aks-istio-system namespace, yang disediakan oleh AKS ketika CRD API Managed Gateway diaktifkan bersamaan dengan add-on Istio. ConfigMap ini harus memiliki label yang gateway.istio.io/defaults-for-class disetel ke istio agar kustomisasi dapat diterapkan dan berfungsi untuk semua Gateways dengan spec.gatewayClassName: istio. GatewayClass-level ConfigMap diinstal secara default di aks-istio-system namespace ketika Managed Gateway API installation diaktifkan. Diperlukan waktu hingga lima menit untuk menyebarkan istio-gateway-class-defaults ConfigMap setelah menginstal Gateway Terkelola API CRD.

Nota

istio-gateway-class-defaults ConfigMap disediakan dan direkonsiliasi oleh AKS ketika Managed Gateway API CRDs dan add-on Istio diaktifkan secara bersamaan. Jika sebelumnya Anda membuat istio-gateway-class-defaults ConfigMap di aks-istio-system namespace sendiri, Anda harus menghapus instans ConfigMap buatan sendiri sebelum mengaktifkan CRD API Gateway Terkelola untuk menghindari konflik dengan sinkronisasi ConfigMap yang dikelola AKS.

kubectl get configmap istio-gateway-class-defaults -n aks-istio-system -o yaml
...
data:
  horizontalPodAutoscaler: |
    spec:
      minReplicas: 2
      maxReplicas: 5
  podDisruptionBudget: |
    spec:
      minAvailable: 1
...

Anda dapat mengubah pengaturan ini untuk semua Istio Gateways di tingkat GatewayClass dengan memperbarui istio-gateway-class-defaults ConfigMap, atau Anda dapat mengaturnya untuk individual sumber daya Gateway. Untuk level GatewayClass dan level Gateway, Anda harus menambahkan bidang ke daftar izin untuk sumber daya yang diberikan. Jika ada penyesuaian baik untuk GatewayClass atau untuk individu Gateway, konfigurasi tingkat Gateway lebih diutamakan.

Penyesuaian penyebaran memungkinkan bidang daftar

Jalur bidang Description
metadata.labels Label penyebaran
metadata.annotations Anotasi penyebaran
spec.minReadySeconds Pemeriksaan kesiapan penyebaran
spec.replicas Jumlah replika penyebaran
spec.template.metadata.labels Label pod
spec.template.metadata.annotations Anotasi pod
spec.template.spec.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms Afinitas node
spec.template.spec.affinity.nodeAffinity.preferredDuringSchedulingIgnoredDuringExecution Afinitas node
spec.template.spec.affinity.podAffinity.requiredDuringSchedulingIgnoredDuringExecution Afinitas pod
spec.template.spec.affinity.podAffinity.preferredDuringSchedulingIgnoredDuringExecution Afinitas pod
spec.template.spec.affinity.podAntiAffinity.requiredDuringSchedulingIgnoredDuringExecution Pod dengan anti-afinitas
spec.template.spec.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution Pod dengan anti-afinitas
spec.template.spec.containers.resizePolicy Pemanfaatan sumber daya kontainer
spec.template.spec.containers.resources.limits Pemanfaatan sumber daya kontainer
spec.template.spec.containers.resources.requests Pemanfaatan sumber daya kontainer
spec.template.spec.containers.stdin Penelusuran kesalahan kontainer
spec.template.spec.containers.stdinOnce Penelusuran kesalahan kontainer
spec.template.spec.nodeSelector Penjadwalan pod
spec.template.spec.nodeName Penjadwalan pod
spec.template.spec.tolerations Penjadwalan pod
spec.template.spec.topologySpreadConstraints Penjadwalan pod
spec.template.spec.terminationGracePeriodSeconds Siklus hidup Pod

Kustomisasi layanan memperbolehkan bidang daftar

Jalur bidang Description
metadata.labels Label layanan
metadata.annotations Anotasi layanan
spec.type Jenis layanan
spec.loadBalancerSourceRanges Pengaturan penyeimbang beban layanan
spec.loadBalancerClass Pengaturan penyeimbang beban layanan
spec.externalTrafficPolicy Kebijakan lalu lintas layanan
spec.internalTrafficPolicy Kebijakan lalu lintas layanan
spec.healthCheckNodePort Pengaturan probe kesehatan layanan

Nota

add-on Istio menambahkan anotasi Azure Load Balancer ke Service Gateway untuk mengonfigurasi probe kesehatan untuk pengaturan default externalTrafficPolicy, yaitu "Cluster." Jika Anda menetapkan spec.externalTrafficPolicy ke "Local," Anda harus menghapus anotasi berikut, baik di ConfigMap tingkat GatewayClass maupun di ConfigMap per-Gateway:

 service: |
    spec:
       externalTrafficPolicy: Local
    metadata:
      annotations:
        service.beta.kubernetes.io/port_80_health-probe_port:
        service.beta.kubernetes.io/port_80_health-probe_protocol:
        service.beta.kubernetes.io/port_80_health-probe_request-path:

Kustomisasi HorizontalPodAutoscaler (HPA) memungkinkan daftar bidang yang diizinkan

Jalur bidang Description
metadata.labels Label HPA
metadata.annotations Anotasi HPA
spec.behavior.scaleUp.stabilizationWindowSeconds Perilaku pengembangan skala HPA
spec.behavior.scaleUp.selectPolicy Perilaku pengembangan skala HPA
spec.behavior.scaleUp.policies Perilaku pengembangan skala HPA
spec.behavior.scaleDown.stabilizationWindowSeconds Perilaku penurunan skala HPA
spec.behavior.scaleDown.selectPolicy Perilaku penurunan skala HPA
spec.behavior.scaleDown.policies Perilaku penurunan skala HPA
spec.metrics Metrik penskalan sumber daya HPA
spec.minReplicas Jumlah replika minimum HPA. Tidak boleh di bawah 2.
spec.maxReplicas Jumlah replika maksimum HPA

Kustomisasi PodDisruptionBudget (PDB) memungkinkan bidang daftar

Jalur bidang Description
metadata.labels Label PDB
metadata.annotations Anotasi PDB
spec.minAvailable Ketersediaan minimum PDB
spec.unhealthyPodEvictionPolicy Kebijakan pengeluaran PDB

Nota

Memodifikasi PDB ketersediaan minimum dan kebijakan pengeluaran dapat menyebabkan potensi kesalahan selama operasi peningkatan dan penghapusan kluster/node. Ikuti panduan pemecahan masalah PDB untuk mengatasi kesalahan UpgradeFailed karena PDB kegagalan pengeluaran.

Mengonfigurasi pengaturan pada tingkat GatewayClass

  1. Perbarui ConfigMap tingkat GatewayClass di namespace aks-istio-system menggunakan perintah kubectl edit configmap.

    kubectl edit cm istio-gateway-class-defaults -n aks-istio-system
    
  2. Edit pengaturan sumber daya di bagian data sesuai kebutuhan. Misalnya, untuk memperbarui replika HPA min/maks dan menambahkan label ke Deployment, ubah ConfigMap sebagai berikut:

    ...
    data:
      deployment: |
        metadata:
          labels:
            test.azureservicemesh.io/deployment-config: "updated"
      horizontalPodAutoscaler: |
        spec:
          minReplicas: 3
          maxReplicas: 6
      podDisruptionBudget: |
        spec:
          minAvailable: 1
    ...
    

    Nota

    Hanya satu ConfigMap per GatewayClass yang diizinkan.

  3. Sekarang, Anda akan melihat HPA untuk httpbin-gateway yang Anda buat sebelumnya diperbarui dengan nilai min/maks baru. HPA Verifikasi pengaturan menggunakan kubectl get hpa perintah .

    kubectl get hpa httpbin-gateway-istio
    

    Contoh output:

    NAME                    REFERENCE                          TARGETS       MINPODS   MAXPODS   REPLICAS   AGE
    httpbin-gateway-istio   Deployment/httpbin-gateway-istio   cpu: 3%/80%   3         6         3          36m
    
  4. Verifikasikan Deployment sudah diperbarui dengan label baru menggunakan perintah kubectl get deployment.

    kubectl get deployment httpbin-gateway-istio -ojsonpath='{.metadata.labels.test\.azureservicemesh\.io\/deployment-config}'
    

    Contoh output:

    updated
    

Mengonfigurasi pengaturan untuk gateway tertentu

  1. Buat ConfigMap dengan kustomisasi sumber daya untuk httpbin Gateway menggunakan manifes berikut:

    kubectl apply -f - <<EOF
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: gw-options
    data:
      horizontalPodAutoscaler: |
        spec:
          minReplicas: 2
          maxReplicas: 4
      deployment: |
        metadata:
          labels:
            test.azureservicemesh.io/deployment-config: "updated-per-gateway"
    EOF
    
  2. Perbarui httpbinGateway untuk mereferensikan ConfigMap.

    spec:
      # ... existing spec content ...
      infrastructure:
        parametersRef:
          group: ""
          kind: ConfigMap
          name: gw-options
    
  3. Terapkan pembaruan menggunakan kubectl apply perintah .

    kubectl apply -f httpbin-gateway-updated.yaml
    
  4. Pastikan HPA diperbarui dengan nilai min/maks baru menggunakan perintah kubectl get hpa. Jika Anda juga mengonfigurasi ConfigMap tingkat GatewayClass, pengaturan tingkat Gateway seharusnya diutamakan.

    kubectl get hpa httpbin-gateway-istio
    

    Contoh output:

    NAME                    REFERENCE                          TARGETS       MINPODS   MAXPODS   REPLICAS   AGE
    httpbin-gateway-istio   Deployment/httpbin-gateway-istio   cpu: 3%/80%   2         4         2          4h14m
    
  5. Periksa Deployment label untuk memastikan bahwa test.azureservicemesh.io/deployment-config diperbarui ke nilai baru menggunakan perintah kubectl get deployment.

    kubectl get deployment httpbin-gateway-istio -ojsonpath='{.metadata.labels.test\.azureservicemesh\.io\/deployment-config}'
    

    Contoh output:

    updated-per-gateway
    

Aktifkan log akses untuk pod Gateway

Telemetry CRD diinstal secara otomatis dengan add-on Istio. Anda dapat menggunakan Telemetry API untuk mengonfigurasi pengelogan akses untuk Gateway pod.

Buat sumber daya di namespace aks-istio-system untuk mengaktifkan log akses untuk semua pod Gateway dalam mesh, atau di namespace tertentu untuk mengaktifkan log akses hanya untuk pod Gateway di namespace tersebut.

Contoh berikut menunjukkan Telemetry sumber daya yang memungkinkan pengelogan Gateway akses:

apiVersion: telemetry.istio.io/v1
kind: Telemetry
metadata:
  name: mesh-default
  namespace: aks-istio-system
spec:
  accessLogging:
  - providers:
    - name: envoy

Nota

Manifes di atas memungkinkan pencatatan akses di seluruh mesh, baik untuk Gateway pod maupun proksi sidecar yang diinjeksi oleh Istio. Gunakan pemilih untuk menargetkan pod tertentu. Lihat dokumentasi add-on Istio untuk detail selengkapnya tentang cara mengonfigurasi pencatatan log akses dengan Telemetry API.

Membersihkan sumber daya

Jika Anda tidak lagi memerlukan sumber daya yang dibuat dalam artikel ini, Anda dapat menghapusnya untuk menghindari dikenakan biaya apa pun.

  1. Hapus sumber daya Gateway dan HTTPRoute menggunakan perintah berikut kubectl delete :

    kubectl delete gateways.gateway.networking.k8s.io httpbin-gateway
    kubectl delete httproute httpbin
    
  2. Jika Anda membuat ConfigMap untuk mengkustomisasi sumber daya Gateway Anda, hapus menggunakan kubectl delete configmap perintah .

    kubectl delete configmap gw-options
    
  3. Jika Anda membuat SecretProviderClass dan rahasia yang akan digunakan untuk penghentian TLS, hapus sumber daya menggunakan perintah berikut kubectl delete :

    kubectl delete secret httpbin-credential
    kubectl delete pod secrets-store-sync-httpbin
    kubectl delete secretproviderclass httpbin-credential-spc