All Products
Search
Document Center

Alibaba Cloud Service Mesh:Referensi CRD gerbang ASM

Last Updated:May 09, 2026

Alibaba Cloud Service Mesh (ASM) menyediakan Custom Resource Definition (CRD) dengan kind diatur ke IstioGateway dan apiVersion diatur ke istio.alibabacloud.com/v1beta1. ASM juga menyediakan controller yang sesuai. Dengan memantau perubahan pada resource CRD ini, controller tersebut menyinkronkan layanan Kubernetes, Deployment, ServiceAccount, dan resource terkait lainnya di dalam kluster. Topik ini menjelaskan contoh konfigurasi dan definisi bidang untuk CRD gerbang ASM.

Contoh konfigurasi

Prasyarat

Tambahkan kluster ke instans ASM Anda.

Penting

Buat semua gerbang ASM baru di namespace istio-system untuk memastikan gerbang tersebut dapat mengakses informasi konfigurasi yang diperlukan. Di Istio 1.6 dan versi setelahnya, men-deploy gerbang di namespace lain mencegahnya mengakses konfigurasi yang diperlukan, sehingga menyebabkan gerbang ASM gagal dimulai.

Contoh 1: Mengelola ingress gateway menggunakan API Kubernetes

  1. Masuk ke Konsol ASM. Di panel navigasi sebelah kiri, pilih Service Mesh > Mesh Management.

  2. Pada halaman Mesh Management, klik nama instans ASM. Di panel navigasi sebelah kiri, pilih ASM Gateways > Ingress Gateway.

  3. Pada halaman Ingress Gateway, klik Create from YAML.

  4. Pada halaman Create, masukkan Name untuk gerbang, pilih Namespaces sebagai istio-system, konfigurasikan YAML berikut, lalu klik Create.

    Untuk detail setiap bidang, lihat Referensi bidang CRD.

    Expand to view the YAML file

    apiVersion: istio.alibabacloud.com/v1beta1
    kind: IstioGateway
    metadata:   
      name: "myexample-customingressgateway"  
      namespace: "istio-system"
      labels:
        asm-gateway-type: ingress
    spec:
      runAsRoot: true
      dnsPolicy: ClusterFirst
      hostNetwork: false
      clusterIds:
        - "${actual cluster ID}"
        - "${actual cluster ID}"   # The ASM gateway supports deployment across multiple clusters.
      cpu: 
        targetAverageUtilization: 80
      env:
        - name: "envname1"
          value: "envvalue1"
      externalTrafficPolicy: Local
      gatewayType: ingress
      podLabels:
        key1: value1
      ports:  
      - name: status-port    
        port: 15020    
        targetPort: 15020  
      - name: http2    
        port: 80    
        targetPort: 80  
      - name: https    
        port: 443    
        targetPort: 443
      - name: tls    
        port: 15443    
        targetPort: 15443  
      replicaCount: 1  
      resources:
        limits:
          cpu: '2'
          memory: 2G
        requests:
          cpu: 200m
          memory: 256Mi
    # - name: config-volume-lua
    #  configMapName: lua-libs
    #  mountPath: /var/lib/lua
    # secretVolumes:
    # - name: myexample-customingressgateway-certs
    #   secretName: istio-myexample-customingressgateway-certs
    #   mountPath: /etc/istio/myexample-customingressgateway-certs
      serviceType: LoadBalancer  
      serviceAnnotations:    
        service.beta.kubernetes.io/alicloud-loadbalancer-address-type: internet  
      serviceLabels:
        serviceLabelKey1: "serviceLabelValue1"
      podAnnotations:
        podAnnotationsKey1: "podAnnotationsValue1"
      rollingMaxSurge: "100%"
      rollingMaxUnavailable: "25%"
      overrides:
        cluster1Id:
          replicaCount: 1 
          resources:
            limits:
              cpu: '2'
              memory: 2G
            requests:
              cpu: 200m
              memory: 256Mi
          serviceAnnotations:    
            service.beta.kubernetes.io/alicloud-loadbalancer-address-type: internet
            service.beta.kubernetes.io/alibaba-cloud-loadbalancer-spec: "slb.s1.small"
        cluster2Id:
          replicaCount: 2
          resources:
            limits:
              cpu: '4'
              memory: 4G
            requests:
              cpu: 400m
              memory: 512Mi
          serviceAnnotations:    
            service.beta.kubernetes.io/alicloud-loadbalancer-address-type: internet
            service.beta.kubernetes.io/alibaba-cloud-loadbalancer-spec: "slb.s2.small"

    Catatan

    Jika Anda ingin mengelola ingress gateway menggunakan client Kubernetes, lihat Implementasi struktur Go gerbang.

  5. Lihat informasi layanan ingress gateway.

    1. Masuk ke Konsol ACK. Di panel navigasi kiri, klik Clusters.

    2. Pada halaman Clusters, klik nama kluster Anda. Di panel navigasi kiri, klik Network > Services.

    3. Di bagian atas halaman Services, pilih istio-system dari daftar drop-down Namespace.

    4. Di daftar layanan, klik nama layanan target Anda untuk melihat informasi ingress gateway-nya.

  6. Lihat informasi pod ingress gateway.

    1. Masuk ke Konsol ACK. Di panel navigasi kiri, klik Clusters.

    2. Pada halaman Clusters, klik nama kluster Anda. Di panel navigasi kiri, klik Workloads > Pods.

    3. Di bagian atas halaman Pods, pilih istio-system dari daftar drop-down Namespace.

    4. Di daftar pod, klik nama pod target Anda untuk melihat informasi ingress gateway-nya.

