全部产品
Search
文档中心

Alibaba Cloud Service Mesh:Bidang CRD untuk gerbang ASM

更新时间:Mar 12, 2026

Alibaba Cloud Service Mesh (ASM) menggunakan Definisi Sumber Daya Kustom (CRD) bernama IstioGateway (apiVersion: istio.alibabacloud.com/v1beta1) untuk mengelola gerbang secara deklaratif. Sebuah controller bawaan memantau perubahan pada CRD ini dan menyelaraskan Service, Penyebaran, serta ServiceAccount terkait di kluster Kubernetes tempat controller tersebut berjalan.

Topik ini menyediakan referensi bidang CRD, contoh konfigurasi, serta definisi struktur Go untuk gerbang ASM.

Persyaratan Awal

Sebuah kluster Container Service for Kubernetes (ACK) telah ditambahkan ke instans ASM Anda. Untuk informasi selengkapnya, lihat Menambahkan kluster ke instans ASM.

Penting

Deploy gerbang ASM di namespace istio-system. Gerbang membaca konfigurasinya dari namespace ini saat startup. Jika versi Istio Anda adalah 1.6 atau lebih baru dan Anda mendeploy gerbang di namespace lain, proses startup akan gagal karena gerbang tidak dapat mengambil konfigurasi yang diperlukan.

Contoh konfigurasi

Gerbang masuk minimal

YAML berikut membuat gerbang masuk dasar dengan batas sumber daya bawaan:

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

Ganti <your-cluster-id> dengan ID aktual kluster yang dikelola oleh instans ASM Anda.

Gerbang masuk lengkap

Contoh ini mencakup bidang opsional seperti variabel lingkungan, label Pod, batas sumber daya, pengaturan pembaruan bergulir, serta penimpaan per kluster:

Tampilkan file YAML

apiVersion: istio.alibabacloud.com/v1beta1
kind: IstioGateway
metadata:
  name: myexample-customingressgateway
  namespace: istio-system
spec:
  clusterIds:
    - <cluster-id-1>
    - <cluster-id-2>    # Deploy gerbang di beberapa kluster
  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

Untuk mengelola gerbang masuk secara terprogram menggunakan klien Go, lihat Struktur Go untuk gerbang ASM.

Gerbang keluar

Gerbang keluar menyalurkan seluruh lalu lintas keluar dalam mesh. Bidang serviceType biasanya diatur ke ClusterIP karena tidak diperlukan load balancer eksternal.

Tampilkan file 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

Membuat gerbang dari konsol

  1. Log masuk ke Konsol ASM. Di panel navigasi kiri, pilih Service Mesh > Mesh Management.

  2. Pada halaman Mesh Management, klik nama instans ASM.

  3. Di panel navigasi kiri, pilih ASM Gateways > Ingress Gateway (atau Egress Gateway).

  4. Klik Create from YAML.

  5. Pada halaman Create, masukkan nama di bidang Name, pilih istio-system dari daftar tarik-turun Namespace, tempel konfigurasi YAML, lalu klik Create.

Verifikasi gerbang

Setelah Anda membuat gerbang, verifikasi bahwa Service dan Pod berjalan.

  1. Log masuk ke Konsol ACK. Di panel navigasi, klik Clusters.

  2. Klik nama kluster. Di panel kiri, pilih Network > Services.

  3. Pilih istio-system dari daftar tarik-turun Namespace dan pastikan Service gerbang ada.

  4. Di panel kiri, pilih Workloads > Pods. Pilih istio-system dari daftar tarik-turun Namespace dan pastikan Pod gerbang berjalan.

Referensi bidang CRD

Bidang inti

BidangJenisDeskripsiBawaan
metadata.namestringNama gerbang ASM. Service dan Penyebaran Kubernetes yang dihasilkan keduanya bernama istio-{metadata.name}.Tidak ada
metadata.namespacestringNamespace untuk gerbang ASM. Service dan Penyebaran yang dihasilkan berada di namespace ini.
Penting

Harus berupa istio-system untuk Istio versi 1.6 atau lebih baru.

istio-system
gatewayTypestringJenis gerbang. Nilai yang valid: ingress (menyalurkan lalu lintas masuk) dan egress (menyalurkan lalu lintas keluar).ingress
clusterIdsstring[]ID kluster tempat gerbang akan didistribusikan. Setiap kluster harus dikelola oleh instans ASM saat ini.Tidak ada

Konfigurasi Service

BidangJenisDeskripsiBawaan
serviceTypestringJenis Service Kubernetes. Nilai yang valid: LoadBalancer, NodePort, ClusterIP. Untuk gerbang keluar, biasanya diatur ke ClusterIP.
Penting

Jika Anda menggunakan kluster terdaftar dan mengatur nilai ini ke LoadBalancer, kluster tersebut harus mendukung Service LoadBalancer.

