Todos os produtos
Search
Central de documentação

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

Última atualização: Jul 04, 2026

O Service Mesh (ASM) utiliza uma CustomResourceDefinition (CRD) chamada IstioGateway (apiVersion: istio.alibabacloud.com/v1beta1) para gerenciar gateways de forma declarativa. Um controlador integrado monitora alterações nessa CRD e reconcilia os recursos Service, Deployment e ServiceAccount correspondentes no cluster Kubernetes em que está em execução.

Este tópico fornece a referência de campos da CRD, exemplos de configuração e definições de structs Go para gateways ASM.

Pré-requisitos

Adicione um cluster Container Service for Kubernetes (ACK) à sua instância ASM. Para mais informações, consulte Adicionar um cluster a uma instância ASM.

Importante

Implante os gateways ASM no namespace istio-system. O gateway lê sua configuração desse namespace durante a inicialização. Se a versão do Istio for 1.6 ou posterior e você implantar o gateway em um namespace diferente, a inicialização falhará devido à impossibilidade de recuperar a configuração necessária.

Exemplos de configuração

Gateway de entrada mínimo

O YAML abaixo cria um gateway de entrada básico com limites de recursos padrão:

apiVersion: istio.alibabacloud.com/v1beta1
kind: IstioGateway
metadata:
  name: my-ingressgateway
  namespace: istio-system
spec:
  gatewayType: ingress
  clusterIds:
    - <your-cluster-id>
  ports:
    - name: http2
      port: 80
      targetPort: 80
    - name: https
      port: 443
      targetPort: 443
  replicaCount: 1
  serviceType: LoadBalancer
  serviceAnnotations:
    service.beta.kubernetes.io/alicloud-loadbalancer-address-type: internet

Substitua <your-cluster-id> pelo ID real de um cluster gerenciado pela sua instância ASM.

Gateway de entrada completo

Este exemplo inclui campos opcionais como variáveis de ambiente, rótulos de pod, limites de recursos, configurações de atualização contínua e substituições por cluster:

Mostrar o arquivo YAML

apiVersion: istio.alibabacloud.com/v1beta1
kind: IstioGateway
metadata:
  name: myexample-customingressgateway
  namespace: istio-system
spec:
  clusterIds:
    - <cluster-id-1>
    - <cluster-id-2>    # Deploy the gateway 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: 0
    - name: tls
      port: 15443
      targetPort: 15443
  replicaCount: 1
  resources:
    limits:
      cpu: '2'
      memory: 2G
    requests:
      cpu: 200m
      memory: 256Mi
  # configVolumes:
  # - 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:
    <cluster-id-1>:
      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
    <cluster-id-2>:
      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
Para gerenciar o gateway de entrada programaticamente com um cliente Go, consulte Structs Go para um gateway ASM .

Gateway de saída

Um gateway de saída roteia todo o tráfego de saída na malha. Geralmente, define-se o campo serviceType como ClusterIP, pois não é necessário um balanceador de carga externo.

Mostrar o arquivo YAML

apiVersion: istio.alibabacloud.com/v1beta1
kind: IstioGateway
metadata:
  name: egressgateway
  namespace: istio-system
spec:
  autoCreateGatewayYaml: false
  clusterIds:
    - <your-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

Criar um gateway pelo console

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

  2. Na página Mesh Management, clique em nome da instância ASM.

  3. No painel de navegação à esquerda, escolha ASM Gateways > Ingress Gateway (ou Egress Gateway).

  4. Clique em Create from YAML.

  5. Na página Create, insira um nome no campo Name, selecione istio-system na lista suspensa Namespace, cole a configuração YAML e clique em Create.

Verificar o gateway

Após criar o gateway, verifique se o Service e os pods estão em execução.

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

  2. Clique em nome do cluster. No painel à esquerda, escolha Network > Services.

  3. Selecione istio-system na lista suspensa Namespace e confirme a existência do Service do gateway.

  4. No painel à esquerda, escolha Workloads > Pods. Selecione istio-system na lista suspensa Namespace e confirme se os pods do gateway estão em execução.

Referência de campos da CRD

Campos principais

CampoTipoDescriçãoPadrão
metadata.namestringNome do gateway ASM. Os recursos Service e Deployment gerados no Kubernetes recebem ambos o nome istio-{metadata.name}.Nenhum
metadata.namespacestringNamespace do gateway ASM. O Service e o Deployment gerados residem neste namespace.
Importante

Deve ser istio-system para Istio 1.6 e versões posteriores.

istio-system
gatewayTypestringTipo de gateway. Valores válidos: ingress (roteia tráfego de entrada) e egress (roteia tráfego de saída).ingress
clusterIdsstring[]IDs dos clusters onde o gateway será implantado. Cada cluster deve ser gerenciado pela instância ASM atual.Nenhum

Configuração do Service

CampoTipoDescriçãoPadrão
serviceTypestringTipo do Service Kubernetes. Valores válidos: LoadBalancer, NodePort, ClusterIP. Para gateways de saída, geralmente define-se como ClusterIP.
Importante