Contoh 2: Mengelola egress gateway menggunakan API Kubernetes

ASM menyediakan layanan egress gateway yang menawarkan titik keluar traffic terpadu bagi aplikasi dalam mesh.

  1. Masuk ke Konsol ASM. Di panel navigasi sebelah kiri, pilih Service Mesh > Mesh Management.

  2. Pada halaman Mesh Management, klik nama instans ASM. Di panel navigasi sebelah kiri, pilih ASM Gateways > Egress Gateway.

  3. Pada halaman Egress Gateway, klik Create from YAML.

  4. Pada halaman Create, masukkan Name untuk egress gateway, pilih Namespaces sebagai istio-system, konfigurasikan YAML berikut, lalu klik Create.

    Untuk detail setiap bidang, lihat Referensi bidang CRD.

    Expand to view the YAML file

    apiVersion: istio.alibabacloud.com/v1beta1
    kind: IstioGateway
    metadata:
      name: egressgateway
      namespace: istio-system
      labels:
        asm-gateway-type: egress
    spec:
      autoCreateGatewayYaml: false
      clusterIds:
        - ${actual cluster ID}
      disableContainerPortExposed: true
      dnsPolicy: ClusterFirst
      gatewayType: egress
      hostNetwork: false
      podLabels:
        security.istio.io/tlsMode: istio
      ports:
        - name: http-0
          port: 80
          protocol: HTTP
          targetPort: 80
        - name: https-1
          port: 443
          protocol: HTTPS
          targetPort: 443
      readinessProbe: {}
      replicaCount: 1
      resources:
        limits:
          cpu: '2'
          memory: 4G
        requests:
          cpu: 200m
          memory: 256Mi
      rollingMaxSurge: 25%
      rollingMaxUnavailable: 25%
      runAsRoot: true
      serviceType: ClusterIP
  5. Lihat informasi layanan egress gateway.

    1. Masuk ke Konsol ACK. Di panel navigasi kiri, klik Clusters.

    2. Pada halaman Clusters, klik nama kluster Anda. Di panel navigasi kiri, klik Network > Services.

    3. Pada halaman Services, pilih istio-system dari daftar drop-down Namespace.

    4. Di daftar layanan, klik nama layanan target Anda untuk melihat informasi egress gateway-nya.

  6. Lihat informasi pod egress gateway.

    1. Masuk ke Konsol ACK. Di panel navigasi kiri, klik Clusters.

    2. Pada halaman Clusters, klik nama kluster Anda. Di panel navigasi kiri, klik Workloads > Pods.

    3. Pada halaman Pods, pilih istio-system dari daftar drop-down Namespace.

    4. Di daftar pod, klik nama pod target Anda untuk melihat informasi egress gateway-nya.

