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 インスタンスに追加する場合、メッシュプロキシはデフォルトでネイティブサイドカーモードを使用してデプロイされます。 |
デプロイメントモード | サイドカーコンテナとメインコンテナの両方が | サイドカーコンテナは |
ライフサイクル | メインコンテナと同期できません。個別の管理が必要です。 | メインコンテナと同期します。追加の構成は必要ありません。 |
従来のサイドカーモードで構成されたメッシュプロキシは、アプリケーションコンテナとともにポッド内の通常のコンテナとしてデプロイされ、それぞれに独自のライフサイクルがあります。これにより、次の問題が発生する可能性があります。
アプリケーションコンテナがサイドカープロキシコンテナよりも速く起動した場合、アプリケーションコンテナはインターネットにアクセスできません。この問題を解決するには、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 はネイティブサイドカー定義を削除する可能性があり、作成エラーが発生します。互換性を確保するために、ネイティブサイドカーモードから従来のサイドカーモードに戻す必要がある場合があります。
次の手順を実行します。
kubectl を使用して ASM インスタンスにアクセスします。詳細については、「コントロールプレーンで kubectl を使用して Istio リソースにアクセスする」をご参照ください。
次のコマンドを実行して、
asmmeshconfigリソースの構成を追加します。kubectl patch asmmeshconfig default --type=merge --patch='{"spec":{"enableNativeSidecar":false}}'予期される出力:
asmmeshconfig.istio.alibabacloud.com/default patchedポッドを再起動します。詳細については、「ワークロードの再デプロイ」をご参照ください。
次のコマンドを実行して、ポッドを表示します。
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-proxyがinitContainersフィールドに含まれておらず、メインコンテナとともにcontainersフィールドで構成されていることを示しています。