LoadBalancer
loadBalancerClassstringNilai loadBalancerClass untuk Service. Hanya berlaku ketika serviceType adalah LoadBalancer. Memerlukan ASM versi 1.18 atau lebih baru. Untuk informasi selengkapnya, lihat Mengaitkan instans NLB dengan gerbang masuk.Tidak ada
externalTrafficPolicystringMenentukan apakah lalu lintas masuk diarahkan ke titik akhir lokal node atau titik akhir berskala kluster. Nilai yang valid: Cluster, Local. Hanya berlaku untuk gerbang masuk.Cluster
serviceAnnotationsmap[string]stringAnotasi pada Service gerbang. Hanya berlaku untuk gerbang dengan serviceType yang diatur ke LoadBalancer. Biasanya tidak dikonfigurasi untuk gerbang keluar. Untuk anotasi umum, lihat Menggunakan anotasi untuk mengonfigurasi penyeimbangan beban.Tidak ada
serviceLabelsmap[string]stringLabel pada Service gerbang.Tidak ada
portsServicePort[]Port Service yang diekspos oleh gerbang. Setiap entri mencakup name, port, targetPort, dan secara opsional protocol.
Catatan

Pada versi sebelum 1.9.7.107, atur protocol ke TCP.

Tidak ada

Konfigurasi Pod

BidangJenisDeskripsiBawaan
replicaCountint32Jumlah replika Pod.1
resourcesResourceRequirementsPermintaan dan batas sumber daya CPU serta memori.batas: CPU 2, memori 2G; permintaan: CPU 200m, memori 256Mi
envEnvVar[]Variabel lingkungan yang disuntikkan ke kontainer gerbang.Tidak ada
podLabelsmap[string]stringLabel pada Pod gerbang.Tidak ada
podAnnotationsmap[string]stringAnotasi pada Pod gerbang.Tidak ada
nodeSelectormap[string]stringLabel node yang digunakan untuk menjadwalkan Pod gerbang ke node tertentu.Tidak ada
affinityAffinityAturan afinitas node untuk menjadwalkan Pod gerbang. Untuk informasi selengkapnya, lihat Afinitas dan anti-afinitas.Tidak ada
tolerationsToleration[]Toleransi yang memungkinkan Pod gerbang dijadwalkan ke node dengan taint yang cocok. Untuk informasi selengkapnya, lihat Taint dan Toleransi.Tidak ada
hostNetworkboolApakah Pod gerbang berbagi namespace jaringan host.false
dnsPolicystringKebijakan DNS untuk Pod gerbang. Untuk informasi selengkapnya, lihat DNS untuk Service dan Pod.ClusterFirst
runAsRootboolApakah kontainer gerbang dijalankan sebagai root.false
readinessProbeReadinessProbeConfigurationPengaturan probe kesiapan untuk Pod gerbang.Tidak ada

Konfigurasi Penyebaran

BidangJenisDeskripsiBawaan
rollingMaxSurgestringJumlah maksimum Pod yang boleh melebihi jumlah replika yang diinginkan selama pembaruan bergulir. Menerima nilai absolut atau persentase."100%"
rollingMaxUnavailablestringJumlah maksimum Pod yang boleh tidak tersedia selama pembaruan bergulir. Menerima nilai absolut atau persentase."25%"

Pemasangan volume

BidangJenisDeskripsiBawaan
configVolumesConfigVolume[]Volume ConfigMap yang dipasang ke Pod gerbang. Setiap entri mencakup name, configMapName, dan mountPath.Tidak ada
secretVolumesSecretVolume[]Volume rahasia yang dipasang ke Pod gerbang. Setiap entri mencakup name, secretName, dan mountPath.Tidak ada

Contoh volume ConfigMap:

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

Contoh volume rahasia:

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

Horizontal Pod Autoscaling (HPA)

BidangJenisDeskripsiBawaan
cpu.targetAverageUtilizationint32Target utilisasi CPU (1–100). Ketika utilisasi melebihi ambang batas ini, HPA melakukan penskalaan naik. Ketika utilisasi turun di bawahnya, HPA melakukan penskalaan turun.Tidak ada
memory.targetAverageUtilizationint32Target utilisasi memori (1–100). Mengikuti perilaku penskalaan yang sama seperti CPU.Tidak ada
maxReplicasint32Jumlah maksimum replika yang dapat dicapai oleh HPA. Harus berupa bilangan bulat positif.Tidak ada
minReplicasint32Jumlah minimum replika yang dapat dicapai oleh HPA. Harus berupa bilangan bulat positif (nilai minimum: 1).Tidak ada

Penimpaan per kluster

Gunakan bidang overrides untuk menerapkan pengaturan berbeda per kluster ketika clusterIds mencakup dua kluster atau lebih.

BidangJenisDeskripsiBawaan
overridesmap[string]ConfigurationPeta di mana setiap kunci adalah ID kluster dari bidang clusterIds dan nilainya berisi pengaturan spesifik kluster.Tidak ada