Referensi bidang CRD

Bidang

Deskripsi

Default

metadata.name

Nama. Nama Kubernetes Service dan Deployment yang dihasilkan adalah istio-{nilai ini}.

Tidak ada

metadata.namespace

Namespace tempat Kubernetes Service dan Deployment yang dihasilkan berada.

Penting

Untuk menjaga kompatibilitas dengan Istio 1.6 dan versi setelahnya, namespace ini harus istio-system.

istio-system

clusterIds

Tipe array. ID kluster tempat gerbang akan dideploy. Kluster-kluster ini termasuk dalam instans mesh saat ini.

Tidak ada

env

Tipe array. Variabel lingkungan untuk pod gerbang.

Tidak ada

externalTrafficPolicy

Menentukan apakah traffic eksternal harus diarahkan ke endpoint lokal node atau seluruh kluster. Nilai yang valid adalah Cluster atau Local.

Catatan

Bidang ini hanya berlaku untuk ingress gateway.

Cluster

ports

Tipe array. Daftar port dan protokol yang didefinisikan untuk pod gerbang. Contoh:

  • name: http2 port: 80 targetPort: 80 protocol: HTTP2

  • name: https port: 443 targetPort: 443 protocol: HTTPS

Catatan

Pada versi sebelum 1.9.7.107, bidang protocol tidak dinyatakan secara eksplisit. Anda harus mendeklarasikannya secara seragam sebagai TCP.

Tidak ada

gatewayType

Tipe gerbang. Nilai yang valid adalah ingress atau egress.

  • ingress: Gerbang ingress menyediakan titik masuk traffic terpadu bagi aplikasi dalam mesh.

  • egress: Gerbang egress menyediakan titik keluar traffic terpadu bagi aplikasi dalam mesh.

ingress

replicaCount

Jumlah replika.

1

configVolumes

Volume ConfigMap yang dipasang ke pod gerbang. Contoh:

- name: config-volume-lua
  configMapName: lua-libs
  mountPath: /var/lib/lua

Tidak ada

resources

Konfigurasi resource untuk pod gerbang.

  • limits:

    • cpu: '2'

    • memory: 2G

  • requests:

    • cpu: 200m

    • memory: 256Mi

secretVolumes

Volume rahasia yang dipasang ke pod gerbang. Contoh:

- name: myexample-customingressgateway-certs
  secretName: istio-myexample-customingressgateway-certs
  mountPath: /etc/istio/myexample-customingressgateway-certs

Tidak ada

serviceType

Tipe layanan untuk gerbang. Nilai yang valid adalah LoadBalancer, NodePort, atau ClusterIP. Gerbang egress biasanya diatur ke ClusterIP.

Penting

Jika kluster bidang data Anda adalah kluster terdaftar dan Anda mengatur bidang ini ke LoadBalancer, pastikan kluster tersebut mendukung layanan tipe LoadBalancer untuk menghindari kegagalan pembuatan gerbang ASM.

LoadBalancer

loadBalancerClass

Menentukan loadBalancerClass untuk layanan gerbang. Bidang ini hanya berlaku ketika serviceType diatur ke LoadBalancer. Bidang ini didukung mulai dari versi ASM 1.18. Untuk informasi lebih lanjut, lihat Gunakan Network Load Balancer (NLB) dengan gerbang ingress ASM.

Tidak ada

serviceAnnotations

