API 代理部署失败,apigee-serving-cert 未找到或已过期

您正在查看 ApigeeApigee Hybrid 文档。
查看 Apigee Edge 文档。

表现

API 代理部署失败,并显示以下错误消息。

错误消息

如果 apigee-webhook-service.apigee-system.svc 服务的 TLS 证书已过期或尚未生效,apigee-watcher 日志中会显示以下错误消息:

{"level":"error","ts":1687991930.7745812,"caller":"watcher/watcher.go:60",
"msg":"error during watch","name":"ingress","error":"INTERNAL: INTERNAL: failed
to update ApigeeRoute [org-env]-group-84a6bb5, namespace apigee:
Internal error occurred: failed calling webhook
\"mapigeeroute.apigee.cloud.google.com\": Post
\"https://apigee-webhook-service.apigee-system.svc:443/mutate-apigee-cloud-google-com-v1alpha1-apigeeroute?timeout=30s\":
x509:
certificate has expired or is not yet valid: current time
2023-06-28T22:38:50Z is after 2023-06-17T17:14:13Z, INTERNAL: failed to update
ApigeeRoute [org-env]-group-e7b3ff6, namespace apigee 

可能的原因

原因 说明
找不到 apigee-serving-cert 如果在 apigee-system 命名空间中找不到 apigee-serving-cert,则可能出现此问题。
为续订 apigee-serving-cert 创建了重复的证书请求 如果为续订 apigee-serving-cert 证书创建了重复的证书请求,则 apigee-serving-cert 证书可能无法续订。
cert-manager 不健康 如果 cert-manager 不健康,则 apigee-serving-cert 证书可能无法续订。

原因:找不到 apigee-serving-cert

诊断

  1. 检查 apigee-system 命名空间中 apigee-serving-cert 证书的可用性:

    kubectl -n apigee-system get certificates apigee-serving-cert
    

    如果此证书可用,您应该会看到类似如下所示的输出:

    NAME                  READY   SECRET                AGE
    apigee-serving-cert   True    webhook-server-cert   2d10h
  2. 如果在 apigee-system 命名空间中找不到 apigee-serving-cert 证书,那么这可能就是此问题的原因。

解决方法

  1. 在 Apigee Hybrid 安装过程中,apigee-serving-certapigeectl init 命令创建。因此,请在相关的 overrides.yaml 文件中执行该命令,以重新创建该证书:
    apigeectl init -f overrides/overrides.yaml
  2. 验证是否已创建 apigee-serving-cert 证书:
    kubectl -n apigee-system get certificates apigee-serving-cert

原因:为续订 apigee-serving-cert 创建了重复的证书请求

诊断

  1. 检查 cert-manager 控制器日志,并查看是否返回了类似于以下内容的错误消息。

    列出所有 cert-manager Pod:

    kubectl -n cert-manager get pods

    输出示例:

    NAME                                       READY   STATUS    RESTARTS        AGE
    cert-manager-66d9545484-772cr              1/1     Running   0               6d19h
    cert-manager-cainjector-7d8b6bd6fb-fpz6r   1/1     Running   0               6d19h
    cert-manager-webhook-669b96dcfd-6mnm2      1/1     Running   0               6d19h

    检查 cert-manager 控制器日志:

    kubectl -n cert-manager logs cert-manager-66d9545484-772cr | grep "issuance is skipped until there are no more duplicates"

    输出示例:

    1 controller.go:163] cert-manager/certificates-readiness "msg"="re-queuing item due to error processing" "error"="multiple CertificateRequests were found for the 'next' revision 3, issuance is skipped until there are no more duplicates" "key"="apigee-system/apigee-serving-cert"

    如果显示类似如下的错误消息,则会阻止续订 apigee-serving-cert 证书。

  2. 列出 apigee-system 命名空间中的所有证书请求,并检查是否创建了多个证书请求以续订同一 apigee-serving-cert 证书修订版本:
    kubectl -n apigee-system get certificaterequests

