全部产品
Search
文档中心

Alibaba Cloud Service Mesh:Bidang CRD untuk gateway ASM

更新时间:Jun 28, 2025

Service Mesh (ASM) menyediakan sumber daya API CustomResourceDefinition (CRD) dengan kind berupa IstioGateway dan apiVersion berupa istio.alibabacloud.com/v1beta1. Selain itu, ASM menyediakan pengontrol untuk mengelola sumber daya tersebut. Pengontrol ini memantau perubahan dalam CRD dan memperbarui Service, Deployment, serta ServiceAccount dari kluster Kubernetes tempat pengontrol berjalan. Topik ini menjelaskan contoh konfigurasi dan bidang CRD untuk gateway ASM.

Contoh konfigurasi

Prasyarat

Kluster Container Service for Kubernetes (ACK) telah ditambahkan ke instance ASM Anda. Untuk informasi lebih lanjut, lihat Tambahkan Kluster ke Instance ASM.

Penting

Gateway ASM harus diterapkan di namespace istio-system. Dengan cara ini, ketika Anda memulai gateway ASM, konfigurasi gateway ASM dapat diperoleh untuk memastikan startup yang berhasil. Jika versi Istio instance Anda adalah 1.6 atau lebih baru dan Anda menerapkan gateway ASM di namespace lain, gateway ASM tidak dapat dimulai karena kegagalan mendapatkan konfigurasi gateway.

Contoh 1: Buat dan kelola gateway masuk menggunakan Kubernetes API

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

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

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

  4. Di halaman Create, masukkan nama untuk gateway masuk di bidang Name, pilih istio-system dari daftar drop-down Namespace, konfigurasikan bidang berikut di file YAML, lalu klik Create.

    Untuk informasi lebih lanjut tentang bidang CRD, lihat Bidang CRD.

    Perluas untuk Melihat File YAML

    apiVersion: istio.alibabacloud.com/v1beta1
    kind: IstioGateway
    metadata:   
      name: "myexample-customingressgateway"  
      namespace: "istio-system"
    spec:  
      clusterIds:
        - "${ID Kluster Aktual}"
        - "${ID Kluster Aktual}" # Gateway ASM dapat diterapkan 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
    # - name: config-volume-lua
    #  configMapName: lua-libs
    #  mountPath: /var/lib/lua
    # secretVolumes:
    # - name: myexample-customingressgateway-certs
    #   secretName: istio-myexample-customingressgateway-certs
    #   mountPath: /etc/istio/myexample-customingressgateway-certs
      serviceType: LoadBalancer  
      serviceAnnotations:    
        service.beta.kubernetes.io/alicloud-loadbalancer-address-type: internet  
      serviceLabels:
        serviceLabelKey1: "serviceLabelValue1"
      podAnnotations:
        podAnnotationsKey1: "podAnnotationsValue1"
      rollingMaxSurge: "100%"
      rollingMaxUnavailable: "25%"
      overrides:
        cluster1Id:
          replicaCount: 1 
          resources:
            limits:
              cpu: '2'
              memory: 2G
            requests:
              cpu: 200m
              memory: 256Mi
          serviceAnnotations:    
            service.beta.kubernetes.io/alicloud-loadbalancer-address-type: internet
            service.beta.kubernetes.io/alibaba-cloud-loadbalancer-spec: "slb.s1.small"
        cluster2Id:
          replicaCount: 2
          resources:
            limits:
              cpu: '4'
              memory: 4G
            requests:
              cpu: 400m
              memory: 512Mi
          serviceAnnotations:    
            service.beta.kubernetes.io/alicloud-loadbalancer-address-type: internet
            service.beta.kubernetes.io/alibaba-cloud-loadbalancer-spec: "slb.s2.small"

    Catatan

    Jika Anda perlu menggunakan Go Client untuk Kubernetes untuk mengelola gateway masuk, lihat Struktur Go untuk Gateway ASM.

  5. Lihat informasi layanan gateway masuk dengan melakukan langkah-langkah berikut:

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

    2. Di halaman Clusters, temukan kluster yang Anda inginkan dan klik namanya. Di panel kiri, pilih Network > Services.

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

    4. Dalam daftar layanan, klik nama layanan gateway masuk yang diinginkan untuk melihat informasinya.

  6. Lihat informasi pod gateway masuk.

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

    2. Di halaman Clusters, temukan kluster yang Anda inginkan dan klik namanya. Di panel kiri, pilih Workloads > Pods.

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

    4. Dalam daftar pod, temukan pod gateway masuk dan klik nama pod untuk melihat informasi pod.