Anotasi untuk layanan gerbang. Contoh: service.beta.kubernetes.io/alibaba-cloud-loadbalancer-connection-drain: 'on' service.beta.kubernetes.io/alibaba-cloud-loadbalancer-connection-drain-timeout: '20'. Untuk contoh anotasi umum, lihat Konfigurasi load balancing menggunakan anotasi.

Catatan

Bidang ini hanya berlaku untuk gerbang dengan serviceType diatur ke LoadBalancer. Gerbang egress biasanya tidak menggunakan bidang ini.

Tidak ada

serviceLabels

Label untuk layanan gerbang.

Tidak ada

podLabels

Label untuk pod gerbang.

Tidak ada

podAnnotations

Anotasi untuk pod gerbang.

Tidak ada

rollingMaxSurge

Jumlah maksimum pod yang dapat melebihi jumlah yang diinginkan selama pembaruan bergulir. Nilai ini dapat berupa angka absolut atau persentase.

"100%"

rollingMaxUnavailable

Jumlah maksimum pod yang tidak tersedia selama pembaruan bergulir. Nilai ini dapat berupa angka absolut atau persentase.

"25%"

overrides

Saat clusterIds menentukan dua atau lebih kluster, Anda dapat mendefinisikan konfigurasi spesifik kluster yang berbeda dari parameter umum di atas. Nilainya bertipe map.

Catatan
  • key: Salah satu ID kluster yang tercantum dalam clusterIds.

  • Bidang yang didukung oleh overrides mencakup hal berikut:

    • serviceAnnotations

    • podAnnotations

    • resources

    • replicaCount

    • Konfigurasi terkait HPA (didukung mulai dari ASM 1.16)

    • serviceType (didukung mulai dari ASM 1.16)

Tidak ada

kernel.enabled

Apakah parameter kernel kustom diaktifkan?

false

kernel.parameters

Pengaturan parameter kernel. Parameter kernel berikut saat ini didukung:

  • net.core.somaxconn

  • net.core.netdev_max_backlog

  • net.ipv4.tcp_rmem

  • net.ipv4.tcp_wmem

  • net.ipv4.ip_local_port_range

  • net.ipv4.tcp_fin_timeout

  • net.ipv4.tcp_tw_timeout

  • net.ipv4.tcp_tw_reuse

  • net.ipv4.tcp_tw_recycle

  • net.ipv4.tcp_timestamps

  • net.ipv4.tcp_retries2

  • net.ipv4.tcp_slow_start_after_idle

  • net.ipv4.tcp_max_orphans

  • net.ipv4.tcp_max_syn_backlog

  • net.ipv4.tcp_no_metrics_save

  • net.ipv4.tcp_autocorking

  • kernel.printk

  • vm.swappiness

Catatan

Bergantung pada versi kernel host, beberapa parameter kernel mungkin tidak didukung. Jika hal ini terjadi, pod mesh mungkin melaporkan error.

Gunakan perintah kubectl describe pod untuk memeriksa pesan error gerbang. Setelah menghapus parameter yang tidak didukung, kontainer akan berjalan normal.

Semua nilai parameter kernel harus berupa string. Karena sintaksis YAML menguraikan angka biasa sebagai tipe numerik, bungkus nilai Anda dengan tanda kutip ganda (""), misalnya: net.core.somaxconn: "65535".

Tidak ada

compression.enabled

Mengaktifkan kemampuan kompresi untuk ingress gateway.

Catatan

Bidang yang terkait dengan compression hanya berlaku untuk ingress gateway.

false

compression.content_type

Daftar ContentType yang dikompresi. Contoh:

  • text/html

  • application/json

Tidak ada

compression.disable_on_etag_header

  • Diatur ke true: Nonaktifkan kompresi saat respons berisi etag_header.

  • Diatur ke false: Kompres respons meskipun berisi etag_header.

false

compression.min_content_length

Memicu kompresi saat ContentLength lebih besar dari atau sama dengan nilai ini.

30

