サービス・メッシュ・プロキシ

サービス・メッシュは、すべてのメッシュ・リソースとともにEnvoyプロキシ・サーバーを使用します。

サービス・メッシュとEnvoyプロキシ

Envoyは、クラウド・ネイティブ・アプリケーションで使用するために設計されたオープン・ソース・プロキシ・サーバーです。C++で記述されているEnvoyプロキシは、大規模なマイクロサービスおよびサービス・メッシュ・アーキテクチャ用に設計された高パフォーマンスのプロキシ・サーバーです。

Envoyの詳細は、次を参照してください。

ポッド中断予算(PDB)の設定

PDBは、アプリケーションが保持する予定のレプリカの数に対して、アプリケーションが保持できるレプリカの数を指定します。たとえば、.spec.replicas: 5が設定されているデプロイメントには、いつでも5つのポッドが必要です。PDBがminAvailable = 3を設定した場合、エビクションAPIでは、一度に2ポッド以下の任意の中断が可能です。

ポッドの「意図」数は、それらのポッドを管理しているワークロード・リソースの.spec.replicas設定から計算されます。コントロール・プレーンは、ポッドの.metadata.ownerReferencesを調べて所有ワークロード・リソースを検出します。

サービス・メッシュは、プロキシのメッシュ化または注入時にPDB設定を尊重します。

PDBの詳細は、Kubernetes: Disruptionsを参照してください

ローリング更新デプロイメント戦略の設定

Kubernetesは、アプリケーションの停止時間を最小限に抑えるために、ローリング更新としてデプロイメント戦略があることを示唆しています。理解するには、K8sの内部を確認します。

  • 再作成:既存のすべてのポッドは、新しいポッドが作成される前に削除されます。
  • RollingUpdate:古いポッドを徐々に新しいポッドに置き換え、ダウンタイムを発生させずにトラフィックを処理し続けます。
    ノート

    このオプションは推奨であり、デフォルトです。

Kubernetesには、戦略タイプがRollingUpdateの場合に活用する次のパラメータが用意されています。

  • .spec.strategy.rollingUpdate.maxUnavailable:更新プロセス中に使用できないポッドの最大数。この値は、レプリカ数の絶対数またはパーセンテージにできます。絶対数は、端数処理によってパーセントから計算されます。デフォルトは25%です。
  • .spec.strategy.rollingUpdate.maxSurge:目的のポッド数に作成できるポッドの最大数。この値には、絶対数またはレプリカ数のパーセンテージを指定できます。絶対数は、端数処理によってパーセントから計算されます。デフォルトは25%です。
ノート

maxSurgemaxUnavailableの両方を同時に0にすることはできません。

また、Kubernetesのサービス・コンテナでreadinessProbeを構成して、トラフィックをポッドに送信するかどうかを決定します。

ノート

ポッド削除プロセスでは、ローリング更新戦略は考慮されません。

自動プロキシ・アップグレード

アプリケーション・ポッドに注入されるプロキシは、新しいプロキシ・バージョンのリリースでデフォルトで自動的に更新されます。

アップグレード・プロセス中に、システムはポッドを削除し、新しいバージョンのプロキシ・サイドカーで再作成します。このポッド削除プロセスでは、ポッド/デプロイメントに定義されているPDBが考慮されます。

自動プロキシ・アップグレードの無効化

アプリケーションによっては、プロキシを自動的に更新しない場合があります。AUTO_UPGRADE_PROXY_VERSIONプロパティを追加し、<oci-service-mesh-operator>ネームスペースに存在するoci-service-operator-servicemesh-configという名前のConfigMapfalseに設定することで、自動プロキシ更新を無効にするオプションがあります。

apiVersion: v1
kind: ConfigMap
metadata:
  name: oci-service-operator-servicemesh-config
  namespace: <oci-service-mesh-operator>
data:
    SIDECAR_IMAGE: iad.ocir.io/axoxdievda5j/oke-public-mesh-proxy:1.0.1
    AUTO_UPGRADE_PROXY_VERSION: false

または、この構成を生成して適用するには、次のスクリプトを使用して変更を行います。

# Get the current config map
kubectl get configmap oci-service-operator-servicemesh-config -n ${OPERATOR_NAMESPACE} -o yaml > oci-service-operator-configmap.yaml
 
# get current sidecar_image
SIDECAR_IMAGE=$(cat oci-service-operator-configmap.yaml | grep "SIDECAR_IMAGE:" | sed "s/.*SIDECAR_IMAGE: //")
 
# update the sidecar image and auto update property
echo -e "data:\n  AUTO_UPDATE_PROXY_VERSION: \"false\"\n  SIDECAR_IMAGE: \""${SIDECAR_IMAGE}"\"" >> oci-service-operator-configmap.yaml
 
