Tous les produits
Search
Centre de documentation

Alibaba Cloud Service Mesh:CRD fields for an ASM gateway

Dernière mise à jour :Aug 11, 2026

Service Mesh (ASM) utilise une définition de ressource personnalisée (CRD) nommée IstioGateway (apiVersion: istio.alibabacloud.com/v1beta1) pour gérer les passerelles de manière déclarative. Un contrôleur intégré surveille les modifications apportées à cette CRD et réconcilie les ressources Service, Deployment et ServiceAccount correspondantes dans le cluster Kubernetes où s'exécute le contrôleur.

Cette rubrique présente la référence des champs CRD, des exemples de configuration ainsi que les définitions de structures Go pour les passerelles ASM.

Prérequis

Ajoutez un cluster Container Service for Kubernetes (ACK) à votre instance ASM. Pour plus d'informations, consultez la rubrique Ajouter un cluster à une instance ASM.

Important

Déployez les passerelles ASM dans l'espace de noms istio-system. La passerelle lit sa configuration depuis cet espace de noms au démarrage. Si vous utilisez Istio version 1.6 ou ultérieure et que vous déployez la passerelle dans un autre espace de noms, celle-ci ne parviendra pas à démarrer car elle ne pourra pas récupérer la configuration requise.

Exemples de configuration

Passerelle d'entrée minimale

Le fichier YAML suivant crée une passerelle d'entrée de base avec des limites de ressources par défaut :

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

Remplacez <your-cluster-id> par l'identifiant réel d'un cluster géré par votre instance ASM.

Passerelle d'entrée complète

Cet exemple inclut des champs facultatifs tels que les variables d'environnement, les libellés de pod, les limites de ressources, les paramètres de mise à jour progressive et les substitutions par cluster :

Afficher le fichier 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
Pour gérer la passerelle d'entrée par programmation à l'aide d'un client Go, consultez la section Structures Go pour une passerelle ASM .

Passerelle de sortie

Une passerelle de sortie achemine tout le trafic sortant du maillage. Le champ serviceType est généralement défini sur ClusterIP car aucun équilibreur de charge externe n'est nécessaire.

Afficher le fichier 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

Créer une passerelle depuis la console

  1. Connectez-vous à la console ASM. Dans le volet de navigation de gauche, sélectionnez Service Mesh > Mesh Management.

  2. Sur la page Mesh Management, cliquez sur le nom de l'instance ASM.

  3. Dans le volet de navigation de gauche, sélectionnez ASM Gateways > Ingress Gateway (ou Egress Gateway).

  4. Cliquez sur Create from YAML.

  5. Sur la page Create, saisissez un nom dans le champ Name, choisissez istio-system dans la liste déroulante Namespace, collez la configuration YAML, puis cliquez sur Create.

Vérifier la passerelle

Après avoir créé la passerelle, vérifiez que le service et les pods sont en cours d'exécution.

  1. Connectez-vous à la console ACK. Dans le volet de navigation, cliquez sur Clusters.

  2. Cliquez sur le nom du cluster. Dans le volet de gauche, sélectionnez Network > Services.

  3. Sélectionnez istio-system dans la liste déroulante Namespace et vérifiez que le service de la passerelle existe.

  4. Dans le volet de gauche, sélectionnez Workloads > Pods. Sélectionnez istio-system dans la liste déroulante Namespace et vérifiez que les pods de la passerelle sont en cours d'exécution.

Référence des champs CRD

Champs principaux

ChampTypeDescriptionValeur par défaut
metadata.namestringNom de la passerelle ASM. Le service Kubernetes et le déploiement générés portent tous deux le nom istio-{metadata.name}.Aucune
metadata.namespacestringEspace de noms de la passerelle ASM. Le service et le déploiement générés résident dans cet espace de noms.
Important

Doit être istio-system pour Istio 1.6 et versions ultérieures.

istio-system
gatewayTypestringType de passerelle. Valeurs valides : ingress (achemine le trafic entrant) et egress (achemine le trafic sortant).ingress
clusterIdsstring[]Identifiants des clusters dans lesquels déployer la passerelle. Chaque cluster doit être géré par l'instance ASM actuelle.Aucune

Configuration du service

ChampTypeDescriptionValeur par défaut
serviceTypestringType de service Kubernetes. Valeurs valides : LoadBalancer, NodePort, ClusterIP. Pour les passerelles de sortie, ce champ est généralement défini sur ClusterIP.
Important

Si vous utilisez un cluster enregistré et définissez cette valeur sur LoadBalancer, le cluster doit prendre en charge les services LoadBalancer.