compression.remove_accept_encoding_header

  • Diatur ke true: Hapus header Accept-Encoding dari permintaan klien sebelum meneruskannya ke hulu.

  • Diatur ke false: Pertahankan header Accept-Encoding dalam permintaan klien sebelum meneruskannya ke hulu.

false

compression.gzip

Hanya kompresi gzip yang saat ini didukung. Untuk mengaktifkan kompresi, Anda harus menyertakan bidang ini. Bahkan jika semua parameter menggunakan nilai default, sertakan struktur kosong, misalnya: gzip: {}.

Tidak ada

compression.gzip.memory_level

Tingkat penggunaan memori untuk internal zlib. Nilai yang valid adalah 1–9. Nilai yang lebih tinggi menggunakan lebih banyak memori tetapi memberikan kecepatan kompresi lebih cepat dan rasio kompresi lebih baik.

5

compression.gzip.compression_level

Tingkat kompresi untuk zlib. Nilai yang valid:

  • COMPRESSION_LEVEL_1

  • COMPRESSION_LEVEL_2

  • COMPRESSION_LEVEL_3

  • COMPRESSION_LEVEL_4

  • COMPRESSION_LEVEL_5

  • COMPRESSION_LEVEL_6

  • COMPRESSION_LEVEL_7

  • COMPRESSION_LEVEL_8

  • COMPRESSION_LEVEL_9

  • DEFAULT_COMPRESSION

  • BEST_COMPRESSION

  • BEST_SPEED

Catatan

BEST_COMPRESSION memberikan kualitas kompresi tertinggi. BEST_SPEED memberikan kecepatan kompresi tercepat. Secara spesifik:

  • COMPRESSION_LEVEL_1 setara dengan BEST_SPEED. Ini melakukan kompresi paling cepat tetapi memiliki rasio kompresi lebih rendah.

  • COMPRESSION_LEVEL_9 setara dengan BEST_COMPRESSION. Level 7–9 memberikan rasio kompresi maksimum tetapi kecepatan lebih lambat.

  • COMPRESSION_LEVEL_6 setara dengan DEFAULT_COMPRESSION. Level 2–6 menawarkan kompresi sedang dengan keseimbangan antara kecepatan dan rasio.

DEFAULT_COMPRESSION

compression.gzip.compression_strategy

Strategi kompresi untuk zlib. Nilai yang valid:

  • DEFAULT_STRATEGY

  • FILTERED

  • FIXED

  • HUFFMAN_ONLY

  • RLE

Catatan

DEFAULT_STRATEGY 

Strategi kompresi default menggunakan perilaku default dasar dan menghasilkan hasil yang memuaskan dalam sebagian besar kasus.

FILTERED 

Memprioritaskan algoritma kompresi lapisan filter untuk skenario dengan data yang sebagian besar repetitif. Menawarkan rasio kompresi tinggi untuk teks dan data yang dihasilkan secara artifisial.

HUFFMAN_ONLY 

Hanya menggunakan pengkodean Huffman tanpa algoritma kompresi lainnya. Biasanya digunakan untuk data statis yang membutuhkan dekompresi cepat.

RLE 

Menggunakan pengkodean run-length, yang secara efisien mengompresi urutan data identik, seperti bitmap.

FIXED 

Menggunakan pohon pengkodean yang telah ditentukan untuk pengkodean Huffman alih-alih menghasilkannya secara dinamis berdasarkan data input. Memungkinkan kompresi dan dekompresi cepat tetapi umumnya menghasilkan rasio kompresi lebih rendah.

DEFAULT_STRATEGY

compression.gzip.window_bits

Ukuran jendela untuk zlib. Nilai yang valid adalah 9–15.

12

compression.gzip.chunk_size

Ukuran buffer output untuk zlib.

4096

hostNetwork

Jaringan host.

  • Diatur ke true: Pod gerbang menggunakan jaringan host.

  • Diatur ke false: Pod gerbang menggunakan jaringannya sendiri.

false

dnsPolicy