Se você usar um cluster registrado e definir este campo como LoadBalancer, o cluster deverá suportar Services do tipo LoadBalancer.

LoadBalancer
loadBalancerClassstringA classe loadBalancerClass do Service. Válido apenas quando serviceType é LoadBalancer. Requer ASM v1.18 ou posterior. Para mais informações, consulte Associar uma instância NLB a um gateway de entrada.Nenhum
externalTrafficPolicystringDetermina se o tráfego de entrada é roteado para endpoints locais do nó ou para todo o cluster. Valores válidos: Cluster, Local. Aplica-se apenas a gateways de entrada.Cluster
serviceAnnotationsmap[string]stringAnotações no Service do gateway. Aplica-se apenas a gateways com serviceType definido como LoadBalancer. Geralmente não é configurado para gateways de saída. Para anotações comuns, consulte Usar anotações para configurar balanceamento de carga.Nenhum
serviceLabelsmap[string]stringRótulos no Service do gateway.Nenhum
portsServicePort[]Portas de serviço expostas pelo gateway. Cada entrada inclui name, port, targetPort e, opcionalmente, protocol.
Nota

Em versões anteriores a 1.9.7.107, defina protocol como TCP.

Nenhum

Configuração do Pod

Campo

Tipo

Descrição

Padrão

replicaCount

int32

Número de réplicas de pods.

1

resources

ResourceRequirements

Solicitações e limites de recursos de CPU e memória.

limits: cpu 2, memory 2G; requests: cpu 200m, memory 256Mi

env

EnvVar[]

Variáveis de ambiente injetadas no contêiner do gateway.

Nenhum

podLabels

map[string]string

Rótulos no pod do gateway.

Nenhum

podAnnotations

map[string]string

Anotações no pod do gateway.

Nenhum

nodeSelector

map[string]string

Rótulos de nó usados para agendar o pod do gateway em nós específicos.

Nenhum

affinity

Affinity

Regras de afinidade de nó para agendamento do pod do gateway. Para mais informações, consulte Afinidade e anti-afinidade.

Nenhum

tolerations

Toleration[]

Tolerâncias que permitem agendar o pod do gateway em nós com taints correspondentes. Para mais informações, consulte Taints e Tolerations.

Nenhum

hostNetwork

bool

Indica se o pod do gateway compartilha o namespace de rede do host.

false

dnsPolicy

string

Política de DNS para o pod do gateway. Para mais informações, consulte DNS para Services e Pods.

ClusterFirst

runAsRoot

bool

Indica se o contêiner do gateway executa como root.

false

readinessProbe

ReadinessProbeConfiguration

Configurações de sonda de prontidão para o pod do gateway.

Nenhum

Configuração do Deployment

Campo

Tipo

Descrição

Padrão

rollingMaxSurge

string

Número máximo de pods que podem exceder a contagem desejada de réplicas durante uma atualização contínua. Aceita um valor absoluto ou uma porcentagem.

"100%"

rollingMaxUnavailable

string

Quantidade máxima de pods que podem ficar indisponíveis durante uma atualização contínua. Aceita um valor absoluto ou uma porcentagem.

"25%"

Montagens de volume

Campo

Tipo

Descrição

Padrão

configVolumes

ConfigVolume[]

Volumes de ConfigMap montados no pod do gateway. Cada entrada inclui name, configMapName e mountPath.

Nenhum

secretVolumes

SecretVolume[]

Volumes de Secret montados no pod do gateway. Cada entrada inclui name, secretName e mountPath.

Nenhum

Exemplo de volume de ConfigMap:

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

Exemplo de volume de Secret:

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

Horizontal Pod Autoscaling (HPA)

Campo

Tipo

Descrição

Padrão

cpu.targetAverageUtilization

int32

Utilização alvo de CPU (1--100). Quando a utilização excede esse limiar, o HPA escala para cima. Quando cai abaixo, o HPA escala para baixo.

Nenhum

memory.targetAverageUtilization

int32

Utilização alvo de memória (1--100). Segue o mesmo comportamento de dimensionamento da CPU.

Nenhum

maxReplicas

int32

Número máximo de réplicas para as quais o HPA pode escalar. Deve ser um número inteiro positivo.

Nenhum

minReplicas

int32

Número mínimo de réplicas para as quais o HPA pode escalar. Deve ser um número inteiro positivo (valor mínimo: 1).

Nenhum

Substituições por cluster

Utilize o campo overrides para aplicar configurações diferentes por cluster quando clusterIds incluir dois ou mais clusters.

Campo

Tipo

Descrição

Padrão

overrides

map[string]Configuration

Um mapa onde cada chave é um ID de cluster do campo clusterIds e o valor contém configurações específicas do cluster.

Nenhum

Os seguintes campos podem ser substituídos por cluster:

  • serviceAnnotations

  • podAnnotations

  • resources

  • replicaCount

  • Campos relacionados ao HPA (ASM v1.16 ou posterior)

  • serviceType (ASM v1.16 ou posterior)

Exemplo:

