20

我正在尝试在 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 计算 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"

4

10 回答 10

13

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

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

事实证明,如文档所述,

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

因此,应用配置kubectl apply -f ingress-conf.yaml使负载均衡器使用新创建的证书,该证书在不久后(15 分钟左右)变为活动状态

于 2019-08-09T07:47:01.733 回答
9

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

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

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

于 2021-04-26T15:44:48.587 回答
1

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

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

于 2018-12-22T03:18:22.543 回答
1

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

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

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

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

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

于 2020-03-12T19:53:53.563 回答
1

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

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

弄明白。

在我的情况下,将 TTL 从 60 秒增加到 7200 让domainStatus最终到达ACTIVE

于 2018-12-25T21:35:41.930 回答
0

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

于 2020-04-16T13:45:09.997 回答
0

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

于 2019-01-07T13:13:45.063 回答
0

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

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 后首先禁用它,证书状态更改为活动。

于 2020-12-08T02:45:13.040 回答
0

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

我们发现,即使您从此注释中删除托管证书的引用:

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

似乎Ingress 不会随机从 LoadBalancer中删除相关的ssl 证书。

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状态。

于 2021-03-11T20:23:49.393 回答