【问题标题】:Google managed SSL certificate stuck on FAILED_NOT_VISIBLEGoogle 管理的 SSL 证书卡在 FAILED_NOT_VISIBLE
【发布时间】:2019-05-22 01:00:33
【问题描述】:

我正在尝试在 GKE 上配置 https 负载平衡器。我正在关注:https://cloud.google.com/load-balancing/docs/ssl-certificates 和 https://cloud.google.com/kubernetes-engine/docs/concepts/ingress

我的配置使用 Let's Encrypt 的证书已经工作了一段时间。 但是一直更新证书太麻烦了,所以我想测试一下谷歌的托管服务。

这是我到目前为止的设置方式,但停留在FAILED_NOT_VISIBLE。 关于如何进一步修复或调试此问题的任何想法?

k8s/staging/staging-ssl.yml

  7 apiVersion: extensions/v1beta1
  8 kind: Ingress
  9 metadata:
 10   name: my-staging-lb-ingress
 11   annotations:
 12     kubernetes.io/ingress.global-static-ip-name: "my-staging-global"
 13     ingress.gcp.kubernetes.io/pre-shared-cert: "staging-google-managed-ssl"
 14     kubernetes.io/ingress.allow-http: "false"
 15 spec:
 16   rules:
 17   - host: staging.my-app.no
 18     http:
 19       paths:
 20       - path: /*
 21         backend:
 22           serviceName: my-svc
 23           servicePort: 3001

预留 IP

$ gcloud compute addresses list
NAME                   REGION  ADDRESS         STATUS
my-staging-global              35.244.160.NNN  RESERVED


$ host staging.my-app.no 
35.244.160.NNN

$ gcloud beta compute ssl-certificates 描述 staging-google-managed-ssl

creationTimestamp: '2018-12-20T04:59:39.450-08:00'
id: 'NNNN'
kind: compute#sslCertificate
managed:
  domainStatus:
    staging.my-app.no: FAILED_NOT_VISIBLE
  domains:
  - staging.my-app.no
  status: PROVISIONING
name: staging-google-managed-ssl
selfLink: https://www.googleapis.com/compute/beta/projects/my-project/global/sslCertificates/staging-google-managed-ssl
type: MANAGED

我在帖子开头链接的文档中找到了一个部分 将 SSL 证书资源与目标代理相关联:

使用以下 gcloud 命令将 SSL 证书资源与目标代理相关联,无论 SSL 证书是自行管理的还是 Google 管理的。

gcloud compute target-https-proxies create [NAME] \
    --url-map=[URL_MAP] \
    --ssl-certificates=[SSL_CERTIFICATE1][,[SSL_CERTIFICATE2],[SSL_CERTIFICATE3],...]

当我的 Ingress 配置中有这一行时,是否有必要这样做?

13 ingress.gcp.kubernetes.io/pre-shared-cert: "staging-google-managed-ssl"

【问题讨论】:

  • 我使用的一种解决方法是“滥用”缺乏适当的 ipv6 支持。我通过仪表板手动将 SSL 证书更新到目标代理。这不会被 gcloud / k8s 删除,它允许它变为 ACTIVE,此时您可以将 k8s 托管证书交换为托管 GCP 证书。
  • 我在使用 google 提供的 SSL 时遇到了同样的问题,太令人沮丧了,你有什么进展吗?

标签: ssl google-cloud-platform google-kubernetes-engine gke-networking


【解决方案1】:

我将把它留给任何可能最终遇到与我相同情况的人。我需要从自我管理的证书迁移到谷歌管理的证书。

我确实按照指南创建了 google 管理的证书,并希望在将证书应用到我的 Kubernetes 入口之前看到它被激活(以避免停机的可能性)

事实证明,正如docs 所述,

目标代理必须引用 Google 管理的证书 资源

因此,通过kubectl apply -f ingress-conf.yaml 应用配置使负载均衡器使用新创建的证书,该证书在(15 分钟左右)后不久生效

【讨论】:

  • 我不知道如何也不知道为什么,但是k8s创建的2个转发规则(http和https)使用的是不同的 IP。我手动删除了一个并重新创建它以强制使用正确的 IP。如果这个 hack 有效,我会更新这个线程。
  • 确认:手动添加一个额外的转发地址和正确的{"kubernetes.io/ingress-name": "…"} 描述解决了我的问题。我还是不明白为什么k8s坚持把HTTPS指向不同的IP。希望对那里的人有所帮助。
  • 使用 google 管理的 SSL 证书的 15 分钟中断是相当蹩脚的。有没有办法解决这个问题?我在 20 分钟内等待创建 SSL 证书。
【解决方案2】:

我最近遇到了这个问题。您需要检查您的 A Record 是否正确指向 Ingress 静态 IP。

如果您使用 Cloudflare 之类的服务,请禁用 Cloudflare 代理设置,以便 ping 到域将提供 Ingress 的实际 IP。这将在 10 到 15 分钟内正确创建 Google 托管 SSL 证书。

证书启动后,您可以再次启用 Cloudflare 代理设置。

【讨论】:

  • 这正是我遇到的问题。感谢您的回答。但是,想知道当前的问题是如何解决的——如果我禁用云耀斑代理,它会将负载均衡器的 IP 地址公开。这可能是一个潜在的风险 ip 攻击。我目前正计划对 CF 使用速率限制。如何解决?
  • 感谢您的回答,我也遇到了这个问题:)
【解决方案3】:

根据您提供的以下documentation,这应该可以帮助您:

状态 FAILED_NOT_VISIBLE 表示由于 DNS 或负载平衡配置问题,域的证书配置失败。确保已配置 DNS,以便证书的域解析为负载均衡器的 IP 地址。

【讨论】:

  • 是的,我看到了,但是域解析正确。这将我引向负载均衡器。我也看不出有什么问题。 :(
  • 我也遇到了示例问题。域 A 记录 TTL 为 5 分钟。域被解析为入口状态 ip 中指示的上行地址。 “gcloud 计算地址列表”将 IP 地址显示为外部和 IN_USE。 “gcloud beta compute ssl-certificates list”说仍然在 PROVISIONING 并且域是 FAILED_NOT_VISIBLE。你真的需要为此创建一个目标代理,因为cloud.google.com/kubernetes-engine/docs/how-to/managed-certs 没有提到任何目标代理吗?
  • 这是否意味着没有指向IP地址的DNS就无法创建证书?我正在尝试将实时服务迁移到 Google 管理的证书,并且我想在创建证书后切换 DNS,以免停机。
  • @Mikee 看起来是这样,我必须事先提供证书,等到 FAILED_NOT_VISIBLE 错误被标记出来,然后将 DNS 切换到新的 LB,它就可以立即工作了
【解决方案4】:

staging.my-app.no 的 A 资源记录的 TTL(生存时间)是多少? 使用,例如,

dig +nocmd +noall +answer staging.my-app.no

想办法。

在我的例子中,将 TTL 从 60 秒增加到 7200 让 domainStatus 最终到达 ACTIVE。

【讨论】:

  • 您好,我按照您昨天的建议进行了更改。还是没有运气! :-(
【解决方案5】:

除了其他答案之外,在从自我管理证书迁移到谷歌管理证书时,我必须:

  • 使用 kubernetes.io/ingress.allow-http: true 启用 http 到我的入口服务
  • 让现有的 SSL 证书在原始入口服务中运行,直到新的托管证书处于活动状态

我还有一个过期的原始 SSL 证书,但我不确定这是否重要。

【讨论】:

    【解决方案6】:

    在这里检查答案后对我有用(我使用负载平衡器,但 IMO 这对所有情况都是正确的):

    1. 如果过了一段时间,此证书对您不起作用(它可能会永久消失,需要时间来证明)-我创建了一个新证书并在负载均衡器中替换它(只需编辑它)
    2. 确保证书在创建后几分钟就被使用
    3. 确保 DNS 指向您的服务。并且您的配置在使用 http 时有效!! - 这是最好和最安全的方法(如果您刚刚移动了一个域,请确保在检查时您访问到正确的 IP)
    4. 创建新证书后或问题已解决 - 您的域将变为绿色,但您仍需要等待(可能需要一个小时或更长时间)

    【讨论】:

      【解决方案7】:

      事实证明,我错误地对生产环境进行了一些更改,而对暂存环境进行了其他更改。当我弄清楚并遵循指南时,一切都按预期工作。 :-)

      【讨论】:

      • 您是否需要执行gcloud compute target-https-proxies create 步骤才能使其正常工作?
      • 没必要。创建 GKE Ingress 时会自动创建目标代理。
      • @JohnMichelau 不做 GKE Ingress 时,是的,目标代理创建是对我有用的步骤。否则事情就挂了。
      【解决方案8】:

      在我的情况下,我需要更改运行状况检查并将其指向正确的端点(nginx-ingress 上的 /healthz),并且在运行状况检查返回 true 后,我必须确保在与 gce 相同的命名空间中创建托管证书-入口。完成这两件事后,它终于通过了,否则我得到了同样的错误。 “FAILED_NOT_VISIBLE”

      【讨论】:

        【解决方案9】:

        我遇到了同样的问题。 我通过重新查看文档来修复它。

        https://cloud.google.com/load-balancing/docs/ssl-certificates/troubleshooting?_ga=2.107191426.-1891616718.1598062234#domain-status

        FAILED_NOT_VISIBLE  
        Certificate provisioning failed for the domain. Either of the following might be the issue:
        The domain's DNS record doesn't resolve to the IP address of the Google Cloud load balancer. To resolve this issue, update the DNS records to point to your load balancer's IP address.
        The SSL certificate isn't attached to the load balancer's target proxy. To resolve this issue, update your load balancer configuration.
        Google Cloud continues to try to provision the certificate while the managed status is PROVISIONING.
        

        因为我的负载均衡器在 cloudflare 后面。默认情况下,cloudflare 启用了 cdn 代理,我需要在 Google 验证 DNS 后首先禁用它,证书状态更改为活动。

        【讨论】:

          【解决方案10】:

          就我而言,在工作中。我们正在大量利用托管证书,以便为开发人员和 QA 提供动态环境。结果,我们大量配置和删除托管证书。这意味着我们也在生成和删除托管证书时更新 Ingress 资源。

          我们发现,即使你从这个注解中删除了托管证书的引用:

          networking.gke.io/managed-certificates: <list>
          

          Ingress 似乎随机不会从 LoadBalancer 中删除关联的 ssl-certificates。

          ingress.gcp.kubernetes.io/pre-shared-cert: <list>
          

          因此,当托管证书被删除时。入口将以某种方式“卡住”,无法提供新的托管证书。因此,新的托管证书将在一段时间后从 PROVISIONING 状态转换为 FAILED_NOT_VISIBLE 状态

          到目前为止,我们发现的唯一解决方案是,如果新证书在 30 分钟后没有获得供应。我们将检查注解 ingress.gcp.kubernetes.io/pre-shared-cert 是否包含不再存在的 ssl-certificate。

          您可以使用以下命令检查现有的 ssl 证书

          gcloud compute ssl-certificates list
          

          如果碰巧一个不再存在的 ssl 证书仍在注释中。然后,我们将手动从 ingress.gcp.kubernetes.io/pre-shared-cert 注释中删除不必要的 ssl-certificate。

          应用更新的配置后,大约 5 分钟后,处于 FAILED_NOT_VISIBLE 状态的新托管证书应该会被提供并处于 ACTIVE 状态。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2021-06-15
            • 2019-11-21
            • 2019-10-04
            • 1970-01-01
            • 2022-07-01
            • 2022-10-15
            • 2020-01-17
            相关资源
            最近更新 更多