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

Apigee X のドキュメントを表示中。
Apigee Edge のドキュメントを表示する。

症状

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

  1. ランタイム トラフィックが停止した
  2. API リクエストが TLS 接続エラーで失敗する
  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 シークレットが欠落している org-envgroup の K8S シークレットが istio-system 名前空間にありません

K8S のシークレット

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 名前空間の K8S Secret に保存されます。

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

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 シークレットには必要な TLS 鍵と証明書が保存されるため、鍵をそのまま保持することが重要です。ただし、次のような場合にはこのシークレットが削除される可能性があります。

  1. ASM の再インストール
  2. istio-system 名前空間の削除
  3. 誤削除

原因: Ingress にシークレットがない

診断

  1. istio-system 名前空間内の 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 シークレットを見つけられなかったことを示します。

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

    上の出力例は、K8S Secret がないことを示しています。これらは、上記の K8S シークレットで説明した状況のいずれかのために削除された可能性が非常に高いです。

解決策

次の手順に従い、overrides.yaml ファイルの TLS 証明書と鍵ファイル情報を使用して、欠落している K8S シークレットを再作成できます。

  1. 次のコマンドを実行して、欠落している Secret を再作成します。
    apigeectl apply -f overrides/overrides.yaml --settings virtualhosts
    
  2. 上記のコマンドの出力には、シークレットが作成されたことが示されます。
    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 名前空間の各 istio-ingressgateway Pod からログを収集します。
    kubectl logs NAME_OF_ISTIO_INGRESSGATEWAY_POD -n istio-system > /tmp/NAME_OF_ISTIO_INGRESSGATEWAY_POD.log
    
  7. istio-system 名前空間のシークレットのリストを収集します。
    kubectl -n istio-system get secrets
    
  8. istio-system 名前空間内のサービスのリストを収集します。
    kubectl get svc -n istio-system
    
  9. istio-system 名前空間内の各 Pod の説明を収集します。
    kubectl describe pod NAME_OF_ISTIO_INGRESSGATEWAY_POD -n istio-system > /tmp/NAME_OF_ISTIO_INGRESSGATEWAY_POD.yaml