Todos os produtos
Search
Central de documentação

Alibaba Cloud Service Mesh:Campos de CRD para um gateway do ASM

Última atualização: Sep 12, 2026

O Service Mesh (ASM) fornece um recurso de API CustomResourceDefinition (CRD) cujo kind é IstioGateway e a apiVersion é istio.alibabacloud.com/v1beta1. O ASM também disponibiliza um controlador que monitora alterações no CRD e atualiza o service, o Deployment e a ServiceAccount do cluster Kubernetes em execução.

Exemplos de configuração

Pré-requisitos

Adicione um cluster do Container Service for Kubernetes (ACK) à sua instância do ASM. Para mais informações, consulte Add a cluster to an ASM instance.

Importante

Implante os gateways do ASM no namespace istio-system. Assim, o gateway lê suas configurações durante a inicialização. No Istio 1.6 e versões posteriores, um gateway do ASM implantado em qualquer outro namespace falha ao iniciar porque não consegue ler suas configurações.

Exemplo 1: Crie e gerencie um gateway de entrada com a API do Kubernetes

  1. Faça login no console do ASM. No painel de navegação à esquerda, escolha Service Mesh > Mesh Management.

  2. Na página Mesh Management, clique em o nome da instância do ASM. No painel de navegação à esquerda, escolha ASM Gateways > Ingress Gateway.

  3. Na página Ingress Gateway, clique em Create from YAML.

  4. Na página Create, insira um nome para o gateway de entrada no campo Name, selecione istio-system na lista suspensa Namespace, configure os campos a seguir no arquivo YAML e clique em Create.

    Para mais informações sobre os campos de CRD, consulte CRD fields.

    Expandir para visualizar o arquivo YAML

    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 can be deployed in 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"
    Nota

    Caso precise usar o Go Client for Kubernetes para gerenciar o gateway de entrada, consulte Go structs for an ASM gateway.

  5. Visualize as informações de service do gateway de entrada:

    1. Faça login no console do ACK. No painel de navegação à esquerda, clique em Clusters.

    2. Na página Clusters, clique em o nome do seu cluster. No painel de navegação à esquerda, clique em Network > Services.

    3. Na parte superior da página Services, selecione istio-system na lista suspensa Namespace.

    4. Na lista de serviços, clique em o nome do service do gateway de entrada desejado para visualizar suas informações.

  6. Verifique as informações de pod do gateway de entrada.

    1. Faça login no console do ACK. No painel de navegação à esquerda, clique em Clusters.

    2. Na página Clusters, clique em o nome do seu cluster. No painel de navegação à esquerda, clique em Workloads > Pods.

    3. Na parte superior da página Pods, selecione istio-system na lista suspensa Namespace.

    4. Localize um pod do gateway de entrada na lista de pods e clique em o nome do pod para visualizar suas informações.

Exemplo 2: Crie e gerencie um gateway de saída com a API do Kubernetes

O ASM oferece o service de gateway de saída para rotear todo o tráfego de saída da malha.

  1. Faça login no console do ASM. No painel de navegação à esquerda, escolha Service Mesh > Mesh Management.

  2. Na página Mesh Management, clique em o nome da instância do ASM. No painel de navegação à esquerda, escolha ASM Gateways > Egress Gateway.

  3. Na página Egress Gateway, clique em Create from YAML.

  4. Na página Create, insira um nome para o gateway de saída no campo Name, selecione istio-system na lista suspensa Namespace, configure os campos a seguir no arquivo YAML e clique em Create.

    Para mais informações sobre os campos de CRD, consulte CRD fields.

    Expandir para visualizar o arquivo YAML

    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. Visualize as informações de service do gateway de saída:

    1. Faça login no console do ACK. No painel de navegação à esquerda, clique em Clusters.

    2. Na página Clusters, clique em o nome do seu cluster. No painel de navegação à esquerda, clique em Network > Services.

    3. Na parte superior da página Services, selecione istio-system na lista suspensa Namespace.

    4. Na lista de serviços, clique em o nome do service do gateway de saída desejado para visualizar suas informações.

  6. Verifique as informações de pod do gateway de saída.

    1. Faça login no console do ACK. No painel de navegação à esquerda, clique em Clusters.

    2. Na página Clusters, clique em o nome do seu cluster. No painel de navegação à esquerda, clique em Workloads > Pods.

    3. Na parte superior da página Pods, selecione istio-system na lista suspensa Namespace.

    4. Localize um pod do gateway de saída na lista de pods e clique em o nome do pod para visualizar suas informações.