Kebijakan DNS. Untuk informasi lebih lanjut tentang dnsPolicy, lihat DNS for Services and Pods.

ClusterFirst

cpu.targetAverageUtilization

Pemanfaatan CPU target saat HPA diaktifkan. Nilai yang valid adalah 1–100. Jika pemanfaatan melebihi nilai ini, replika bertambah. Jika turun di bawahnya, replika berkurang.

Tidak ada

memory.targetAverageUtilization

Pemanfaatan memori target saat HPA diaktifkan. Nilai yang valid adalah 1–100. Jika pemanfaatan melebihi nilai ini, replika bertambah. Jika turun di bawahnya, replika berkurang.

Tidak ada

maxReplicas

Jumlah maksimum replika yang disesuaikan oleh HPA. Harus berupa bilangan bulat positif.

Tidak ada

minReplicas

Jumlah minimum replika yang disesuaikan oleh HPA. Harus berupa bilangan bulat positif dengan nilai minimum 1.

Tidak ada

nodeSelector

Menentukan node tempat pod gerbang berjalan. Definisikan pasangan kunci-nilai kustom di bawah bidang ini. Contoh:

nodeSelector:
  key1: value1

Tidak ada

affinity

Menentukan node untuk pod gerbang menggunakan afinitas node. Untuk informasi lebih lanjut, lihat Affinity and anti-affinity.

Tidak ada

tolerations

Digunakan bersama dengan taint node. Untuk informasi lebih lanjut, lihat Taints and tolerations.

Tidak ada

Bidang yang memicu restart bergulir

Mengubah bidang-bidang berikut memicu restart bergulir gerbang. Lakukan dengan hati-hati.

  • env

  • ports (memicu restart di versi ASM sebelum 1.16; tidak ada restart di 1.16 dan setelahnya)

  • configVolumes

  • resources

  • secretVolumes

  • podLabels

  • podAnnotations

  • kernel.enabled

  • kernel.parameters

  • hostNetwork

  • dnsPolicy

  • nodeSelector (tergantung pada penjadwalan)

  • affinity (tergantung pada penjadwalan)

  • tolerations (tergantung pada penjadwalan)

Implementasi struct Go Gateway

Expand to view the file example

package v1beta1

import (
    corev1 "k8s.io/api/core/v1"
    metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)

type GatewayType string
type ConfigState string

const (
    GatewayTypeIngress GatewayType = "ingress"
    GatewayTypeEgress  GatewayType = "egress"
)

// IstioGatewaySpec defines the desired state of Istio
// +k8s:openapi-gen=true
type IstioGatewaySpec struct {
    // +kubebuilder:validation:Enum=ingress;egress
    GatewayType                    GatewayType `json:"gatewayType,omitempty"`
    IstioGatewayBasicConfiguration `json:",inline"`
    ClusterIds                     []string                                  `json:"clusterIds,omitempty"`
    clusterId                      string                                    `json:"clusterId,omitempty"`
    Overrides                      map[string]IstioGatewayBasicConfiguration `json:"overrides,omitempty"`
}