LoadBalancer
loadBalancerClassstringClasse d'équilibreur de charge (loadBalancerClass) du service. Valide uniquement lorsque serviceType est défini sur LoadBalancer. Nécessite ASM v1.18 ou version ultérieure. Pour plus d'informations, consultez la rubrique Associer une instance NLB à une passerelle d'entrée.Aucune
externalTrafficPolicystringDétermine si le trafic entrant est acheminé vers des points de terminaison locaux au nœud ou à l'ensemble du cluster. Valeurs valides : Cluster, Local. S'applique uniquement aux passerelles d'entrée.Cluster
serviceAnnotationsmap[string]stringAnnotations du service de la passerelle. S'applique uniquement aux passerelles dont le champ serviceType est défini sur LoadBalancer. Généralement non configuré pour les passerelles de sortie. Pour connaître les annotations courantes, consultez la rubrique Utiliser des annotations pour configurer l'équilibrage de charge.Aucune
serviceLabelsmap[string]stringLibellés du service de la passerelle.Aucune
portsServicePort[]Ports de service exposés par la passerelle. Chaque entrée comprend les champs name, port, targetPort et, éventuellement, protocol.
Remarque

Dans les versions antérieures à 1.9.7.107, définissez protocol sur TCP.

Aucune

Configuration des pods

Champ Type Description Valeur par défaut
replicaCount int32 Nombre de réplicas de pod. 1
resources ResourceRequirements Demandes et limites de ressources CPU et mémoire. limits: cpu 2, memory 2G ; requests: cpu 200m, memory 256Mi
env EnvVar[] Variables d'environnement injectées dans le conteneur de la passerelle. Aucune
podLabels map[string]string Libellés du pod de la passerelle. Aucune
podAnnotations map[string]string Annotations du pod de la passerelle. Aucune
nodeSelector map[string]string Libellés de nœuds utilisés pour planifier le pod de la passerelle sur des nœuds spécifiques. Aucune
affinity Affinity Règles d'affinité de nœud pour la planification du pod de la passerelle. Pour plus d'informations, consultez la documentation Affinité et anti-affinité. Aucune
tolerations Toleration[] Tolérances permettant au pod de la passerelle d'être planifié sur des nœuds présentant des taints correspondants. Pour plus d'informations, consultez la documentation Taints et Tolérations. Aucune
hostNetwork bool Indique si le pod de la passerelle partage l'espace de noms réseau de l'hôte. false
dnsPolicy string Politique DNS du pod de la passerelle. Pour plus d'informations, consultez la documentation DNS pour les services et les pods. ClusterFirst
runAsRoot bool Indique si le conteneur de la passerelle s'exécute en tant que root. false
readinessProbe ReadinessProbeConfiguration Paramètres de la sonde de readiness pour le pod de la passerelle. Aucune

Configuration du déploiement

Champ Type Description Valeur par défaut
rollingMaxSurge string Nombre maximal de pods pouvant dépasser le nombre souhaité de réplicas lors d'une mise à jour progressive. Accepte une valeur absolue ou un pourcentage. "100%"
rollingMaxUnavailable string Nombre maximal de pods pouvant être indisponibles lors d'une mise à jour progressive. Accepte une valeur absolue ou un pourcentage. "25%"

Montages de volumes

Champ Type Description Valeur par défaut
configVolumes ConfigVolume[] Volumes ConfigMap montés sur le pod de la passerelle. Chaque entrée comprend les champs name, configMapName et mountPath. Aucune
secretVolumes SecretVolume[] Volumes Secret montés sur le pod de la passerelle. Chaque entrée comprend les champs name, secretName et mountPath. Aucune

Exemple de volume ConfigMap :

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

Exemple de volume Secret :

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

Horizontal Pod Autoscaling (HPA)

Champ Type Description Valeur par défaut
cpu.targetAverageUtilization int32 Utilisation cible du processeur (1–100). Lorsque l'utilisation dépasse ce seuil, le HPA effectue un scale-up. Lorsqu'elle descend en dessous, le HPA effectue un scale-down. Aucune
memory.targetAverageUtilization int32 Utilisation cible de la mémoire (1–100). Suit le même comportement de mise à l'échelle que le processeur. Aucune
maxReplicas int32 Nombre maximal de réplicas auxquels le HPA peut effectuer un scale-up. Doit être un entier positif. Aucune
minReplicas int32 Nombre minimal de réplicas auxquels le HPA peut effectuer un scale-down. Doit être un entier positif (valeur minimale : 1). Aucune

Substitutions par cluster

Utilisez le champ overrides pour appliquer des paramètres différents par cluster lorsque le champ clusterIds inclut deux clusters ou plus.

Champ Type Description Valeur par défaut
overrides map[string]Configuration Une carte où chaque clé est un identifiant de cluster issu du champ clusterIds et la valeur contient les paramètres spécifiques au cluster. Aucune

