トラブルシューティング- 一般
サービス・メッシュの一般的な問題の原因と修正を特定します。次の一般的なトラブルシューティング・ソリューションを使用できます。
OCIコンソールまたはOCI CLIでメッシュ・リソースに加えた変更は、以前の状態に戻ります
問題
OCIコンソールまたはOCI CLIからメッシュ・リソースに加えられた変更(イングレス・ゲートウェイ、仮想サービス、仮想デプロイメントなど)は、オペレータに設定された更新間隔に基づいて前の状態に戻ります。
説明
現在、メッシュ・リソースの初期作成後にリソースを変更できるのは、OCI Service Operator for Kubernetesからのみであるため、kubectl.
ですオペレータの更新間隔(たとえば、毎時間)に基づいて、OCI Service Operator for Kubernetesで調整プロセスが実行されます。設定が異なるサービス・メッシュ・コントロール・プレーンのリソースはすべて、OCI Service Operator for Kubernetesの設定と一致するように戻されます。
サービス・メッシュに関する一般的なトラフィックの問題
問題
通常、サービス・トラフィックが欠落しているか、予期しないものであるかは、ルーティング設定が不適切です。サービス通信が期待どおりに機能しない最も一般的な理由を次に示します。
一般的な理由
SSL関連の理由
イングレス・ゲートウェイ・デプロイメントのトラブルシューティング
問題
IngressGatewayDeploymentリソースは、Deployment、Service、Horizontal Pod Autoscalerなどの依存リソースを作成します。IngressGatewayDeploymentによって作成されたサービスは、LoadBalancerリソースを作成できます。これらの依存リソースのいずれかの作成に失敗した場合、IngressGatewayDeploymentリソースはアクティブになりません。一般的な問題を修正するには、次を確認します。
ソリューション
デプロイメントで次のようなエラーが発生した場合、このエラーは、IngressGatewayDeploymentによって作成されたLoadBalancerタイプのサービスがプライベート・サブネットにパブリック・ロード・バランサを作成できないことを意味します。
Warning SyncLoadBalancerFailed 3m2s (x10 over 48m) service-controller (combined from similar events): Error syncing load balancer: failed to ensure load balancer: creating load balancer: Service error:InvalidParameter. Private subnet with id <subnet-ocid> is not allowed in a public loadbalancer.. http status code: 400. Opc request id: <opc-request-id>
プライベート・ロード・バランサまたは内部ロード・バランサを使用するには、次の手順を実行します。
- IngressGatewayDeploymentリソースからサービス・セクションを削除します。
- イングレス・ゲートウェイのポッドを指す正しい注釈を使用してサービスを作成します。
更新されたリソースは、次の例のようになります。
IngressGatewayDeployment (サービスなし)
apiVersion: servicemesh.oci.oracle.com/v1beta1
kind: IngressGatewayDeployment
metadata:
name: bookinfo-ingress-gateway-deployment
namespace: bookinfo
spec:
ingressGateway:
ref:
name: bookinfo-ingress-gateway
deployment:
autoscaling:
minPods: 1
maxPods: 1
ports:
- protocol: TCP
port: 9080
serviceport: 80
内部ロード・バランサを作成するサービス。
apiVersion: v1
kind: Service
metadata:
name: bookinfo-ingress
namespace: bookinfo
annotations:
service.beta.kubernetes.io/oci-load-balancer-internal: "true"
spec:
ports:
- port: 80
targetPort: 9080
name: http
selector:
servicemesh.oci.oracle.com/ingress-gateway-deployment: bookinfo-ingress-gateway-deployment
type: LoadBalancer
水平Pod Autoscaler(HPA)は、メトリックをスクレイプしません
問題
Horizontal Pod Autoscaler (HPA)はメトリックをスクレイプしません。
ソリューション
サービス・メッシュを使用してアプリケーション・ポッドを設定すると、サービス・メッシュ・プロキシ・コンテナがポッドに注入されます。プロキシ・コンテナとともに、initコンテナも注入され、プロキシの有効化に必要な1回かぎりの初期化が実行されます。
ポッドにinitコンテナが存在するため、メトリック・サーバーはポッドからメトリックをスクレイプできないシナリオもあります。次の表を参照してください。
メトリック- サーバー・バージョン | HPA APIバージョン | スケープ可能メトリック |
---|---|---|
v0.6.x | autoscaling/v2beta2 | いいえ |
v0.6.x | autoscaling/v1 | はい |
v0.4.x | 任意 | いいえ |
仮想デプロイメント・ポッドがトラフィックを受信しない
問題
仮想デプロイメント・ポッドはトラフィックを受信しません。
ソリューション
デフォルトでは、仮想サービスのルーティング・ポリシーはDENY
です。したがって、次のいずれかを行います。
- ルーティング・ポリシーを
UNIFORM
に変更します。 - 仮想サービス・ルート表を作成して、トラフィックを仮想デプロイメントにルーティングします。
プロキシ config_dumpを使用したトラフィックの問題のトラブルシューティング
問題
次のトラフィック問題の1つが発生しています。
- サービスがトラフィックを受信していません。
- サービス間でセキュアな通信は行われません。
- トラフィック分割はバージョン間で行われません。
- A/Bデプロイメントのテスト、カナリア・デプロイメントが失敗します。
解決策
問題をトラブルシューティングするには、問題のあるポッドのconfig_dump
ファイルを取得します。ソースおよび宛先のポッドconfig_dump
ファイルを参照することで、詳細を推測できます。ファイルを取得するには、次のステップを実行します。
oci-sm-proxy
コンテナで実行します。$ kubectl exec -i -t -n NAMESPACE_NAME POD_NAME -c oci-sm-proxy "--" /bin/bash
- コンテナ内で、
config_dump
ファイルにアクセスします。$ curl localhost:9901/config_dump
- コンテナを終了します。
$ exit
Prometheusを使用したサービス・バージョン間のトラフィックの分析
問題
Prometheusメトリックは、過去5分間にトラフィックが特定のバージョンのサービスに送信されるかどうかを識別するためのキーです。
解決策
過去5分間にサービス・トラフィックを表示するには、次のステップを実行します。
次の例では、「pets」という名前のサービスがデプロイされ、複数のバージョンがあることを想定しています。
ポート転送を使用してブラウザでPrometheus Dashboardを開きます。
kubectl port-forward PROMETHEUS_POD_NAME -n PROMETHEUS_NAMESPACE PROMETHEUS_CONTAINER_PORT:9090
- プロメテウス・メトリックを表示するには、ブラウザの
http://localhost:9090/graph
を参照してください。 - pets-v1サービスに送信されたすべてのリクエストの合計数を表示するには、プロメテウス検索で次のコマンドを入力します。「Execute」を押します。
envoy_cluster_external_upstream_rq_completed{virtual_deployment_name="pets-v1"}
pets-v1サービスへの過去5分間のリクエストの率を表示するには、プロメテウス検索で次のコマンドを入力します。「Execute」を押します。
rate(envoy_cluster_external_upstream_rq_completed{virtual_deployment_name="pets-v1"}[5m])
curlを使用してすべてのポッドに送信されたリクエストの合計数をフェッチします:
curl localhost:9090/api/v1/query?query="envoy_cluster_external_upstream_rq_completed" | jq