type KernelParameters struct {
    NetCoreSoMaxConn             *string `json:"net.core.somaxconn,omitempty"`
    NetCoreNetdevMaxBacklog      *string `json:"net.core.netdev_max_backlog,omitempty"`
    NetIpv4TcpRMem               *string `json:"net.ipv4.tcp_rmem,omitempty"`
    NetIpv4TcpWMem               *string `json:"net.ipv4.tcp_wmem,omitempty"`
    NetIpv4IpLocalPortRange      *string `json:"net.ipv4.ip_local_port_range,omitempty"`
    NetIpv4TcpFinTimeout         *string `json:"net.ipv4.tcp_fin_timeout,omitempty"`
    NetIpv4TcpTwTimeout          *string `json:"net.ipv4.tcp_tw_timeout,omitempty"`
    NetIpv4TcpTwReuse            *string `json:"net.ipv4.tcp_tw_reuse,omitempty"`
    NetIpv4TcpTwRecycle          *string `json:"net.ipv4.tcp_tw_recycle,omitempty"`
    NetIpv4TcpTimestamps         *string `json:"net.ipv4.tcp_timestamps,omitempty"`
    NetIpv4TcpRetries2           *string `json:"net.ipv4.tcp_retries2,omitempty"`
    NetIpv4TcpSlowStartAfterIdle *string `json:"net.ipv4.tcp_slow_start_after_idle,omitempty"`
    NetIpv4TcpMaxOrphans         *string `json:"net.ipv4.tcp_max_orphans,omitempty"`
    NetIpv4TcpMaxSynBacklog      *string `json:"net.ipv4.tcp_max_syn_backlog,omitempty"`
    NetIpv4TcpNoMetricsSave      *string `json:"net.ipv4.tcp_no_metrics_save,omitempty"`
    NetIpv4TcpAutocorking        *string `json:"net.ipv4.tcp_autocorking,omitempty"`
    KernelPrintk                 *string `json:"kernel.printk,omitempty"`
    VmSwappiness                 *string `json:"vm.swappiness,omitempty"`
}

type KernelConfiguration struct {
    Enabled    *bool            `json:"enabled,omitempty"`
    Parameters KernelParameters `json:"parameters,omitempty"`
}

type GzipCompressorConfiguration struct {
    MemoryLevel         *uint32 `json:"memory_level,omitempty"`
    CompressionLevel    *string `json:"compression_level,omitempty"`
    CompressionStrategy *string `json:"compression_strategy,omitempty"`
    WindowBits          *uint32 `json:"window_bits,omitempty"`
    ChunkSize           *uint32 `json:"chunk_size,omitempty"`
}

type CompressorConfiguration struct {
    Enabled                    *bool                        `json:"enabled,omitempty"`
    MinContentLength           *uint32                      `json:"min_content_length,omitempty"`
    ContentType                *[]string                    `json:"content_type,omitempty"`
    DisableOnETagHeader        *bool                        `json:"disable_on_etag_header,omitempty"`
    RemoveAcceptEncodingHeader *bool                        `json:"remove_accept_encoding_header,omitempty"`
    Gzip                       *GzipCompressorConfiguration `json:"gzip,omitempty"`
}

type ReadinessProbeConfiguration struct {
    FailureThreshold int32 `json:"failureThreshold,omitempty"`
    PeriodSeconds    int32 `json:"periodSeconds,omitempty"`
    SuccessThreshold int32 `json:"successThreshold,omitempty"`
}