Les champs suivants peuvent être substitués par cluster :

  • serviceAnnotations

  • podAnnotations

  • resources

  • replicaCount

  • Champs liés au HPA (ASM v1.16 ou version ultérieure)

  • serviceType (ASM v1.16 ou version ultérieure)

Exemple :

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

Réglage du noyau

Champ Type Description Valeur par défaut
kernel.enabled bool Indique s'il faut appliquer des paramètres de noyau personnalisés au pod de la passerelle. false
kernel.parameters KernelParameters Paramètres sysctl à régler. Toutes les valeurs doivent être des chaînes de caractères : mettez les nombres entre guillemets doubles (par exemple, net.core.somaxconn: "65535"). Aucune

Paramètres du noyau pris en charge :

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

Certains paramètres du noyau peuvent être invalides selon la version du noyau de l'hôte. Si le pod de la passerelle signale des erreurs, exécutez la commande kubectl describe pod pour identifier les paramètres invalides, puis supprimez-les.

Compression (passerelles d'entrée uniquement)

Champ Type Description Valeur par défaut
compression.enabled bool Indique s'il faut activer la compression des réponses. false
compression.gzip GzipConfiguration Paramètres de compression Gzip. Requis pour activer la compression. Définissez sur gzip: {} pour utiliser toutes les valeurs par défaut. Aucune
compression.content_type string[] Types de contenu à compresser, identifiés par l'en-tête Content-Type (par exemple, text/html, application/json). Aucune
compression.min_content_length uint32 Taille minimale du corps de la réponse (en octets) qui déclenche la compression, basée sur l'en-tête Content-Length. 30
compression.disable_on_etag_header bool Lorsque la valeur est true, désactive la compression pour les réponses incluant un en-tête ETag. false
compression.remove_accept_encoding_header bool Lorsque la valeur est true, supprime l'en-tête Accept-Encoding des requêtes avant de les transférer aux serveurs amont. false

Paramètres Gzip

Champ Type Description Valeur par défaut
compression.gzip.memory_level uint32 Niveau d'utilisation de la mémoire pour la bibliothèque zlib (1–9). Des valeurs plus élevées consomment plus de mémoire mais améliorent la vitesse et la qualité de la compression. 5
compression.gzip.compression_level string Niveau de compression pour la bibliothèque zlib. Valeurs valides : de COMPRESSION_LEVEL_1 à COMPRESSION_LEVEL_9, DEFAULT_COMPRESSION, BEST_SPEED, BEST_COMPRESSION. Le niveau 1 équivaut à BEST_SPEED. Le niveau 9 équivaut à BEST_COMPRESSION. Le niveau 6 équivaut à DEFAULT_COMPRESSION. DEFAULT_COMPRESSION
compression.gzip.compression_strategy string Stratégie de compression pour la bibliothèque zlib. Valeurs valides : DEFAULT_STRATEGY, FILTERED, HUFFMAN_ONLY, RLE, FIXED. DEFAULT_STRATEGY
compression.gzip.window_bits uint32 Taille de la fenêtre pour la bibliothèque zlib (9–15). Des valeurs plus élevées améliorent le taux de compression mais augmentent l'utilisation de la mémoire. 12
compression.gzip.chunk_size uint32 Taille du tampon de sortie pour la bibliothèque zlib. 4096

Détails des stratégies de compression :

Stratégie Cas d'utilisation
DEFAULT_STRATEGY Compression polyvalente. Fonctionne bien pour la plupart des données.
FILTERED Données comportant de nombreux motifs répétitifs, comme du texte ou des données générées.
HUFFMAN_ONLY Données statiques où la rapidité de décompression est prioritaire.
RLE Données contenant de longues séquences d'octets répétés, telles que des images bitmap.
FIXED Utilise un arbre de codage Huffman prédéfini pour une compression et une décompression rapides, au détriment du taux de compression.

Champs déclenchant un redémarrage progressif

La modification de l'un des champs suivants entraîne un redémarrage progressif des pods de la passerelle. Planifiez soigneusement les changements dans les environnements de production.

Champ Remarque
env
ports Dans ASM v1.16 ou version ultérieure, les modifications apportées au champ ports ne déclenchent plus de redémarrage.
configVolumes
resources
secretVolumes
podLabels
podAnnotations
kernel.enabled
kernel.parameters
hostNetwork
dnsPolicy
nodeSelector Le redémarrage dépend de la planification des pods.
affinity Le redémarrage dépend de la planification des pods.
tolerations Le redémarrage dépend de la planification des pods.

Structures Go pour une passerelle ASM

Utilisez les structures Go suivantes pour gérer les ressources IstioGateway par programmation à l'aide d'un client Kubernetes Go.

Afficher les définitions de structures 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"`
}