Contoh 2: Buat dan kelola gateway keluar menggunakan Kubernetes API

ASM menyediakan layanan gateway keluar untuk merutekan semua trafik arah keluar di dalam mesh.

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

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

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

  4. Di halaman Create, masukkan nama untuk gateway keluar di bidang Name, pilih istio-system dari daftar drop-down Namespace, konfigurasikan bidang berikut di file YAML, lalu klik Create.

    Untuk informasi lebih lanjut tentang bidang CRD, lihat Bidang CRD.

    Perluas untuk Melihat File YAML

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

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

    2. Di halaman Clusters, temukan kluster yang Anda inginkan dan klik namanya. Di panel kiri, pilih Network > Services.

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

    4. Dalam daftar layanan, klik nama layanan gateway keluar yang diinginkan untuk melihat informasinya.

  6. Lihat informasi pod gateway keluar.

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

    2. Di halaman Clusters, temukan kluster yang Anda inginkan dan klik namanya. Di panel kiri, pilih Workloads > Pods.

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

    4. Dalam daftar pod, temukan pod gateway keluar dan klik nama pod untuk melihat informasi pod.

Bidang CRD

Bidang

Deskripsi

Nilai default

metadata.name

Nama gateway ASM. Service dan Deployment Kubernetes yang dihasilkan bernama istio-{Nilai dari bidang metadata.name}.

Tidak ada

metadata.namespace

Namespace tempat gateway ASM diterapkan. Service dan Deployment Kubernetes yang dihasilkan berada di namespace ini.

Penting

Untuk memastikan bahwa Service dan Deployment Kubernetes yang dihasilkan tersedia di Istio 1.6 dan yang lebih baru, namespace harus istio-system.

istio-system

clusterIds

ID kluster tempat Anda ingin menerapkan gateway ASM. Nilainya adalah array. Kluster harus dikelola dalam instance ASM saat ini.

Tidak ada

env

Variabel lingkungan pod gateway ASM. Nilainya adalah array.

Tidak ada

externalTrafficPolicy

Menentukan apakah gateway merutekan trafik masuk ke node-lokal atau titik akhir di seluruh kluster. Nilai valid: Cluster atau Local.

Catatan

Bidang ini hanya tersedia untuk gateway masuk.

Cluster

ports

Port dan protokol yang didefinisikan untuk pod gateway ASM. Nilainya adalah array. Contohnya,

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

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

Catatan

Pada versi sebelum 1.9.7.107, bidang protocol harus diatur ke TCP.

Tidak ada

gatewayType

Tipe gateway ASM. Nilai valid: ingress dan egress.

  • ingress: menunjukkan gateway masuk yang merutekan semua trafik masuk di dalam mesh.

  • egress: menunjukkan gateway keluar yang merutekan semua trafik keluar di dalam mesh.

ingress

replicaCount

Jumlah replika pod.

1

configVolumes

Informasi tentang volume ConfigMap yang dipasang ke pod gateway ASM. Contoh:

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

Tidak ada

resources

Konfigurasi sumber daya pod gateway ASM.

  • limits:

    • cpu: '2'

    • memory: 2G

  • requests:

    • cpu: 200m

    • memory: 256Mi

secretVolumes

Informasi tentang volume rahasia yang dipasang ke pod gateway ASM. Contoh:

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

Tidak ada

serviceType

Tipe layanan gateway ASM. Nilai valid: LoadBalancer, NodePort, dan ClusterIP. Untuk gateway keluar, nilai bidang ini biasanya diatur ke ClusterIP.

Penting

Jika Anda menggunakan kluster terdaftar pada bidang data dan bidang ini diatur ke LoadBalancer, pastikan kluster mendukung Layanan LoadBalancer. Jika tidak, pembuatan gateway ASM mungkin gagal.

LoadBalancer

loadBalancerClass

Kelas loadBalancer gateway ASM. Bidang ini valid hanya jika parameter serviceType diatur ke LoadBalancer. Bidang ini didukung oleh instance ASM versi 1.18 atau lebih baru. Untuk informasi lebih lanjut, lihat Asosiasikan instance NLB dengan gateway masuk.

