TLS エラーで API 呼び出しが失敗する

現在は、ApigeeApigee ハイブリッドのドキュメントが表示されています。
Apigee Edge ドキュメントを表示する

症状

Apigee ハイブリッドでは、次のような現象が 1 つ以上発生します。

  1. ランタイム トラフィックが停止した
  2. TLS 接続エラーで API リクエストが失敗する
  3. 想定される istio-ingressgateway からの TLS 証明書を API クライアントが受信しない

エラー メッセージ

API 呼び出しが失敗し、次のような TLS エラーが表示されます。

* TLSv1.2 (OUT), TLS handshake, Client hello (1):
* LibreSSL SSL_connect: SSL_ERROR_SYSCALL in connection to example.apis.com:443
* Closing connection 0
curl: (35) LibreSSL SSL_connect: SSL_ERROR_SYSCALL in connection to example.apis.com:443

考えられる原因

原因 説明
Ingress に K8S Secret がない org-envgroup の K8S Secret が istio-system Namespace にありません。

K8S Secret

Apigee ハイブリッドでは、環境グループを使用して ingress トラフィックの仮想ホストを構成します。TLS 証明書と鍵ファイルは、overrides.yaml ファイル内の環境グループごとに構成されます。

overrides.yaml での TLS 証明書と鍵ファイルの構成例:

org: my-hybrid-project
virtualhosts:
  - name: uat-group
    sslCertPath: ./certs/uat-group-keystore.pem
    sslKeyPath: ./certs/uat-group-keystore.key
  - name: prod-group
    sslCertPath: ./certs/prod-group-keystore.pem
    sslKeyPath: ./certs/prod-group-keystore.key

Apigee ハイブリッド ランタイムのインストール中、これらの TLS 鍵と証明書は istio-system Namespace の K8S Secret に保存されます。

たとえば、上記の overrides.yaml ファイルの構成では、次の K8S Secret が作成されます。

kubectl -n istio-system get secrets

NAME                            TYPE      DATA   AGE
my-hybrid-project-prod-group    Opaque    2      15h
my-hybrid-project-uat-group     Opaque    2      38m

これらの K8S Secret には、必要な TLS 鍵と証明書が保存されるため、そのままの状態で維持してください。ただし、次のような場合は、この Secret が削除される可能性があります。

  1. ASM の再インストール
  2. istio-system Namespace の削除
  3. 誤って削除した場合

原因: Ingress に Secret がない

診断

  1. istio-system Namespace 内の istio-ingressgateway Pod のログを分析し、エラーがあるかどうかを確認します。
  2. 次のようなエラーが発生することがあります。
    2021-01-04T23:37:14.542520Z     error   secretfetcher   cannot find secret MY_HYBRID_PROJECT-UAT_GROUP and cannot find fallback secret gateway-fallback
    

    ここで

    MY_HYBRID_PROJECT は Apigee ハイブリッド組織の名前です。

    UAT_GROUP は、環境グループの名前です。

    前述のエラーは、secretfetcher が Apigee ハイブリッド組織の上の環境グループの K8S Secret を見つけられなかったことを示します。

  3. 次のコマンドを使用して、K8S Secret が実際に欠落していることを確認します。
    kubectl -n istio-system get secrets
    <no output>
    

    上の出力例は、K8S Secret がないことを示しています。これらは、上記の K8S Secret で説明した状況のいずれかのために削除された可能性があります。

解決策

次の手順に沿って、overrides.yaml ファイルの TLS 証明書と鍵ファイル情報を使用して、欠落している K8S Secret を再作成します。

  1. 次のコマンドを実行して、欠落している Secret を再作成します。
    apigeectl apply -f overrides/overrides.yaml --settings virtualhosts
    
  2. 上のコマンドの出力には、Secret が作成されたことが示されます。
    my-hybrid-project-prod-group created
    
  3. 次のコマンドを使用して、K8S Secret が正常に作成されたことを確認します。
    kubectl -n istio-system get secrets
    

    NAME                            TYPE      DATA   AGE
    my-hybrid-project-prod-group    Opaque    2      15h
    my-hybrid-project-uat-group     Opaque    2      38m
    

診断情報の収集が必要な場合

上記の手順でも問題が解決しない場合は、次の診断情報を収集して Apigee サポートに連絡してください。

  1. Google Cloud プロジェクト ID。
  2. Apigee ハイブリッド組織の名前
  3. Kubernetes クラスタ名
  4. Google Cloud プロジェクト名(Kubernetes クラスタが別の Google Cloud プロジェクトにある場合)
  5. overrides.yaml ファイル
  6. istio-system Namespace の各 istio-ingressgateway Pod からログを収集します。
    kubectl logs NAME_OF_ISTIO_INGRESSGATEWAY_POD -n istio-system > /tmp/NAME_OF_ISTIO_INGRESSGATEWAY_POD.log
    
  7. istio-system Namespace の Secret のリストを収集します。
    kubectl -n istio-system get secrets
    
  8. istio-system Namespace 内のサービスのリストを収集します。
    kubectl get svc -n istio-system
    
  9. istio-system Namespace 内の各 Pod の説明を収集します。
    kubectl describe pod NAME_OF_ISTIO_INGRESSGATEWAY_POD -n istio-system > /tmp/NAME_OF_ISTIO_INGRESSGATEWAY_POD.yaml