请参阅 cert-manager 创建了多个具有相同 certificate-revision 的 CertificateRequest 对象,了解与此问题相关的 cert-manager 问题。

解决方法

  1. 删除 apigee-system 命名空间中的所有证书请求:
    kubectl -n apigee-system delete certificaterequests --all
  2. 验证重复的证书请求是否已删除,并且只有一个证书请求可用于 apigee-system 命名空间中的 apigee-serving-cert 证书:
    kubectl -n apigee-system get certificaterequests
  3. 验证 apigee-serving-cert 证书是否已续订:
    kubectl -n apigee-system get certificates apigee-serving-cert -o yaml

    输出示例:

    apiVersion: cert-manager.io/v1
    kind: Certificate
    metadata:
      creationTimestamp: "2023-06-26T13:25:10Z"
      generation: 1
      name: apigee-serving-cert
      namespace: apigee-system
      resourceVersion: "11053"
      uid: e7718341-b3ca-4c93-a6d4-30cf70a33e2b
    spec:
      dnsNames:
      - apigee-webhook-service.apigee-system.svc
      - apigee-webhook-service.apigee-system.svc.cluster.local
      issuerRef:
        kind: Issuer
        name: apigee-selfsigned-issuer
      secretName: webhook-server-cert
    status:
      conditions:
      - lastTransitionTime: "2023-06-26T13:25:11Z"
        message: Certificate is up to date and has not expired
        observedGeneration: 1
        reason: Ready
        status: "True"
        type: Ready
      notAfter: "2023-09-24T13:25:11Z"
      notBefore: "2023-06-26T13:25:11Z"
      renewalTime: "2023-08-25T13:25:11Z"
      revision: 1

原因:cert-manager 不健康

诊断

  1. 检查 cert-manager 命名空间中的 cert-manager pod 的健康状况:
    kubectl -n cert-manager get pods

    如果 cert-manager Pod 健康状况良好,则所有 cert-manager Pod 都应准备就绪 (1/1) 并处于 Running 状态,否则这可能就是导致此问题的原因:

    NAME                                       READY   STATUS    RESTARTS   AGE
    cert-manager-59cf78f685-mlkvx              1/1     Running   0          15d
    cert-manager-cainjector-78cc865768-krjcp   1/1     Running   0          15d
    cert-manager-webhook-77c4fb46b6-7g9g6      1/1     Running   0          15d
  2. cert-manager 可能会因多种原因而失败。检查 cert-manager 日志并确定失败的原因,然后相应地解决问题。

    一个已知原因是,如果 cert-manager 无法与 Kubernetes API 通信,则会失败。在这种情况下,系统会显示类似如下的错误消息:

    E0601 00:10:27.841516       1 leaderelection.go:330] error retrieving
    resource lock kube-system/cert-manager-controller: Get
    "https://192.168.0.1:443/api/v1/namespaces/kube-system/configmaps/cert-manager-controller":
    dial tcp 192.168.0.1:443: i/o timeout

解决方法

  1. 检查 Kubernetes 集群的健康状况并修复发现的任何问题。请参阅集群故障排查
  2. 如需了解其他 cert-manager 问题排查信息,请参阅问题排查

必须收集的诊断信息

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

  1. Google Cloud 项目 ID
  2. Apigee Hybrid 组织
  3. Apigee Hybrid overrides.yaml 文件,遮盖所有敏感信息。
  4. 所有命名空间中的 Kubernetes pod 状态:
    kubectl get pods -A > kubectl-pod-status`date +%Y.%m.%d_%H.%M.%S`.txt
  5. Kubernetes cluster-info 转储:
    # generate kubernetes cluster-info dump
    kubectl cluster-info dump -A --output-directory=/tmp/kubectl-cluster-info-dump
    # zip kubernetes cluster-info dump
    zip -r kubectl-cluster-info-dump`date +%Y.%m.%d_%H.%M.%S`.zip /tmp/kubectl-cluster-info-dump/*