Tidak ada

serviceAnnotations

Anotasi gateway ASM. Contoh: service.beta.kubernetes.io/alibaba-cloud-loadbalancer-connection-drain: 'on' service.beta.kubernetes.io/alibaba-cloud-loadbalancer-connection-drain-timeout: '20'. Untuk informasi lebih lanjut tentang anotasi umum, lihat Tambahkan anotasi ke file YAML Layanan untuk mengonfigurasi instance CLB.

Catatan

Bidang ini hanya tersedia untuk gateway yang serviceType-nya adalah LoadBalancer. Untuk gateway keluar, bidang ini biasanya tidak dikonfigurasi.

Tidak ada

serviceLabels

Label gateway ASM.

Tidak ada

podLabels

Label pod gateway ASM.

Tidak ada

podAnnotations

Anotasi pod gateway ASM.

Tidak ada

rollingMaxSurge

Jumlah maksimum pod yang dijadwalkan di atas jumlah replika yang diharapkan selama pembaruan bergulir. Nilainya bisa berupa nilai absolut atau persentase.

"100%"

rollingMaxUnavailable

Jumlah maksimum pod yang dapat tidak tersedia selama pembaruan bergulir. Nilainya bisa berupa nilai absolut atau persentase.

"25%"

overrides

Mengonfigurasi pengaturan khusus untuk kluster tertentu. Bidang ini tersedia ketika bidang clusterIds menentukan dua kluster atau lebih. Anda dapat menggunakan bidang ini ketika ingin mengonfigurasi kluster tertentu dengan pengaturan yang berbeda dari pengaturan kluster sebelumnya. Nilainya adalah tipe MAP yang berisi pasangan key-value.

Catatan
  • key: ID kluster yang ditentukan dalam bidang clusterIds.

  • Daftar berikut menjelaskan beberapa parameter yang dapat Anda konfigurasikan di bawah bidang overrides:

    • serviceAnnotations

    • podAnnotations

    • resources

    • replicaCount

    • Konfigurasi Horizontal Pod Autoscaling (HPA) (didukung di instance ASM versi 1.16 atau lebih baru)

    • serviceType (didukung di instance ASM versi 1.16 atau lebih baru)

Tidak ada

kernel.enabled

Menentukan apakah akan mengaktifkan bidang kernel kustom.

false

kernel.parameters

Bidang kernel. Bidang kernel berikut didukung:

  • net.core.somaxconn

  • net.core.netdev_max_backlog

  • net.ipv4.tcp_rmem

  • net.ipv4.tcp_wmem

  • net.ipv4.ip_local_port_range

  • net.ipv4.tcp_fin_timeout

  • net.ipv4.tcp_tw_timeout

  • net.ipv4.tcp_tw_reuse

  • net.ipv4.tcp_tw_recycle

  • net.ipv4.tcp_timestamps

  • net.ipv4.tcp_retries2

  • net.ipv4.tcp_slow_start_after_idle

  • net.ipv4.tcp_max_orphans

  • net.ipv4.tcp_max_syn_backlog

  • net.ipv4.tcp_no_metrics_save

  • net.ipv4.tcp_autocorking

  • kernel.printk

  • vm.swappiness

Catatan

Bidang kernel spesifik yang didukung oleh ASM mungkin menjadi tidak valid karena versi kernel host. Jika situasi ini terjadi, pod gateway ASM mungkin melaporkan kesalahan.

Anda dapat menjalankan perintah kubectl describe pod untuk melihat kesalahan yang dilaporkan oleh pod gateway ASM. Setelah Anda menghapus bidang yang tidak valid, kontainer dapat dimulai seperti yang diharapkan.

