トラブルシューティング- 一般

サービス・メッシュの一般的な問題の原因と修正を特定します。次の一般的なトラブルシューティング・ソリューションを使用できます。

OCIコンソールまたはOCI CLIでメッシュ・リソースに加えた変更は、以前の状態に戻ります

問題

OCIコンソールまたはOCI CLIからメッシュ・リソースに加えられた変更(イングレス・ゲートウェイ、仮想サービス、仮想デプロイメントなど)は、オペレータに設定された更新間隔に基づいて前の状態に戻ります。

説明

現在、メッシュ・リソースの初期作成後にリソースを変更できるのは、OCI Service Operator for Kubernetesからのみであるため、kubectl.ですオペレータの更新間隔(たとえば、毎時間)に基づいて、OCI Service Operator for Kubernetesで調整プロセスが実行されます。設定が異なるサービス・メッシュ・コントロール・プレーンのリソースはすべて、OCI Service Operator for Kubernetesの設定と一致するように戻されます。

サービス・メッシュに関する一般的なトラフィックの問題

問題

通常、サービス・トラフィックが欠落しているか、予期しないものであるかは、ルーティング設定が不適切です。サービス通信が期待どおりに機能しない最も一般的な理由を次に示します。

一般的な理由

  1. リソースの状態が正しくありません

    仮想デプロイメントへの予期しないトラフィックの1つの理由として、仮想サービス・ルート表更新によって仮想デプロイメントが失敗状態になり、デフォルトのルーティング・ポリシーはUNIFORMに設定されます。すべてのリソースがActive状態であることを確認します。必要なリソースがFailedまたはDeleted状態の場合、ルーティング構成の構築には使用されません。

  2. プロトコルまたはポートの不一致

    イングレス・ゲートウェイのホスト・リスナーと仮想デプロイメント間のプロトコルまたはポートが、イングレス・ゲートウェイのルート表および仮想サービス・ルート表に指定されたものと一致しません。

  3. DNSホストの不一致

    仮想デプロイメントのDNSホスト名がKubernetesサービスと一致している必要があります。

  4. ホストヘッダーが一致しません

    内部および外部サービス・コール元は、Kubernetesサービスで指定されたホスト・ヘッダーを使用していません。プロトコルに標準ポート<host>: <port>を使用しない場合、仮想サービスまたはイングレス・ゲートウェイ・ホスト・リスナーのホストでも同じ値を指定する必要があります。

    このルールは、IPアドレスを直接使用するためにも拡張されます。IPアドレスを使用する場合は、イングレス・ゲートウェイ・ホスト・リスナーまたは仮想サービスのホストとしてIPアドレスを指定する必要があります。

  5. アクセス・ポリシーがありません

    サービスとの間のトラフィックを許可するアクセス・ポリシーがありません。

SSL関連の理由

  1. サーバー名が一致しません

    TLSハンドシェイクを開始するには、内部および外部のサービス通信で、仮想サービスまたはイングレス・ゲートウェイで指定されたホスト名を使用する必要があります。

  2. 期限切れの認証局の使用

    サービス・メッシュは、サービス・メッシュ・リソース作成の一環として、ユーザーが期限切れの証明書または認証局を提供していないことを確認します。ただし、有効期限が切れる前に認証局をローテーションし、証明書が更新されます。

イングレス・ゲートウェイ・デプロイメントのトラブルシューティング

問題

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