Bidang berikut dapat ditimpa per kluster:

  • serviceAnnotations

  • podAnnotations

  • resources

  • replicaCount

  • Bidang terkait HPA (ASM versi 1.16 atau lebih baru)

  • serviceType (ASM versi 1.16 atau lebih baru)

Contoh:

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

Penyetelan kernel

BidangJenisDeskripsiBawaan
kernel.enabledboolApakah akan menerapkan parameter kernel khusus ke Pod gerbang.false
kernel.parametersKernelParametersParameter sysctl untuk penyetelan. Semua nilai harus berupa string — kelilingi angka dengan tanda kutip ganda (misalnya, net.core.somaxconn: "65535").Tidak ada

Parameter kernel yang 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

Beberapa parameter kernel mungkin tidak valid tergantung pada versi kernel host. Jika Pod gerbang melaporkan kesalahan, jalankan kubectl describe pod untuk mengidentifikasi parameter yang tidak valid, lalu hapus parameter tersebut.

Kompresi (hanya untuk gerbang masuk)

BidangJenisDeskripsiBawaan
compression.enabledboolApakah akan mengaktifkan kompresi respons.false
compression.gzipGzipConfigurationPengaturan kompresi Gzip. Diperlukan untuk mengaktifkan kompresi. Atur ke gzip: {} untuk menggunakan semua nilai bawaan.Tidak ada
compression.content_typestring[]Jenis konten yang akan dikompresi, diidentifikasi oleh header Content-Type (misalnya, text/html, application/json).Tidak ada
compression.min_content_lengthuint32Ukuran minimum badan respons (dalam byte) yang memicu kompresi, berdasarkan header Content-Length.30
compression.disable_on_etag_headerboolKetika diatur ke true, kompresi dinonaktifkan untuk respons yang menyertakan header ETag.false
compression.remove_accept_encoding_headerboolKetika diatur ke true, header Accept-Encoding dihapus dari permintaan sebelum diteruskan ke server upstream.false

Pengaturan Gzip

BidangJenisDeskripsiBawaan
compression.gzip.memory_leveluint32Tingkat penggunaan memori untuk pustaka zlib (1–9). Nilai yang lebih tinggi menggunakan lebih banyak memori tetapi meningkatkan kecepatan dan kualitas kompresi.5
compression.gzip.compression_levelstringTingkat kompresi untuk pustaka zlib. Nilai yang valid: COMPRESSION_LEVEL_1 hingga COMPRESSION_LEVEL_9, DEFAULT_COMPRESSION, BEST_SPEED, BEST_COMPRESSION. Tingkat 1 setara dengan BEST_SPEED. Tingkat 9 setara dengan BEST_COMPRESSION. Tingkat 6 setara dengan DEFAULT_COMPRESSION.DEFAULT_COMPRESSION
compression.gzip.compression_strategystringStrategi kompresi untuk pustaka zlib. Nilai yang valid: DEFAULT_STRATEGY, FILTERED, HUFFMAN_ONLY, RLE, FIXED.DEFAULT_STRATEGY
compression.gzip.window_bitsuint32Ukuran jendela untuk pustaka zlib (9–15). Nilai yang lebih tinggi meningkatkan rasio kompresi tetapi juga meningkatkan penggunaan memori.12
compression.gzip.chunk_sizeuint32Ukuran buffer keluaran untuk pustaka zlib.4096

Detail strategi kompresi:

StrategiSkenario penggunaan
DEFAULT_STRATEGYKompresi tujuan umum. Berfungsi baik untuk sebagian besar data.
FILTEREDData dengan banyak pola berulang, seperti teks atau data hasil generasi.
HUFFMAN_ONLYData statis di mana kecepatan dekompresi menjadi prioritas utama.
RLEData dengan urutan panjang byte berulang, seperti bitmap.
FIXEDMenggunakan pohon Huffman coding yang telah ditentukan sebelumnya untuk kompresi dan dekompresi cepat, dengan mengorbankan rasio kompresi.

Bidang yang memicu restart bergulir

Mengubah salah satu bidang berikut menyebabkan restart bergulir pada Pod gerbang. Rencanakan perubahan dengan cermat di lingkungan produksi.

BidangCatatan
env
portsDi ASM v1.16 atau versi lebih baru, perubahan pada ports tidak lagi memicu restart.
configVolumes
resources
secretVolumes
podLabels
podAnnotations
kernel.enabled
kernel.parameters
hostNetwork
dnsPolicy
nodeSelectorRestart bergantung pada penjadwalan Pod.
affinityRestart bergantung pada penjadwalan Pod.
tolerationsRestart bergantung pada penjadwalan Pod.

Struktur Go untuk gerbang ASM

Gunakan struktur Go berikut untuk mengelola sumber daya IstioGateway secara terprogram dengan client Kubernetes Go.

Tampilkan definisi struktur 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 mendefinisikan status yang diinginkan dari sebuah gerbang ASM.
// +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 adalah skema untuk API istiogateways.
// +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 berisi daftar 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"`
}