Nilai semua bidang kernel harus dalam format string. YAML mengenali angka sebagai nilai numerik. Oleh karena itu, Anda harus mengapit setiap nilai dalam tanda kutip ganda ("). Contoh: net.core.somaxconn: "65535".

Tidak ada

compression.enabled

Menentukan apakah akan mengaktifkan fitur kompresi untuk gateway masuk.

Catatan

Bidang terkait compression hanya tersedia untuk gateway masuk.

false

compression.content_type

Jenis data yang akan dikompresi, yang ditunjukkan oleh header Content-Type. Contohnya:

  • text/html

  • application/json

Tidak ada

compression.disable_on_etag_header

  • Menentukan apakah akan menonaktifkan fitur kompresi ketika respons HTTP mencakup header ETag. Jika bidang ini diatur ke true, fitur kompresi dinonaktifkan ketika header ETag disertakan dalam respons HTTP.

  • Jika bidang ini diatur ke false, fitur kompresi diaktifkan ketika header ETag disertakan dalam respons HTTP.

false

compression.min_content_length

Ambang batas di mana kompresi dipicu. Nilai bidang ini menunjukkan ukuran header Content-Length.

30

compression.remove_accept_encoding_header

  • Menentukan apakah akan menghapus header Accept-Encoding dari permintaan HTTP yang dikirim oleh klien sebelum gateway masuk meneruskan permintaan HTTP tersebut ke server upstream. Jika bidang ini diatur ke true, header Accept-Encoding dihapus dari permintaan HTTP.

  • Jika bidang ini diatur ke false, header Accept-Encoding tetap ada dalam permintaan HTTP.

false

compression.gzip

Format kompresi. Hanya format GZIP yang didukung. Jika Anda ingin mengaktifkan fitur kompresi, bidang ini diperlukan. Jika nilai default digunakan untuk semua bidang lainnya, Anda harus membiarkan bidang ini kosong. Contoh: gzip: {}.

Tidak ada

compression.gzip.memory_level

Tingkat penggunaan memori pustaka zlib. Nilai valid: 1 hingga 9. Nilai yang lebih besar untuk bidang ini menghasilkan penggunaan memori yang lebih tinggi tetapi kecepatan kompresi yang lebih tinggi dan kualitas kompresi yang lebih baik.

5

compression.gzip.compression_level

Tingkat kompresi yang digunakan oleh pustaka zlib. Nilai valid:

  • COMPRESSION_LEVEL_1

  • COMPRESSION_LEVEL_2

  • COMPRESSION_LEVEL_3

  • COMPRESSION_LEVEL_4

  • COMPRESSION_LEVEL_5

  • COMPRESSION_LEVEL_6

  • COMPRESSION_LEVEL_7

  • COMPRESSION_LEVEL_8

  • COMPRESSION_LEVEL_9

  • DEFAULT_COMPRESSION

  • BEST_COMPRESSION

  • BEST_SPEED

Catatan

BEST_COMPRESSION menunjukkan kualitas kompresi tertinggi. BEST_SPEED menunjukkan kecepatan kompresi tertinggi. Daftar berikut menjelaskan beberapa tingkat kompresi:

  • COMPRESSION_LEVEL_1 setara dengan BEST_SPEED, yang memiliki kecepatan kompresi tercepat dan rasio kompresi rendah.

  • COMPRESSION_LEVEL_9 setara dengan BEST_COMPRESSION. Tingkat kompresi dari 7 hingga 9 memiliki rasio kompresi tertinggi dan kecepatan kompresi rendah.

  • COMPRESSION_LEVEL_6 setara dengan DEFAULT_COMPRESSION. Tingkat kompresi dari 2 hingga 6 adalah tingkat kompresi sedang yang menyeimbangkan antara rasio dan kecepatan.

DEFAULT_COMPRESSION

compression.gzip.compression_strategy

Kebijakan kompresi yang digunakan oleh pustaka zlib. Nilai valid:

  • DEFAULT_STRATEGY

  • FILTERED

  • FIXED

  • HUFFMAN_ONLY

  • RLE

Catatan

DEFAULT_STRATEGY 

Kebijakan kompresi ini adalah kebijakan kompresi default yang menggunakan perilaku default dasar dan dapat menghasilkan hasil kompresi yang memuaskan dalam sebagian besar kasus.

FILTERED 

Kebijakan kompresi ini secara preferensial menggunakan algoritma kompresi penyaringan yang berlaku untuk sebagian besar skenario di mana data duplikat ada. Kebijakan kompresi ini dapat membantu mencapai rasio kompresi yang lebih tinggi untuk data teks dan data buatan manusia.

HUFFMAN_ONLY 

Kebijakan kompresi ini hanya menggunakan pengkodean Huffman untuk kompresi. Tidak ada algoritma lain yang digunakan. Kebijakan kompresi ini umumnya digunakan untuk mengompresi data statis. Data terkompresi tersebut dapat didekompresi lebih cepat.

RLE 

Algoritma Run Length Encoding (RLE) sangat efektif dalam mengompresi urutan data berulang, seperti data bitmap.

FIXED 

Kebijakan kompresi ini menggunakan pohon pengkodean yang telah ditentukan untuk melakukan pengkodean Huffman daripada pohon pengkodean yang dibuat secara dinamis berdasarkan data tertentu. Ini dapat mencapai kompresi dan dekompresi kecepatan tinggi. Namun, rasio kompresinya rendah.

DEFAULT_STRATEGY

compression.gzip.window_bits

Ukuran jendela pustaka zlib. Nilai valid: 9 hingga 15.

12

compression.gzip.chunk_size

Ukuran buffer output pustaka zlib.

4096

hostNetwork

Menentukan apakah pod gateway ASM diizinkan mengakses namespace jaringan host. Nilai valid:

  • true: Pod gateway ASM diizinkan menggunakan namespace jaringan host.

  • false: Pod gateway ASM tidak diizinkan menggunakan namespace jaringan host.

false

dnsPolicy

Kebijakan Domain Name System (DNS) yang dikonfigurasikan untuk pod gateway ASM. Untuk informasi lebih lanjut tentang kebijakan DNS, lihat DNS untuk Layanan dan Pod.

ClusterFirst

cpu.targetAverageUtilization

Penggunaan CPU yang diharapkan ketika HPA diaktifkan. Nilai valid: 1 hingga 100. Jika penggunaan memori melebihi nilai ini, jumlah replika pod meningkat. Jika penggunaan memori kurang dari nilai ini, jumlah replika pod berkurang.

Tidak ada

memory.targetAverageUtilization

Penggunaan memori yang diharapkan ketika HPA diaktifkan. Nilai valid: 1 hingga 100. Jika penggunaan memori melebihi nilai ini, jumlah replika pod meningkat. Jika penggunaan memori kurang dari nilai ini, jumlah replika pod berkurang.

Tidak ada

maxReplicas

Jumlah maksimum replika pod yang dapat diskalakan oleh fitur HPA untuk gateway ASM. Nilai bidang ini harus bilangan bulat positif.

Tidak ada

minReplicas

Jumlah minimum replika pod yang dapat diskalakan oleh fitur HPA untuk gateway ASM. Nilainya adalah bilangan bulat positif. Nilai minimumnya adalah 1.

Tidak ada

nodeSelector

Menentukan label node tempat pod gateway ASM berada. Anda dapat menyesuaikan key dan value. Contoh:

nodeSelector:
  key1: value1

Tidak ada

affinity

Anda dapat mengonfigurasi afinitas node untuk menjadwalkan pod gateway ASM ke node. Untuk informasi lebih lanjut, lihat Afinitas dan Anti-Afinitas.

Tidak ada

tolerations

Anda dapat mengonfigurasi toleransi untuk pod gateway ASM untuk mentolerir noda pada node. Untuk informasi lebih lanjut, lihat Noda dan Toleransi.

Tidak ada

Bidang yang perubahannya akan menyebabkan restart bergulir gateway ASM

Mengubah bidang berikut akan menyebabkan restart bergulir gateway ASM. Berhati-hatilah saat mengubah bidang ini.

  • env

  • ports (Jika versi instance ASM lebih awal dari 1.16, mengubah bidang ini akan menyebabkan gateway ASM restart secara bergulir. Jika versi instance ASM adalah 1.16 atau lebih baru, mengubah bidang ini tidak akan menyebabkan gateway ASM restart secara bergulir.)

  • configVolumes

  • resources

  • secretVolumes

  • podLabels

  • podAnnotations

  • kernel.enabled

  • kernel.parameters

  • hostNetwork

  • dnsPolicy

  • nodeSelector (tergantung penjadwalan)

  • affinity (tergantung penjadwalan)

  • tolerations (tergantung penjadwalan)

Struktur Go untuk gateway

Perluas untuk Melihat File Contoh

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 keadaan yang diinginkan dari 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 adalah Skema untuk API istiogateways
// +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 berisi daftar IstioGateway
type IstioGatewayList struct {
    metav1.TypeMeta `json:",inline"`
    metav1.ListMeta `json:"metadata,omitempty"`
    Items           []IstioGateway `json:"items"`
}