API 调用失败并显示 TLS 错误

您正在查看 Apigee X 文档。
查看 Apigee Edge 文档。

症状

您可能会在 Apigee Hybrid 上观察到以下一种或多种症状:

  1. 运行时流量停止工作
  2. API 请求失败并显示 TLS 连接错误
  3. API 客户端未收到来自 istio-ingressgateway 的预期 TLS 证书

错误消息

您会观察到,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 密钥 istio-system 命名空间中缺少 org-envgroup 的 K8S 密钥

K8S 密钥

在 Apigee Hybrid 中,系统将使用环境组配置 ingress 流量的虚拟主机。您可以在 overrides.yaml 文件中为每个环境组配置 TLS 证书和密钥文件。

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 Hybrid 运行时期间,这些 TLS 密钥和证书存储在 istio-system 命名空间中的 K8S 密钥中。

例如,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 Hybrid 组织的名称

    UAT_GROUP 是环境组的名称

    上述错误表明 secretfetcher 找不到 Apigee Hybrid 组织的上述环境组的 K8S 密钥。

  3. 使用以下命令验证 K8S 密钥是否确实缺失:
    kubectl -n istio-system get secrets
    <no output>
    

    上述示例的输出结果显示确实没有 K8S 密钥。那么,肯定是由于上述 K8S 密钥部分中提到的某种情况而删除了密钥。

解决方法

您可以按照以下步骤使用 overrides.yaml 文件中的 TLS 证书和密钥文件信息重新创建缺失的 K8S 密钥:

  1. 运行以下命令以重新创建缺失的密钥:
    apigeectl apply -f overrides/overrides.yaml --settings virtualhosts
    
  2. 上述命令的输出应显示密钥已创建:
    my-hybrid-project-prod-group created
    
  3. 使用以下命令验证 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
    

必须收集的诊断信息

如果按照上述说明操作后问题仍然存在,请收集以下诊断信息,然后联系 Apigee 支持团队

  1. Google Cloud 项目 ID
  2. Apigee Hybrid 组织的名称
  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