overrides:
  cluster1Id:
    replicaCount: 1
    resources:
      limits:
        cpu: '2'
        memory: 2G
    serviceAnnotations:
      service.beta.kubernetes.io/alicloud-loadbalancer-address-type: internet
  cluster2Id:
    replicaCount: 2
    resources:
      limits:
        cpu: '4'
        memory: 4G

Ajuste de kernel

Campo

Tipo

Descrição

Padrão

kernel.enabled

bool

Indica se parâmetros personalizados de kernel devem ser aplicados ao pod do gateway.

false

kernel.parameters

KernelParameters

Parâmetros sysctl a serem ajustados. Todos os valores devem ser strings — coloque números entre aspas duplas (por exemplo, net.core.somaxconn: "65535").

Nenhum

Parâmetros de kernel 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

Alguns parâmetros de kernel podem ser inválidos dependendo da versão do kernel do host. Se o pod do gateway reportar erros, execute kubectl describe pod para identificar parâmetros inválidos e remova-os.

Compressão (apenas gateways de entrada)

Campo

Tipo

Descrição

Padrão

compression.enabled

bool

Indica se a compressão de resposta deve ser ativada.

false

compression.gzip

GzipConfiguration

Configurações de compressão Gzip. Necessário para ativar a compressão. Defina como gzip: {} para usar todos os padrões.

Nenhum

compression.content_type

string[]

Tipos de conteúdo a compactar, identificados pelo cabeçalho Content-Type (por exemplo, text/html, application/json).

Nenhum

compression.min_content_length

uint32

Tamanho mínimo do corpo da resposta (em bytes) que aciona a compressão, com base no cabeçalho Content-Length.

30

compression.disable_on_etag_header

bool

Quando definido como true, desativa a compressão para respostas que incluem um cabeçalho ETag.

false

compression.remove_accept_encoding_header

bool

Quando definido como true, remove o cabeçalho Accept-Encoding das solicitações antes de encaminhá-las aos servidores upstream.

false

Configurações de Gzip

Campo

Tipo

Descrição

Padrão

compression.gzip.memory_level

uint32

Nível de uso de memória para a biblioteca zlib (1--9). Valores mais altos usam mais memória, mas melhoram a velocidade e a qualidade da compressão.

5

compression.gzip.compression_level

string

Nível de compressão para a biblioteca zlib. Valores válidos: de COMPRESSION_LEVEL_1 a COMPRESSION_LEVEL_9, DEFAULT_COMPRESSION, BEST_SPEED, BEST_COMPRESSION. O nível 1 equivale a BEST_SPEED. O nível 9 equivale a BEST_COMPRESSION. O nível 6 equivale a DEFAULT_COMPRESSION.

DEFAULT_COMPRESSION

compression.gzip.compression_strategy

string

Estratégia de compressão para a biblioteca zlib. Valores válidos: DEFAULT_STRATEGY, FILTERED, HUFFMAN_ONLY, RLE, FIXED.

DEFAULT_STRATEGY

compression.gzip.window_bits

uint32

Tamanho da janela para a biblioteca zlib (9--15). Valores maiores melhoram a taxa de compressão, mas aumentam o uso de memória.

12

compression.gzip.chunk_size

uint32

Tamanho do buffer de saída para a biblioteca zlib.

4096

Detalhes das estratégias de compressão:

Estratégia

Caso de uso

DEFAULT_STRATEGY

Compressão de uso geral. Funciona bem para a maioria dos dados.

FILTERED

Dados com muitos padrões repetidos, como texto ou dados gerados.

HUFFMAN_ONLY

Dados estáticos onde a descompressão rápida é prioridade.

RLE

Dados com longas sequências de bytes repetidos, como bitmaps.

FIXED

Usa uma árvore de codificação Huffman predefinida para compressão e descompressão rápidas, às custas da taxa de compressão.

Campos que acionam uma reinicialização contínua

Alterar qualquer um dos campos a seguir causa uma reinicialização contínua dos pods do gateway. Planeje as alterações com cuidado em ambientes de produção.

Campo

Observação

env

ports

No ASM v1.16 ou posterior, alterações em ports não acionam mais uma reinicialização.

configVolumes

resources

secretVolumes

podLabels

podAnnotations

kernel.enabled

kernel.parameters

hostNetwork

dnsPolicy

nodeSelector

A reinicialização depende do agendamento do pod.

affinity

A reinicialização depende do agendamento do pod.

tolerations

A reinicialização depende do agendamento do pod.

Structs Go para um gateway ASM

Use as structs Go a seguir para gerenciar recursos IstioGateway programaticamente com um cliente Go do Kubernetes.

Mostrar as definições de struct Go

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 an ASM gateway.
// +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 {
    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"`
}

// IstioGateway is the Schema for the istiogateways API.
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
// +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"`
}

// IstioGatewayList contains a list of IstioGateway.
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
type IstioGatewayList struct {
    metav1.TypeMeta `json:",inline"`
    metav1.ListMeta `json:"metadata,omitempty"`
    Items           []IstioGateway `json:"items"`
}