Campos de CRD

Campo

Descrição

Valor padrão

metadata.name

Nome do gateway do ASM. Tanto o service quanto o Deployment gerados no Kubernetes recebem o nome istio-{Valor do campo metadata.name}.

Nenhum

metadata.namespace

Namespace onde o gateway do ASM será implantado. O service e o Deployment gerados no Kubernetes residem neste namespace.

Importante

Para garantir que o service e o deployment gerados no Kubernetes funcionem no Istio 1.6 e versões posteriores, o namespace deve ser istio-system.

istio-system

clusterIds

IDs dos clusters onde você deseja implantar o gateway do ASM. O valor é um array. Os clusters devem estar gerenciados na instância atual do ASM.

Nenhum

env

Variáveis de ambiente do pod do gateway do ASM. O valor é um array.

Nenhum

externalTrafficPolicy

Define se o gateway roteia tráfego externo para endpoints locais ao nó ou para todo o cluster. Valores válidos: Cluster ou Local.

Nota

Este campo está disponível apenas para gateways de entrada.

Cluster

ports

Portas e protocolos definidos para o pod do gateway do ASM. O valor é um array. Por exemplo,

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

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

Nota

Em versões anteriores à 1.9.7.107, o campo protocol deve ser definido como TCP.

Nenhum

gatewayType

Tipo do gateway do ASM. Valores válidos: ingress e egress.

  • ingress: indica um gateway de entrada que roteia todo o tráfego de entrada da malha.

  • egress: indica um gateway de saída que roteia todo o tráfego de saída da malha.

ingress

replicaCount

Número de réplicas de pod.

1

configVolumes

Informações sobre o volume de ConfigMap montado no pod do gateway do ASM. Exemplo:

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

Nenhum

resources

Configurações de recursos do pod do gateway do ASM.

  • limits:

    • cpu: '2'

    • memory: 2G

  • requests:

    • cpu: 200m

    • memory: 256Mi

secretVolumes

Informações sobre o volume de segredo montado no pod do gateway do ASM. Exemplo:

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

Nenhum

serviceType

Tipo de service do gateway do ASM. Valores válidos: LoadBalancer, NodePort e ClusterIP. Para gateways de saída, o valor deste campo geralmente é definido como ClusterIP.

Importante

Se você utilizar um cluster registrado no plano de dados e este campo estiver definido como LoadBalancer, certifique-se de que o cluster suporte Services do tipo LoadBalancer. Caso contrário, a criação dos gateways do ASM pode falhar.

LoadBalancer

loadBalancerClass

Classe do balanceador de carga do gateway do ASM. Este campo é válido apenas quando o parâmetro serviceType está definido como LoadBalancer. Instâncias do ASM v1.18 ou posterior suportam este campo. Para mais informações, consulte Associate an NLB instance with an ingress gateway.

Nenhum

serviceAnnotations

Anotações do gateway do ASM. Exemplo: service.beta.kubernetes.io/alibaba-cloud-loadbalancer-connection-drain: 'on' service.beta.kubernetes.io/alibaba-cloud-loadbalancer-connection-drain-timeout: '20'. Para mais informações sobre anotações comuns, consulte Add annotations to the YAML file of a Service to configure CLB instances.

Nota

Este campo está disponível apenas para gateways cujo serviceType é LoadBalancer. Em gateways de saída, geralmente não se configura este campo.

Nenhum

serviceLabels

Rótulos do gateway do ASM.

Nenhum

podLabels

Rótulos do pod do gateway do ASM.

Nenhum

podAnnotations

Anotações do pod do gateway do ASM.

Nenhum

rollingMaxSurge

Número máximo de pods agendados acima do número esperado de réplicas durante uma atualização contínua. O valor pode ser absoluto ou percentual.

"100%"

rollingMaxUnavailable

Quantidade máxima de pods que podem ficar indisponíveis durante uma atualização contínua. O valor pode ser absoluto ou percentual.

