サービス・メッシュ・プロキシ
サービス・メッシュは、すべてのメッシュ・リソースとともに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%です。
maxSurge
とmaxUnavailable
の両方を同時に0にすることはできません。また、Kubernetesのサービス・コンテナでreadinessProbe
を構成して、トラフィックをポッドに送信するかどうかを決定します。
ポッド削除プロセスでは、ローリング更新戦略は考慮されません。
自動プロキシ・アップグレード
アプリケーション・ポッドに注入されるプロキシは、新しいプロキシ・バージョンのリリースでデフォルトで自動的に更新されます。
アップグレード・プロセス中に、システムはポッドを削除し、新しいバージョンのプロキシ・サイドカーで再作成します。このポッド削除プロセスでは、ポッド/デプロイメントに定義されているPDBが考慮されます。
自動プロキシ・アップグレードの無効化
アプリケーションによっては、プロキシを自動的に更新しない場合があります。AUTO_UPGRADE_PROXY_VERSION
プロパティを追加し、<oci-service-mesh-operator>
ネームスペースに存在するoci-service-operator-servicemesh-config
という名前のConfigMap
でfalse
に設定することで、自動プロキシ更新を無効にするオプションがあります。
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
メトリックを使用して、古いバージョンのプロキシを実行しているかどうかを判断します。このメトリックは、古いバージョンを実行しているプロキシの数を生成します。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
- ポッドの削除を確認し、新しいバージョンのプロキシ・サイドカーで再作成します。このポッド削除プロセスでは、ポッド/デプロイメントに定義されているPDBが考慮されます。
- すべてのポッドが最新バージョンで再作成されると、
OutdatedProxyConnection
メトリックがゼロになります。 AUTO_UPDATE_PROXY_VERSION
プロパティをfalse
に設定して自動更新をオフにして無効にします。
サービス・メッシュは、ユーザーが自動プロキシ更新を無効にした日から90日間プロキシ・バージョンをサポートします。ベスト・プラクティスとして、
OutdatedProxyConnection
メトリックにアラームを設定し、それに応じてモニターします。サービス・メッシュ・オペレータは、プロキシ・アップグレード・プロセス中にポッドを削除しようとします。アプリケーションのベスト・プラクティスとして、ポッドにPDBを設定して停止時間を回避します。
プロキシ・バージョンの監視
サービス・メッシュは、oci_servicemesh
ネームスペースの下で、Oracle Cloud Infrastructure MonitoringのActiveProxyConnections
およびOutdatedProxyConnections
に2つのメトリックを発行します。お客様は、OutdatedProxyConnections
メトリックを監視して、古いプロキシ・ソフトウェアを実行しているプロキシ/ポッドの数を表示できます。
詳細は、サービス・メッシュ・メトリックを参照してください。
プロキシ・ロギング・レベル
プロキシ・ログはデフォルトで/stdout
に出力されるため、標準のKubernetesログ読取りメカニズムを介してアクセスできます。起動またはプロキシ構成の問題が診断されるように、システムはデフォルトでerror
レベルでプロキシ・ログを有効にします。ユーザーがプロキシロギングを変更する場合は、手動で構成変更が必要です。この構成では、ユーザーが簡単にアクセスできるコンテナのログが提供されます。有効なログ・レベルは、debug
、info
、warn
、error
、off
です。
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"}}}} }'
プロキシ・ログ・レベルを設定するには、info
をdebug
、warn
、error
、off
などの別の有効なログ・レベルに置き換えます。