すべてのプロダクト
Search
ドキュメントセンター

Alibaba Cloud Service Mesh:ネイティブサイドカーモードを使用したメッシュプロキシのデプロイ

最終更新日:Jan 13, 2025

Service Mesh(ASM)でネイティブサイドカーアプローチを使用してクラスター内のアプリケーションにメッシュプロキシをデプロイするには、サイドカーモードとサイドカーレスモードの両方を利用できます。これにより、負荷分散、サービスディスカバリ、トラフィック制御、セキュリティの強化、トラフィックの可観測性などの基盤となるネットワーク機能を管理できます。サイドカーモードでは、メッシュプロキシコンテナとアプリケーションコンテナを同じポッドにデプロイできます。この場合、2 つのコンテナはネットワーク名前空間を共有し、メッシュプロキシはアプリケーションコンテナの送受信トラフィックを透過的にインターセプトして処理できます。このトピックでは、ASM でネイティブサイドカーモードを使用してメッシュプロキシをデプロイする方法について説明します。

従来のサイドカーとネイティブサイドカー

比較項目

従来のサイドカー

ネイティブサイドカー

サポートされている K8s バージョン

コミュニティバージョン 1.4 ~ 1.28。バージョン 1.30 以前の ACK、ACK Serverless、または ACS クラスター

コミュニティバージョン 1.29 以降。バージョン 1.30 以降の ACK、ACK Serverless、または ACS クラスター

サポートされている ASM バージョン

1.22 以前の ASM インスタンス。

バージョン 1.30 以前の Kubernetes クラスター(ACK、ACK Serverless、または ACS クラスター)をバージョン 1.22 以前の ASM インスタンスに追加する場合、メッシュプロキシはデフォルトでネイティブサイドカーモードを使用してデプロイされます。

デプロイメントモード

サイドカーコンテナとメインコンテナの両方が containers フィールドで構成されています。

サイドカーコンテナは initContainers フィールドで構成され、restartPolicy: Always フィールドが含まれています。

ライフサイクル

メインコンテナと同期できません。個別の管理が必要です。

メインコンテナと同期します。追加の構成は必要ありません。

従来のサイドカーモードで構成されたメッシュプロキシは、アプリケーションコンテナとともにポッド内の通常のコンテナとしてデプロイされ、それぞれに独自のライフサイクルがあります。これにより、次の問題が発生する可能性があります。

  • アプリケーションコンテナがサイドカープロキシコンテナよりも速く起動した場合、アプリケーションコンテナはインターネットにアクセスできません。この問題を解決するには、Sidecar Graceful Startup を構成します。サイドカープロキシコンテナの起動が遅い場合、この問題は解決しません。詳細については、「Sidecar Graceful Startup」をご参照ください。

  • サイドカープロキシコンテナがアプリケーションコンテナよりも先にシャットダウンした場合、アプリケーションコンテナはインターネットにアクセスできません。この問題を解決するには、Sidecar Graceful Shutdown を構成します。この場合、ポッドの終了時間が延長される場合があります。詳細については、「Sidecar Graceful Shutdown」をご参照ください。

  • Job を使用してアプリケーションコンテナを作成し、ジョブの実行が停止した直後にコンテナが終了した場合、サイドカープロキシコンテナは引き続き正常に実行され、環境内でポッドの実行が維持されます。

  • サイドカープロキシコンテナの前に実行されている initContainers はインターネットにアクセスできません。この場合、送信トラフィックがサイドカープロキシにリダイレクトされないポートを提供できます。詳細については、「外部アクセスがサイドカープロキシにリダイレクトされないアドレス」をご参照ください。

メッシュプロキシがネイティブサイドカーモードを使用してデプロイされているかどうかを確認するにはどうすればよいですか?

istio-proxy コンテナがポッドの initContainers フィールドに含まれており、restartPolicy: Always フィールドがコンテナ構成に含まれている場合、メッシュプロキシはネイティブサイドカーモードを使用してデプロイされます。次に例を示します。

apiVersion: v1
kind: Pod
metadata:
  name: sleep-xxxxxxxx-xxxxx
  namespace: default
spec:
  containers:
...
      image: 'registry.cn-hangzhou.aliyuncs.com/acs/curl:8.1.2'
      imagePullPolicy: IfNotPresent
      name: sleep
...
  initContainers:
...  
      image: registry-cn-hangzhou-vpc.ack.aliyuncs.com/acs/proxyv2:v1.22.2.35-ge64ec8af-aliyun
      imagePullPolicy: IfNotPresent
      name: istio-proxy
      ports:
        - containerPort: 15090
          name: http-envoy-prom
          protocol: TCP
      restartPolicy: Always  # このフィールドが存在することは、メッシュプロキシがネイティブサイドカーモードを使用してデプロイされていることを示します
...

ネイティブサイドカーモードでは、サイドカープロキシのライフサイクルに関連するすべてのサイドカープロキシの構成は無効です。これらの構成は、ネイティブサイドカープロキシには必要ありません。詳細については、「サイドカープロキシの構成」をご参照ください。

ネイティブサイドカーモードから従来のサイドカーモードに切り替えるにはどうすればよいですか?

バージョン 8 以前の Kubernetes で構成されているクラスターにデプロイされた MutatingWebhook コンポーネントは、ポッド定義を変更できます。たとえば、kubesphere の logsidecar-injector はネイティブサイドカー定義を削除する可能性があり、作成エラーが発生します。互換性を確保するために、ネイティブサイドカーモードから従来のサイドカーモードに戻す必要がある場合があります。

次の手順を実行します。

  1. kubectl を使用して ASM インスタンスにアクセスします。詳細については、「コントロールプレーンで kubectl を使用して Istio リソースにアクセスする」をご参照ください。

  2. 次のコマンドを実行して、asmmeshconfig リソースの構成を追加します。

    kubectl patch asmmeshconfig default --type=merge --patch='{"spec":{"enableNativeSidecar":false}}'

    予期される出力:

    asmmeshconfig.istio.alibabacloud.com/default patched
  3. ポッドを再起動します。詳細については、「ワークロードの再デプロイ」をご参照ください。

  4. 次のコマンドを実行して、ポッドを表示します。

    kubectl get pod sleep-xxxxxxxx-xxxxx -o yaml

    予期される出力:

    apiVersion: v1
    kind: Pod
    metadata:
      name: sleep-xxxxxxxx-xxxxx
      namespace: default
    spec:
      containers:
    ...  
          image: registry-cn-hangzhou-vpc.ack.aliyuncs.com/acs/proxyv2:v1.22.2.35-ge64ec8af-aliyun      
          name: istio-proxy
          ports:
            - containerPort: 15090
              name: http-envoy-prom
              protocol: TCP
    ...
          image: 'registry.cn-hangzhou.aliyuncs.com/acs/curl:8.1.2'
          imagePullPolicy: IfNotPresent
          name: sleep
    ...

    結果は、サイドカープロキシコンテナ istio-proxyinitContainers フィールドに含まれておらず、メインコンテナとともに containers フィールドで構成されていることを示しています。