"25%"

overrides

Permite configurar definições distintas para clusters específicos. Este campo fica disponível quando o campo clusterIds especifica dois ou mais clusters. O valor é do tipo MAP, contendo pares chave-valor.

Nota
  • key: ID de um cluster especificado no campo clusterIds.

  • A lista a seguir descreve alguns parâmetros configuráveis sob o campo overrides:

    • serviceAnnotations

    • podAnnotations

    • resources

    • replicaCount

    • Configurações relacionadas ao Horizontal Pod Autoscaling (HPA) (suportado em instância do ASM versão 1,16 ou posterior)

    • serviceType (suportado em instância do ASM versão 1,16 ou posterior)

Nenhum

kernel.enabled

Define se os campos personalizados de kernel devem ser ativados.

false

kernel.parameters

Campos de kernel. Os seguintes campos são suportados:

  • 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

Nota

Alguns campos de kernel suportados pelo ASM podem tornar-se inválidos devido à versão do kernel de um host. Se isso ocorrer, o pod do gateway do ASM poderá reportar erros.

Execute o comando kubectl describe pod para visualizar os erros reportados pelo pod do gateway do ASM. Após excluir os campos inválidos, os containers poderão iniciar conforme o esperado.

Os valores de todos os campos de kernel devem estar no formato string. O YAML interpreta números como valores numéricos. Portanto, coloque cada valor entre aspas duplas ("). Exemplo: net.core.somaxconn: "65535".

Nenhum

compression.enabled

Define se o recurso de compressão deve ser ativado para um gateway de entrada.

Nota

Os campos relacionados à compression estão disponíveis apenas para gateways de entrada.

false

compression.content_type

Tipos de dados a serem compactados, indicados pelo cabeçalho Content-Type. Exemplos:

  • text/html

  • application/json

Nenhum

compression.disable_on_etag_header

  • Define se o recurso de compressão deve ser desativado quando uma resposta HTTP incluir o cabeçalho ETag. Se o campo estiver definido como true, a compressão será desativada sempre que o cabeçalho ETag estiver presente na resposta HTTP.

  • Se o campo estiver definido como false, a compressão permanecerá ativa mesmo com o cabeçalho ETag na resposta HTTP.

false

compression.min_content_length

Limiar que aciona a compressão. O valor do campo representa o tamanho do cabeçalho Content-Length.

30

compression.remove_accept_encoding_header

  • Define se o cabeçalho Accept-Encoding deve ser removido de uma requisição HTTP enviada por um cliente antes de o gateway de entrada encaminhá-la a um servidor upstream. Se o campo estiver definido como true, o cabeçalho Accept-Encoding será removido da requisição HTTP.

  • Se o campo estiver definido como false, o cabeçalho Accept-Encoding será mantido na requisição HTTP.

false

compression.gzip

Formato de compressão. Apenas o formato GZIP é suportado. Este campo é obrigatório para ativar o recurso de compressão. Se todos os outros campos usarem os valores padrão, deixe este campo vazio. Exemplo: gzip: {}.

Nenhum

compression.gzip.memory_level

Nível de uso de memória da biblioteca zlib. Valores válidos: 1 a 9. Um valor maior resulta em maior consumo de memória, porém oferece velocidade e qualidade de compressão superiores.

5

compression.gzip.compression_level

Nível de compressão utilizado pela biblioteca zlib. Valores válidos:

  • 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

Nota

BEST_COMPRESSION indica a maior qualidade de compressão. BEST_SPEED indica a maior velocidade de compressão. A lista a seguir descreve alguns níveis de compressão:

  • COMPRESSION_LEVEL_1 equivale a BEST_SPEED, oferecendo a compressão mais rápida, mas com baixa taxa de compressão.

  • COMPRESSION_LEVEL_9 equivale a BEST_COMPRESSION. Os níveis de 7 a 9 oferecem a maior taxa de compressão, porém com velocidade reduzida.

  • COMPRESSION_LEVEL_6 equivale a DEFAULT_COMPRESSION. Os níveis de 2 a 6 são intermediários, equilibrando taxa de compressão e velocidade.

DEFAULT_COMPRESSION

compression.gzip.compression_strategy

Política de compressão utilizada pela biblioteca zlib. Valores válidos:

  • DEFAULT_STRATEGY

  • FILTERED

  • FIXED

  • HUFFMAN_ONLY

  • RLE

Nota

DEFAULT_STRATEGY

Esta é a política de compressão padrão. Ela utiliza o comportamento subjacente padrão e produz resultados satisfatórios na maioria dos casos.

FILTERED

Esta política prioriza o algoritmo de compressão por filtragem, aplicável à maioria dos cenários com dados duplicados. Ajuda a obter uma taxa de compressão maior para dados textuais e gerados artificialmente.

HUFFMAN_ONLY

Utiliza exclusivamente a codificação Huffman para compressão, sem outros algoritmos. Geralmente usada para comprimir dados estáticos, permitindo descompressão mais rápida.

RLE

O algoritmo Run Length Encoding (RLE) é altamente eficaz na compressão de sequências de dados repetitivos, como dados de bitmap.

FIXED

Utiliza uma árvore de codificação predefinida para realizar a codificação Huffman, em vez de árvores geradas dinamicamente com base nos dados específicos. Isso permite compressão e descompressão em alta velocidade, embora a taxa de compressão seja menor.

DEFAULT_STRATEGY

compression.gzip.window_bits

Tamanho da janela da biblioteca zlib. Valores válidos: 9 a 15.

12

compression.gzip.chunk_size

Tamanho do buffer de saída da biblioteca zlib.

4096

hostNetwork

Define se o pod do gateway do ASM pode acessar o namespace de rede do host. Valores válidos:

  • true: O pod do gateway do ASM tem permissão para usar o namespace de rede do host.

  • false: O pod do gateway do ASM não tem permissão para usar o namespace de rede do host.

false

dnsPolicy

Política de Domain Name System (DNS) configurada para o pod do gateway do ASM. Para mais informações sobre políticas de DNS, consulte DNS for Services and Pods.

ClusterFirst

cpu.targetAverageUtilization

Utilização esperada de CPU quando o HPA está ativado. Valores válidos: 1 a 100. Se o uso de CPU exceder esse valor, o número de réplicas de pod aumenta. Se for inferior, o número de réplicas diminui.

Nenhum

memory.targetAverageUtilization

Uso esperado de memória quando o HPA está ativado. Valores válidos: 1 a 100. Se o uso de memória exceder esse valor, o número de réplicas de pod aumenta. Se for inferior, o número de réplicas diminui.

Nenhum

maxReplicas

Número máximo de réplicas de pod que o recurso HPA pode dimensionar para o gateway do ASM. O valor deste campo deve ser um número inteiro positivo.

Nenhum

minReplicas

Número mínimo de réplicas de pod que o recurso HPA pode dimensionar para o gateway do ASM. O valor é um número inteiro positivo. O valor mínimo é 1.

Nenhum

nodeSelector

Especifica o rótulo do nó onde o pod do gateway do ASM reside. Você pode personalizar a chave e o valor. Exemplo:

nodeSelector:
  key1: value1

Nenhum

affinity

Configura a afinidade de nó para agendar o pod do gateway do ASM em um nó específico. Para mais informações, consulte Affinity and anti-affinity.

Nenhum

tolerations

Configura tolerâncias para que o pod do gateway do ASM possa tolerar taints de nó. Para mais informações, consulte Taints and Tolerations.

Nenhum

Campos cuja alteração causa reinicialização contínua do gateway do ASM

Alterar os campos a seguir causará uma reinicialização contínua (rolling restart) do gateway do ASM. Tenha cautela ao modificar esses campos.

  • env

  • ports (Se a versão da instância do ASM for anterior à 1,16, alterar este campo causará a reinicialização contínua do gateway do ASM. Se a versão for 1,16 ou posterior, a alteração não provocará reinicialização contínua.)

  • configVolumes

  • resources

  • secretVolumes

  • podLabels

  • podAnnotations

  • kernel.enabled

  • kernel.parameters

  • hostNetwork

  • dnsPolicy

  • nodeSelector (sujeito a agendamento)

  • affinity (sujeito a agendamento)

  • tolerations (sujeito a agendamento)

Structs Go para um gateway

Expandir para visualizar o arquivo de exemplo

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"`
}