Service Mesh (ASM) は、IstioGateway (apiVersion: istio.alibabacloud.com/v1beta1) という名前のカスタムリソース定義 (CRD) を使用して、ゲートウェイを宣言的に管理します。組み込みのコントローラーがこの CRD の変更を監視し、コントローラーが実行されている Kubernetes クラスター内の対応する Service、Deployment、および ServiceAccount を調整します。
このトピックでは、ASM ゲートウェイの CRD フィールドリファレンス、設定例、および Go 構造体の定義について説明します。
前提条件
Container Service for Kubernetes (ACK) クラスターが ASM インスタンスに追加されていること。詳細については、「ASM インスタンスへのクラスターの追加」をご参照ください。
ASM ゲートウェイは istio-system 名前空間にデプロイしてください。ゲートウェイは起動時にこの名前空間から設定を読み取ります。Istio のバージョンが 1.6 以降の場合、ゲートウェイを別の名前空間にデプロイすると、必要な設定を取得できずに起動に失敗します。
設定例
最小構成のイングレスゲートウェイ
次の YAML は、デフォルトのリソース制限を持つ基本的なイングレスゲートウェイを作成します:
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<your-cluster-id> を、ご利用の ASM インスタンスによって管理されているクラスターの実際の ID に置き換えてください。
完全なイングレスゲートウェイ
この例には、環境変数、Pod ラベル、リソース制限、ローリングアップデート設定、クラスターごとのオーバーライドなどのオプションフィールドが含まれています:
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.smallGo クライアントを使用してイングレスゲートウェイをプログラムで管理するには、「ASM ゲートウェイの Go 構造体」をご参照ください。
エグレスゲートウェイ
エグレスゲートウェイは、メッシュ内のすべてのアウトバウンドトラフィックをルーティングします。外部ロードバランサーは不要なため、通常 serviceType は ClusterIP に設定されます。
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コンソールからのゲートウェイ作成
ASM コンソールにログインします。左側のナビゲーションウィンドウで、[Service Mesh] > [メッシュ管理] を選択します。
[メッシュ管理] ページで、ASM インスタンスの名前をクリックします。
左側のナビゲーションウィンドウで、[ASM ゲートウェイ] > [イングレスゲートウェイ] (または [エグレスゲートウェイ]) を選択します。
[YAML から作成] をクリックします。
[作成] ページで、[名前] フィールドに名前を入力し、[名前空間] ドロップダウンリストから [istio-system] を選択し、YAML 設定を貼り付けてから [作成] をクリックします。
ゲートウェイの確認
ゲートウェイを作成した後、Service と Pod が実行中であることを確認します。
ACK コンソールにログインします。ナビゲーションウィンドウで、[クラスター] をクリックします。
クラスター名をクリックします。左側のペインで、[ネットワーク] > [サービス] を選択します。
[名前空間] ドロップダウンリストから [istio-system] を選択し、ゲートウェイ Service が存在することを確認します。
左側のペインで、[ワークロード] > [Pod] を選択します。[名前空間] ドロップダウンリストから [istio-system] を選択し、ゲートウェイ Pod が実行中であることを確認します。
CRD フィールドリファレンス
主要フィールド
| フィールド | タイプ | 説明 | デフォルト |
|---|---|---|---|
metadata.name | string | ASM ゲートウェイの名前。生成される Kubernetes Service と Deployment は、どちらも istio-{metadata.name} という名前になります。 | なし |
metadata.namespace | string | ASM ゲートウェイの名前空間。生成される Service と Deployment はこの名前空間に配置されます。 重要 Istio 1.6 以降では | istio-system |
gatewayType | string | ゲートウェイのタイプ。有効な値: ingress (インバウンドトラフィックをルーティング) および egress (アウトバウンドトラフィックをルーティング)。 | ingress |
clusterIds | string[] | ゲートウェイをデプロイするクラスターの ID。各クラスターは、現在の ASM インスタンスによって管理されている必要があります。 | なし |
Service の設定
| フィールド | タイプ | 説明 | デフォルト |
|---|---|---|---|
serviceType | 文字列 | Kubernetes サービスのタイプ。有効な値:LoadBalancer、NodePort、ClusterIP。エグレスゲートウェイでは、通常 ClusterIP に設定します。重要 登録済みクラスターを使用し、この値を | LoadBalancer |
loadBalancerClass | 文字列 | サービスの loadBalancerClass。serviceType が LoadBalancer の場合にのみ有効です。ASM v1.18 以降が必要です。詳細については、「NLB インスタンスをイングレスゲートウェイに関連付ける」をご参照ください。 | None |
externalTrafficPolicy | 文字列 | インバウンドトラフィックをノードローカルのエンドポイントにルーティングするか、クラスター全体のエンドポイントにルーティングするかを決定します。有効な値:Cluster、Local。イングレスゲートウェイにのみ適用されます。 | Cluster |
serviceAnnotations | map[string]string | ゲートウェイサービスに付与されるアノテーション。serviceType が LoadBalancer に設定されたゲートウェイにのみ適用されます。エグレスゲートウェイでは通常設定しません。一般的なアノテーションについては、「アノテーションを使用して負荷分散を設定する」をご参照ください。 | None |
serviceLabels | map[string]string | ゲートウェイサービスに付与されるラベル。 | None |
ports | ServicePort[] | ゲートウェイによって公開されるサービスポート。各エントリには name、port、targetPort、およびオプションで protocol が含まれます。説明 v1.9.7.107 より前のバージョンでは、 | None |
Pod の設定
| フィールド | タイプ | 説明 | デフォルト |
|---|---|---|---|
replicaCount | int32 | Pod レプリカの数。 | 1 |
resources | ResourceRequirements | CPU とメモリのリソースリクエストおよびリミット。 | リミット: cpu 2、メモリ 2G。リクエスト: cpu 200m、メモリ 256Mi |
env | EnvVar[] | ゲートウェイコンテナに挿入される環境変数。 | なし |
podLabels | map[string]string | ゲートウェイ Pod のラベル。 | なし |
podAnnotations | map[string]string | ゲートウェイ Pod のアノテーション。 | なし |
nodeSelector | map[string]string | ゲートウェイ Pod を特定のノードにスケジュールするために使用されるノードラベル。 | なし |
affinity | Affinity | ゲートウェイ Pod をスケジューリングするためのノードアフィニティルール。詳細については、Kubernetes ドキュメントの「Affinity and anti-affinity」をご参照ください。 | なし |
tolerations | Toleration[] | ゲートウェイ Pod が一致する Taint を持つノードにスケジューリングされることを許可する Toleration。詳細については、Kubernetes ドキュメントの「Taints and Tolerations」をご参照ください。 | なし |
hostNetwork | bool | ゲートウェイ Pod がホストのネットワーク名前空間を共有するかどうか。 | false |
dnsPolicy | string | ゲートウェイ Pod の DNS ポリシー。詳細については、Kubernetes ドキュメントの「DNS for Services and Pods」をご参照ください。 | ClusterFirst |
runAsRoot | bool | ゲートウェイコンテナが root として実行されるかどうか。 | false |
readinessProbe | ReadinessProbeConfiguration | ゲートウェイ Pod の Readiness プローブ設定。 | なし |
Deployment の設定
| フィールド | タイプ | 説明 | デフォルト |
|---|---|---|---|
rollingMaxSurge | string | ローリングアップデート中に、望ましいレプリカ数を超えることができる Pod の最大数。絶対値またはパーセンテージで指定します。 | "100%" |
rollingMaxUnavailable | string | ローリングアップデート中に、利用不可になる可能性がある Pod の最大数。絶対値またはパーセンテージで指定します。 | "25%" |
ボリュームマウント
| フィールド | タイプ | 説明 | デフォルト |
|---|---|---|---|
configVolumes | ConfigVolume[] | ゲートウェイ Pod にマウントされる ConfigMap ボリューム。各エントリには name、configMapName、および mountPath が含まれます。 | なし |
secretVolumes | SecretVolume[] | ゲートウェイ Pod にマウントされる Secret ボリューム。各エントリには name、secretName、および mountPath が含まれます。 | なし |
ConfigMap ボリュームの例:
configVolumes:
- name: config-volume-lua
configMapName: lua-libs
mountPath: /var/lib/luaSecret ボリュームの例:
secretVolumes:
- name: myexample-customingressgateway-certs
secretName: istio-myexample-customingressgateway-certs
mountPath: /etc/istio/myexample-customingressgateway-certsHorizontal Pod Autoscaling (HPA)
| フィールド | タイプ | 説明 | デフォルト |
|---|---|---|---|
cpu.targetAverageUtilization | int32 | 目標 CPU 使用率 (1〜100)。使用率がこのしきい値を超えると、HPA はスケールアップします。使用率が下回ると、HPA はスケールダウンします。 | なし |
memory.targetAverageUtilization | int32 | 目標メモリ使用率 (1〜100)。CPU と同じスケーリング動作に従います。 | なし |
maxReplicas | int32 | HPA がスケールアップできるレプリカの最大数。正の整数である必要があります。 | なし |
minReplicas | int32 | HPA がスケールダウンできるレプリカの最小数。正の整数である必要があります (最小値: 1)。 | なし |
クラスターごとのオーバーライド
overrides フィールドを使用して、clusterIds に 2 つ以上のクラスターが含まれている場合にクラスターごとに異なる設定を適用します。
| フィールド | タイプ | 説明 | デフォルト |
|---|---|---|---|
overrides | map[string]Configuration | キーが clusterIds フィールドのクラスター ID で、値がクラスター固有の設定を含むマップ。 | なし |
以下のフィールドはクラスターごとにオーバーライドできます:
serviceAnnotationspodAnnotationsresourcesreplicaCountHPA 関連フィールド (ASM v1.16 以降)
serviceType(ASM v1.16 以降)
例:
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カーネルチューニング
| フィールド | タイプ | 説明 | デフォルト |
|---|---|---|---|
kernel.enabled | bool | カスタムカーネルパラメータをゲートウェイ Pod に適用するかどうか。 | false |
kernel.parameters | KernelParameters | チューニングする Sysctl パラメータ。すべての値は文字列である必要があります。数字は二重引用符で囲んでください (例: net.core.somaxconn: "65535")。 | なし |
サポートされているカーネルパラメータ:
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
一部のカーネルパラメータは、ホストのカーネルバージョンによっては無効になる場合があります。ゲートウェイ Pod がエラーを報告した場合は、kubectl describe pod を実行して無効なパラメータを特定し、それらを削除してください。圧縮 (イングレスゲートウェイのみ)
| フィールド | タイプ | 説明 | デフォルト |
|---|---|---|---|
compression.enabled | bool | レスポンス圧縮を有効にするかどうか。 | false |
compression.gzip | GzipConfiguration | Gzip 圧縮設定。圧縮を有効にするには必須です。すべてのデフォルト値を使用するには gzip: {} に設定します。 | なし |
compression.content_type | string[] | Content-Type ヘッダーで識別される、圧縮対象のコンテントタイプ (例: text/html、application/json)。 | なし |
compression.min_content_length | uint32 | Content-Length ヘッダーに基づき、圧縮をトリガーする最小レスポンスボディサイズ (バイト単位)。 | 30 |
compression.disable_on_etag_header | bool | true の場合、ETag ヘッダーを含むレスポンスの圧縮を無効にします。 | false |
compression.remove_accept_encoding_header | bool | true の場合、リクエストをアップストリームサーバーに転送する前に Accept-Encoding ヘッダーを削除します。 | false |
Gzip 設定
| フィールド | タイプ | 説明 | デフォルト |
|---|---|---|---|
compression.gzip.memory_level | uint32 | zlib ライブラリのメモリ使用レベル (1〜9)。値が大きいほどメモリ使用量は増えますが、圧縮速度と品質が向上します。 | 5 |
compression.gzip.compression_level | string | zlib ライブラリの圧縮レベル。有効な値: COMPRESSION_LEVEL_1 から COMPRESSION_LEVEL_9、DEFAULT_COMPRESSION、BEST_SPEED、BEST_COMPRESSION。レベル 1 は BEST_SPEED に相当します。レベル 9 は BEST_COMPRESSION に相当します。レベル 6 は DEFAULT_COMPRESSION に相当します。 | DEFAULT_COMPRESSION |
compression.gzip.compression_strategy | string | zlib ライブラリの圧縮ストラテジー。有効な値: DEFAULT_STRATEGY、FILTERED、HUFFMAN_ONLY、RLE、FIXED。 | DEFAULT_STRATEGY |
compression.gzip.window_bits | uint32 | zlib ライブラリのウィンドウサイズ (9〜15)。値が大きいほど圧縮率は向上しますが、メモリ使用量が増加します。 | 12 |
compression.gzip.chunk_size | uint32 | zlib ライブラリの出力バッファーサイズ。 | 4096 |
圧縮ストラテジーの詳細:
| ストラテジー | ユースケース |
|---|---|
DEFAULT_STRATEGY | 汎用圧縮。ほとんどのデータに適しています。 |
FILTERED | テキストや生成データなど、繰り返しパターンの多いデータ。 |
HUFFMAN_ONLY | 高速な展開が優先される静的データ。 |
RLE | ビットマップなど、繰り返されるバイトの長いシーケンスを持つデータ。 |
FIXED | 圧縮率を犠牲にして、高速な圧縮と展開のために事前定義されたハフマン符号木を使用します。 |
ローリングリスタートをトリガーするフィールド
以下のいずれかのフィールドを変更すると、ゲートウェイ Pod のローリングリスタートが発生します。本番環境での変更は慎重に計画してください。
| フィールド | 注意 |
|---|---|
env | |
ports | ASM v1.16 以降では、ports の変更はリスタートをトリガーしなくなりました。 |
configVolumes | |
resources | |
secretVolumes | |
podLabels | |
podAnnotations | |
kernel.enabled | |
kernel.parameters | |
hostNetwork | |
dnsPolicy | |
nodeSelector | リスタートは Pod のスケジューリングに依存します。 |
affinity | リスタートは Pod のスケジューリングに依存します。 |
tolerations | リスタートは Pod のスケジューリングに依存します。 |