# re-upload the file
kubectl replace -f oci-service-operator-configmap.yaml

手動プロキシ更新

自動アップグレードを無効にして、プロキシを手動で更新する場合は、次の手順を実行します。

ノート

outdatedProxyConnectionメトリックを使用して、古いバージョンのプロキシを実行しているかどうかを判断します。このメトリックは、古いバージョンを実行しているプロキシの数を生成します。
  1. AUTO_UPGRADE_PROXY_VERSIONプロパティをtrueに設定します。この構成を生成して適用するには、次のスクリプトを使用します。
    # Get the current config map
    kubectl get configmap oci-service-operator-servicemesh-config -n ${OPERATOR_NAMESPACE} -o yaml > oci-service-operator-configmap.yaml
     
    # get current sidecar_image
    SIDECAR_IMAGE=$(cat oci-service-operator-configmap.yaml | grep "SIDECAR_IMAGE:" | sed "s/.*SIDECAR_IMAGE: //")
     
    # update the sidecar image and auto update property
    echo -e "data:\n  AUTO_UPDATE_PROXY_VERSION: \"true\"\n  SIDECAR_IMAGE: \""${SIDECAR_IMAGE}"\"" >> oci-service-operator-configmap.yaml
     
    # re-upload the file
    kubectl replace -f oci-service-operator-configmap.yaml
  2. ポッドの削除を確認し、新しいバージョンのプロキシ・サイドカーで再作成します。このポッド削除プロセスでは、ポッド/デプロイメントに定義されているPDBが考慮されます。
  3. すべてのポッドが最新バージョンで再作成されると、OutdatedProxyConnectionメトリックがゼロになります。
  4. AUTO_UPDATE_PROXY_VERSIONプロパティをfalseに設定して自動更新をオフにして無効にします。
重要

サービス・メッシュは、ユーザーが自動プロキシ更新を無効にした日から90日間プロキシ・バージョンをサポートします。ベスト・プラクティスとして、OutdatedProxyConnectionメトリックにアラームを設定し、それに応じてモニターします。
注意

サービス・メッシュ・オペレータは、プロキシ・アップグレード・プロセス中にポッドを削除しようとします。アプリケーションのベスト・プラクティスとして、ポッドにPDBを設定して停止時間を回避します。

プロキシ・バージョンの監視

サービス・メッシュは、oci_servicemeshネームスペースの下で、Oracle Cloud Infrastructure MonitoringのActiveProxyConnectionsおよびOutdatedProxyConnectionsに2つのメトリックを発行します。お客様は、OutdatedProxyConnectionsメトリックを監視して、古いプロキシ・ソフトウェアを実行しているプロキシ/ポッドの数を表示できます。

詳細は、サービス・メッシュ・メトリックを参照してください。

プロキシ・ロギング・レベル

プロキシ・ログはデフォルトで/stdoutに出力されるため、標準のKubernetesログ読取りメカニズムを介してアクセスできます。起動またはプロキシ構成の問題が診断されるように、システムはデフォルトでerrorレベルでプロキシ・ログを有効にします。ユーザーがプロキシロギングを変更する場合は、手動で構成変更が必要です。この構成では、ユーザーが簡単にアクセスできるコンテナのログが提供されます。有効なログ・レベルは、debuginfowarnerroroffです。

servicemesh.oci.oracle.com/proxy-log-level注釈を変更して、プロキシのロギング・レベルを設定します。たとえば、次のコマンドを使用して、ポッドのプロキシ・ログ・レベルをinfoに変更します。

# Patch the deployment with the desired log level annotations
kubectl patch deployment <deployment-name> -n <your-namespace> -p '{"spec": {"template":{"metadata":{"annotations":{"servicemesh.oci.oracle.com/proxy-log-level":"info"}}}} }'

次のコマンドを使用して、イングレス・ゲートウェイ・デプロイメント・ポッドのプロキシ・ログ・レベルをinfoに変更します。

# Annotate the ingressgatewaydeployment resource with the desired log level
kubectl annotate ingressgatewaydeployments <ingress-gateway-deployment-resource-name> -n <your-namespace> servicemesh.oci.oracle.com/proxy-log-level='info' 

# Patch the corresponding deployment created for the ingressgatewaydeployment resource with the desired log level annotations
kubectl patch deployment <deployment-name> -n <your-namespace> -p '{"spec": {"template":{"metadata":{"annotations":{"servicemesh.oci.oracle.com/proxy-log-level":"info"}}}} }'   

プロキシ・ログ・レベルを設定するには、infodebugwarnerroroffなどの別の有効なログ・レベルに置き換えます。