// +k8s:openapi-gen=true
type IstioGatewayBasicConfiguration struct {
    ReplicaCount     int32 `json:"replicaCount,omitempty"`
    AutoscaleEnabled bool  `json:"autoscaleEnabled,omitempty"`
    MinReplicas      int32 `json:"minReplicas,omitempty"`
    MaxReplicas      int32 `json:"maxReplicas,omitempty"`
    // +kubebuilder:validation:Enum=ClusterIP;NodePort;LoadBalancer
    ServiceType           corev1.ServiceType           `json:"serviceType,omitempty"`
    LoadBalancerIP        string                       `json:"loadBalancerIP,omitempty"`
    ExternalTrafficPolicy string                       `json:"externalTrafficPolicy,omitempty"`
    ServiceAnnotations    map[string]string            `json:"serviceAnnotations,omitempty"`
    PodAnnotations        map[string]string            `json:"podAnnotations,omitempty"`
    ServiceLabels         map[string]string            `json:"serviceLabels,omitempty"`
    PodLabels             map[string]string            `json:"podLabels,omitempty"`
    Resources             *corev1.ResourceRequirements `json:"resources,omitempty"`
    EnvVars               []corev1.EnvVar              `json:"env,omitempty"`
    Ports                 []corev1.ServicePort         `json:"ports,omitempty"`
    MeshExpansionPorts    []corev1.ServicePort         `json:"meshExpansionPorts,omitempty"`
    NodeSelector          map[string]string            `json:"nodeSelector,omitempty"`
    ApplicationPorts      string                       `json:"applicationPorts,omitempty"`
    RequestedNetworkView  string                       `json:"requestedNetworkView,omitempty"`
    Affinity              *corev1.Affinity             `json:"affinity,omitempty"`
    Tolerations           []corev1.Toleration          `json:"tolerations,omitempty"`
    SecretVolumes         []SecretVolume               `json:"secretVolumes,omitempty"`
    ConfigVolumes         []ConfigVolume               `json:"configVolumes,omitempty"`
    RollingMaxSurge       *string                      `json:"rollingMaxSurge,omitempty"`
    RollingMaxUnavailable *string                      `json:"rollingMaxUnavailable,omitempty"`
    CPU                   HpaCPU                       `json:"cpu,omitempty"`
    Memory                HpaMemory                    `json:"memory,omitempty"`
    Kernel                KernelConfiguration          `json:"kernel,omitempty"`
    Compressor            CompressorConfiguration      `json:"compression,omitempty"`
    RunAsRoot             *bool                        `json:"runAsRoot,omitempty"`
    Lifecycle             *corev1.Lifecycle            `json:"lifecycle,omitempty"`
    ReadinessProbe        ReadinessProbeConfiguration  `json:"readinessProbe,omitempty"`
    HostNetwork           *bool                        `json:"hostNetwork,omitempty"`
    DnsPolicy             corev1.DNSPolicy             `json:"dnsPolicy,omitempty"`
    AutoCreateGatewayYaml *bool                        `json:"autoCreateGatewayYaml,omitempty"`
}

type SecretVolume struct {
    Name       string `json:"name,omitempty"`
    SecretName string `json:"secretName,omitempty"`
    MountPath  string `json:"mountPath,omitempty"`
}

type ConfigVolume struct {
    Name          string `json:"name,omitempty"`
    ConfigMapName string `json:"configMapName,omitempty"`
    MountPath     string `json:"mountPath,omitempty"`
}

// +k8s:openapi-gen=true
type HpaCPU struct {
    TargetAverageUtilization *int32 `json:"targetAverageUtilization,omitempty"`
}

// +k8s:openapi-gen=true
type HpaMemory struct {
    TargetAverageUtilization *int32 `json:"targetAverageUtilization,omitempty"`
}

// +k8s:openapi-gen=true
type IstioGatewayStatus struct {
    // INSERT ADDITIONAL STATUS FIELD - define observed state of cluster
    // Important: Run "operator-sdk generate k8s" to regenerate code after modifying this file
    // Add custom validation using kubebuilder tags: https://book.kubebuilder.io/beyond_basics/generating_crd.html
    Status                     ConfigState      `json:"Status,omitempty"`
    GatewayAddress             []string         `json:"GatewayAddress,omitempty"`
    ClusterIdGatewayAddressMap []GatewayAddress `json:"ClusterIdGatewayAddressMap,omitempty"`

    ErrorMessage string `json:"ErrorMessage,omitempty"`
}

// +k8s:openapi-gen=true
type GatewayAddress struct {
    IPAddress string `json:"ipAddress,omitempty"`
    ClusterId string `json:"clusterId,omitempty"`
}

// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object

// IstioGateway is the Schema for the istiogateways API
// +k8s:openapi-gen=true
// +kubebuilder:subresource:status
type IstioGateway struct {
    metav1.TypeMeta   `json:",inline"`
    metav1.ObjectMeta `json:"metadata,omitempty"`

    Spec   IstioGatewaySpec   `json:"spec,omitempty"`
    Status IstioGatewayStatus `json:"status,omitempty"`
}

// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object

// IstioGatewayList contains a list of IstioGateway
type IstioGatewayList struct {
    metav1.TypeMeta `json:",inline"`
    metav1.ListMeta `json:"metadata,omitempty"`
    Items           []IstioGateway `json:"items"`
}