ASM提供了一個kind
為IstioGateway
、apiVersion
為istio.alibabacloud.com/v1beta1
的自定義資源定義CRD(Custom Resource Definition),并提供了相應的Controller。通過監聽該CRD資源變化事件,對應的Controller可以在Kubernetes集群中同步對應的Service、Deployment以及相關聯的ServiceAccount等。本文介紹ASM網關CRD的配置示例和字段說明。
配置示例
前提條件
新增ASM網關必須創建在命名空間istio-system中,以便獲取相關的配置信息。在Istio1.6及以上的版本中,部署到其他命名空間,會因為不能獲取相關配置而導致ASM網關無法正常啟動。
示例一:使用KubeAPI管理入口網關
登錄ASM控制臺,在左側導航欄,選擇 。
在網格管理頁面,單擊目標實例名稱,然后在左側導航欄,選擇 。
在入口網關頁面,單擊使用YAML創建。
在創建頁面,輸入網關的名稱,選擇命名空間為istio-system,配置如下YAML,然后單擊創建。
關于字段的說明,請參見CRD字段說明。
apiVersion: istio.alibabacloud.com/v1beta1 kind: IstioGateway metadata: name: "myexample-customingressgateway" namespace: "istio-system" spec: clusterIds: - "${實際的集群ID}" - "${實際的集群ID}" # ASM網關支持部署在多個集群中。 cpu: targetAverageUtilization: 80 env: - name: "envname1" value: "envvalue1" externalTrafficPolicy: Local gatewayType: ingress podLabels: key1: value1 ports: - name: status-port port: 15020 targetPort: 15020 - name: http2 port: 80 targetPort: 80 - name: https port: 443 targetPort: 443 - name: tls port: 15443 targetPort: 15443 replicaCount: 1 resources: limits: cpu: '2' memory: 2G requests: cpu: 200m memory: 256Mi # - name: config-volume-lua # configMapName: lua-libs # mountPath: /var/lib/lua # secretVolumes: # - name: myexample-customingressgateway-certs # secretName: istio-myexample-customingressgateway-certs # mountPath: /etc/istio/myexample-customingressgateway-certs serviceType: LoadBalancer serviceAnnotations: service.beta.kubernetes.io/alicloud-loadbalancer-address-type: internet serviceLabels: serviceLabelKey1: "serviceLabelValue1" podAnnotations: podAnnotationsKey1: "podAnnotationsValue1" rollingMaxSurge: "100%" rollingMaxUnavailable: "25%" overrides: cluster1Id: replicaCount: 1 resources: limits: cpu: '2' memory: 2G requests: cpu: 200m memory: 256Mi serviceAnnotations: service.beta.kubernetes.io/alicloud-loadbalancer-address-type: internet service.beta.kubernetes.io/alibaba-cloud-loadbalancer-spec: "slb.s1.small" cluster2Id: replicaCount: 2 resources: limits: cpu: '4' memory: 4G requests: cpu: 400m memory: 512Mi serviceAnnotations: service.beta.kubernetes.io/alicloud-loadbalancer-address-type: internet service.beta.kubernetes.io/alibaba-cloud-loadbalancer-spec: "slb.s2.small"
說明若您需要使用Kubernetes Client操作入口網關,請參見網關Go Struct實現。
查看入口網關的服務信息。
登錄容器服務管理控制臺,在左側導航欄選擇集群。
在集群列表頁面,單擊目標集群名稱,然后在左側導航欄,選擇 。
在服務頁面上方,從命名空間下拉列表中,選擇istio-system。
在服務列表中,單擊目標服務名稱,查看入口網關的服務信息。
查看入口網關的Pod信息。
登錄容器服務管理控制臺,在左側導航欄選擇集群。
在集群列表頁面,單擊目標集群名稱,然后在左側導航欄,選擇 。
在容器組頁面上方,從命名空間下拉列表中,選擇istio-system。
在Pod列表中,單擊目標Pod名稱,查看入口網關的Pod信息。
示例二:使用KubeAPI管理出口網關
ASM提供出口網關服務,為網格內應用提供統一的流量出口。
登錄ASM控制臺,在左側導航欄,選擇 。
在網格管理頁面,單擊目標實例名稱,然后在左側導航欄,選擇 。
在出口網關頁面,單擊使用YAML創建。
在創建頁面,輸入出口網關的名稱,選擇命名空間為istio-system,配置如下YAML,然后單擊創建。
關于字段的說明,請參見CRD字段說明。
查看出口網關的服務信息。
登錄容器服務管理控制臺,在左側導航欄選擇集群。
在集群列表頁面,單擊目標集群名稱,然后在左側導航欄,選擇 。
在服務頁面,從命名空間下拉列表中選擇istio-system。
在服務列表中,單擊目標服務名稱,查看出口網關的服務信息。
查看出口網關的Pod信息。
登錄容器服務管理控制臺,在左側導航欄選擇集群。
在集群列表頁面,單擊目標集群名稱,然后在左側導航欄,選擇 。
在容器組頁面,從命名空間下拉列表中選擇istio-system。
在Pod列表中,單擊目標Pod名稱,查看出口網關的Pod信息。
CRD字段說明
字段 | 說明 | 默認值 |
metadata.name | 名稱。生成的Kubernetes Service和Deployment名稱為istio-{該值}。 | 無 |
metadata.namespace | 命名空間,生成的Kubernetes Service和Deployment所在的命名空間。 重要 為兼容Istio 1.6及以后的版本,該命名空間必須為istio-system。 | istio-system |
clusterIds | 數組類型。將部署網關的集群ID,這些集群隸屬于當前網格實例所管理。 | 無 |
env | 數組類型。網關Pod的環境變量。 | 無 |
externalTrafficPolicy | 表示此服務是否希望將外部流量路由到節點本地或集群范圍的端點,取值為Cluster或Local。 說明 該字段僅適用于入口網關。 | Cluster |
ports | 數組類型。網關Pod定義的端口和協議列表。例如:
說明 1.9.7.107之前的版本,protocol屬性字段未做具體化聲明,您需要統一聲明配置為TCP。 | 無 |
gatewayType | 網關類型,可以指定為ingress或egress。
| ingress |
replicaCount | 副本數。 | 1 |
configVolumes | 網關Pod所使用的ConfigMap掛載卷,例如:
| 無 |
resources | 網關Pod的資源配置。 |
|
secretVolumes | 網關Pod所使用到的Secret掛載卷,例如:
| 無 |
serviceType | 網關的服務類型,取值為LoadBalancer、NodePort或者ClusterIP。出口網關通常設置為ClusterIP。 重要 如果您選擇的數據面集群是注冊集群且該字段為LoadBalancer時,請確保集群支持LoadBalancer類型的Service,避免ASM網關創建失敗。 | LoadBalancer |
loadBalancerClass | 為網關服務指定loadBalancerClass,僅當serviceType為LoadBalancer類型時有效。該字段從ASM 1.18版本開始支持。更多信息,請參見在ASM入口網關中使用網絡型負載均衡NLB。 | 無 |
serviceAnnotations | 網關服務的Annotation定義,例如 說明 僅適用于serviceType為LoadBalancer類型的網關,出口網關通常不配置。 | 無 |
serviceLabels | 網關服務的Label定義。 | 無 |
podLabels | 網關Pod的Label定義。 | 無 |
podAnnotations | 網關Pod的Annotation定義。 | 無 |
rollingMaxSurge | 滾動更新過程中運行操作期望副本數的最大Pod數。取值可以為絕對數值或百分數。 | "100%" |
rollingMaxUnavailable | 滾動更新過程中不可用的最大Pod數。取值為絕對數值或百分數。 | "25%" |
overrides | 當clusterIds指定了2個及以上的集群時,可以針對特定的集群指定不同于上述參數定義的配置值,配置值為Map類型。 說明
| 無 |
kernel.enabled | 是否啟用自定義內核參數。 | false |
kernel.parameters | 內核參數設置,當前支持設置以下內核參數:
說明 ASM支持的內核參數修改項可能因宿主機內核版本不同,而出現部分參數不支持的情況。如果出現這種情況,網格Pod可能會報錯。 您可以通過 所有的內核參數值為字符串格式,因YAML語法會將純數字解析為數值類型,您需要使用半角雙引號("")包裹您的值,例如net.core.somaxconn: "65535"。 | 無 |
compression.enabled | 是否啟用入口網關壓縮能力。 說明 compression相關字段僅適用于入口網關。 | false |
compression.content_type | 需要被壓縮的ContentType列表,例如:
| 無 |
compression.disable_on_etag_header |
| false |
compression.min_content_length | 當ContentLength大于或等于設置的值時,觸發壓縮。 | 30 |
compression.remove_accept_encoding_header |
| false |
compression.gzip | 當前僅支持gzip壓縮格式。若要啟用壓縮,必須填寫該字段。若所有參數保持默認,也需要填寫空結構,例如 | 無 |
compression.gzip.memory_level | zlib內部的內存使用級別。合法值為1~9。取值越大占用內存越多,同時也會帶來更快的壓縮速度和更好的壓縮質量。 | 5 |
compression.gzip.compression_level | zlib的壓縮級別,合法值如下:
說明 BEST_COMPRESSION是最高壓縮質量;BEST_SPEED是最快壓縮速度。其中:
| DEFAULT_COMPRESSION |
compression.gzip.compression_strategy | zlib的壓縮策略,合法值如下:
說明 DEFAULT_STRATEGY 默認的壓縮策略,使用底層默認的行為,在多數情況下都能產生滿意的壓縮結果。 FILTERED 針對大部分存在重復數據的場景,優先使用過濾層壓縮算法。對于一些文本數據和人工生成的數據壓縮率較高。 HUFFMAN_ONLY 只使用哈夫曼編碼進行壓縮,不使用其他壓縮算法。一般用于生成靜態數據,生成的壓縮數據可以更快地解壓縮。 RLE 使用連續相同數據壓縮算法,對于壓縮連續相同的數據非常高效。比如位圖數據等。 FIXED 使用預定義的編碼樹進行哈夫曼編碼,不根據具體數據動態生成編碼樹。這樣的好處是高速壓縮和解壓縮,但壓縮率一般會比較低。 | DEFAULT_STRATEGY |
compression.gzip.window_bits | zlib窗口大小。合法值為9~15。 | 12 |
compression.gzip.chunk_size | zlib輸出緩沖區大小。 | 4096 |
hostNetwork | 主機網絡。
| false |
dnsPolicy | DNS策略。關于dnsPolicy的詳細介紹,請參見DNS for Services and Pods。 | ClusterFirst |
cpu.targetAverageUtilization | 開啟HPA時的CPU目標使用率。取值為1~100。如果超過該值,會增加副本;如果低于該值,會減少副本。 | 無 |
memory.targetAverageUtilization | 開啟HPA時的內存目標使用率。取值為1~100。如果超過該值,會增加副本;如果低于該值,會減少副本。 | 無 |
maxReplicas | HPA調節的最大副本數。取值為正整數。 | 無 |
minReplicas | HPA調節的最小副本數。取值為正整數,最小值為1。 | 無 |
nodeSelector | 指定網關Pod所在的節點。在該字段下,您可以自定義Key和Value的值,示例如下:
| 無 |
affinity | 通過配置節點親和性來指定網關Pod所在的節點。更多信息,請參見親和性與反親和性。 | 無 |
tolerations | 和節點Taint配合使用。更多信息,請參見污點和容忍度。 | 無 |
導致網關滾動重啟的字段
以下字段變更會導致網關滾動重啟,請謹慎操作。
env
ports(ASM實例版本為1.16以下會導致網關重啟,1.16及以上不會重啟)
configVolumes
resources
secretVolumes
podLabels
podAnnotations
kernel.enabled
kernel.parameters
hostNetwork
dnsPolicy
nodeSelector(視調度情況而定)
affinity(視調度情況而定)
tolerations(視調度情況而定)
網關Go Struct實現
package v1beta1
import (
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)
type GatewayType string
type ConfigState string
const (
GatewayTypeIngress GatewayType = "ingress"
GatewayTypeEgress GatewayType = "egress"
)
// IstioGatewaySpec defines the desired state of Istio
// +k8s:openapi-gen=true
type IstioGatewaySpec struct {
// +kubebuilder:validation:Enum=ingress;egress
GatewayType GatewayType `json:"gatewayType,omitempty"`
IstioGatewayBasicConfiguration `json:",inline"`
ClusterIds []string `json:"clusterIds,omitempty"`
clusterId string `json:"clusterId,omitempty"`
Overrides map[string]IstioGatewayBasicConfiguration `json:"overrides,omitempty"`
}
type KernelParameters struct {
NetCoreSoMaxConn *string `json:"net.core.somaxconn,omitempty"`
NetCoreNetdevMaxBacklog *string `json:"net.core.netdev_max_backlog,omitempty"`
NetIpv4TcpRMem *string `json:"net.ipv4.tcp_rmem,omitempty"`
NetIpv4TcpWMem *string `json:"net.ipv4.tcp_wmem,omitempty"`
NetIpv4IpLocalPortRange *string `json:"net.ipv4.ip_local_port_range,omitempty"`
NetIpv4TcpFinTimeout *string `json:"net.ipv4.tcp_fin_timeout,omitempty"`
NetIpv4TcpTwTimeout *string `json:"net.ipv4.tcp_tw_timeout,omitempty"`
NetIpv4TcpTwReuse *string `json:"net.ipv4.tcp_tw_reuse,omitempty"`
NetIpv4TcpTwRecycle *string `json:"net.ipv4.tcp_tw_recycle,omitempty"`
NetIpv4TcpTimestamps *string `json:"net.ipv4.tcp_timestamps,omitempty"`
NetIpv4TcpRetries2 *string `json:"net.ipv4.tcp_retries2,omitempty"`
NetIpv4TcpSlowStartAfterIdle *string `json:"net.ipv4.tcp_slow_start_after_idle,omitempty"`
NetIpv4TcpMaxOrphans *string `json:"net.ipv4.tcp_max_orphans,omitempty"`
NetIpv4TcpMaxSynBacklog *string `json:"net.ipv4.tcp_max_syn_backlog,omitempty"`
NetIpv4TcpNoMetricsSave *string `json:"net.ipv4.tcp_no_metrics_save,omitempty"`
NetIpv4TcpAutocorking *string `json:"net.ipv4.tcp_autocorking,omitempty"`
KernelPrintk *string `json:"kernel.printk,omitempty"`
VmSwappiness *string `json:"vm.swappiness,omitempty"`
}
type KernelConfiguration struct {
Enabled *bool `json:"enabled,omitempty"`
Parameters KernelParameters `json:"parameters,omitempty"`
}
type GzipCompressorConfiguration struct {
MemoryLevel *uint32 `json:"memory_level,omitempty"`
CompressionLevel *string `json:"compression_level,omitempty"`
CompressionStrategy *string `json:"compression_strategy,omitempty"`
WindowBits *uint32 `json:"window_bits,omitempty"`
ChunkSize *uint32 `json:"chunk_size,omitempty"`
}
type CompressorConfiguration struct {
Enabled *bool `json:"enabled,omitempty"`
MinContentLength *uint32 `json:"min_content_length,omitempty"`
ContentType *[]string `json:"content_type,omitempty"`
DisableOnETagHeader *bool `json:"disable_on_etag_header,omitempty"`
RemoveAcceptEncodingHeader *bool `json:"remove_accept_encoding_header,omitempty"`
Gzip *GzipCompressorConfiguration `json:"gzip,omitempty"`
}
type ReadinessProbeConfiguration struct {
FailureThreshold int32 `json:"failureThreshold,omitempty"`
PeriodSeconds int32 `json:"periodSeconds,omitempty"`
SuccessThreshold int32 `json:"successThreshold,omitempty"`
}
// +k8s:openapi-gen=true
type IstioGatewayBasicConfiguration struct {
ReplicaCount int32 `json:"replicaCount,omitempty"`
AutoscaleEnabled bool `json:"autoscaleEnabled,omitempty"`
MinReplicas int32 `json:"minReplicas,omitempty"`
MaxReplicas int32 `json:"maxReplicas,omitempty"`
// +kubebuilder:validation:Enum=ClusterIP;NodePort;LoadBalancer
ServiceType corev1.ServiceType `json:"serviceType,omitempty"`
LoadBalancerIP string `json:"loadBalancerIP,omitempty"`
ExternalTrafficPolicy string `json:"externalTrafficPolicy,omitempty"`
ServiceAnnotations map[string]string `json:"serviceAnnotations,omitempty"`
PodAnnotations map[string]string `json:"podAnnotations,omitempty"`
ServiceLabels map[string]string `json:"serviceLabels,omitempty"`
PodLabels map[string]string `json:"podLabels,omitempty"`
Resources *corev1.ResourceRequirements `json:"resources,omitempty"`
EnvVars []corev1.EnvVar `json:"env,omitempty"`
Ports []corev1.ServicePort `json:"ports,omitempty"`
MeshExpansionPorts []corev1.ServicePort `json:"meshExpansionPorts,omitempty"`
NodeSelector map[string]string `json:"nodeSelector,omitempty"`
ApplicationPorts string `json:"applicationPorts,omitempty"`
RequestedNetworkView string `json:"requestedNetworkView,omitempty"`
Affinity *corev1.Affinity `json:"affinity,omitempty"`
Tolerations []corev1.Toleration `json:"tolerations,omitempty"`
SecretVolumes []SecretVolume `json:"secretVolumes,omitempty"`
ConfigVolumes []ConfigVolume `json:"configVolumes,omitempty"`
RollingMaxSurge *string `json:"rollingMaxSurge,omitempty"`
RollingMaxUnavailable *string `json:"rollingMaxUnavailable,omitempty"`
CPU HpaCPU `json:"cpu,omitempty"`
Memory HpaMemory `json:"memory,omitempty"`
Kernel KernelConfiguration `json:"kernel,omitempty"`
Compressor CompressorConfiguration `json:"compression,omitempty"`
RunAsRoot *bool `json:"runAsRoot,omitempty"`
Lifecycle *corev1.Lifecycle `json:"lifecycle,omitempty"`
ReadinessProbe ReadinessProbeConfiguration `json:"readinessProbe,omitempty"`
HostNetwork *bool `json:"hostNetwork,omitempty"`
DnsPolicy corev1.DNSPolicy `json:"dnsPolicy,omitempty"`
AutoCreateGatewayYaml *bool `json:"autoCreateGatewayYaml,omitempty"`
}
type SecretVolume struct {
Name string `json:"name,omitempty"`
SecretName string `json:"secretName,omitempty"`
MountPath string `json:"mountPath,omitempty"`
}
type ConfigVolume struct {
Name string `json:"name,omitempty"`
ConfigMapName string `json:"configMapName,omitempty"`
MountPath string `json:"mountPath,omitempty"`
}
// +k8s:openapi-gen=true
type HpaCPU struct {
TargetAverageUtilization *int32 `json:"targetAverageUtilization,omitempty"`
}
// +k8s:openapi-gen=true
type HpaMemory struct {
TargetAverageUtilization *int32 `json:"targetAverageUtilization,omitempty"`
}
// +k8s:openapi-gen=true
type IstioGatewayStatus struct {
// INSERT ADDITIONAL STATUS FIELD - define observed state of cluster
// Important: Run "operator-sdk generate k8s" to regenerate code after modifying this file
// Add custom validation using kubebuilder tags: https://book.kubebuilder.io/beyond_basics/generating_crd.html
Status ConfigState `json:"Status,omitempty"`
GatewayAddress []string `json:"GatewayAddress,omitempty"`
ClusterIdGatewayAddressMap []GatewayAddress `json:"ClusterIdGatewayAddressMap,omitempty"`
ErrorMessage string `json:"ErrorMessage,omitempty"`
}
// +k8s:openapi-gen=true
type GatewayAddress struct {
IPAddress string `json:"ipAddress,omitempty"`
ClusterId string `json:"clusterId,omitempty"`
}
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
// IstioGateway is the Schema for the istiogateways API
// +k8s:openapi-gen=true
// +kubebuilder:subresource:status
type IstioGateway struct {
metav1.TypeMeta `json:",inline"`
metav1.ObjectMeta `json:"metadata,omitempty"`
Spec IstioGatewaySpec `json:"spec,omitempty"`
Status IstioGatewayStatus `json:"status,omitempty"`
}
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
// IstioGatewayList contains a list of IstioGateway
type IstioGatewayList struct {
metav1.TypeMeta `json:",inline"`
metav1.ListMeta `json:"metadata,omitempty"`
Items []IstioGateway `json:"items"`
}