Kubernetes Nginx Ingress 尝试获取错误的 SSL 证书。

4
我有一个奇怪的案例。背景如下:
首先,客户使用我们的域名作为他们的商店,URL类似于somestore.eu.mycompany.com。
然后,客户升级到了自定义域名,其他客户这样做没有任何问题。
我们删除了旧子域名的整个命名空间,并创建了一个具有新域名的命名空间。
根域名无缺陷地工作,没有SSL证书问题。然而,暂存子域名有时会正常工作,有时会出现SSL证书问题,有时会出现以下错误:
$ curl -vI https://staging.somestore.com/
*   Trying 35.102.186.11:443...
* TCP_NODELAY set
* Connected to staging.somestore.com (35.102.186.11) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
*   CAfile: /etc/ssl/certs/ca-certificates.crt
  CApath: /etc/ssl/certs
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8):
* TLSv1.3 (IN), TLS handshake, Certificate (11):
* TLSv1.3 (IN), TLS handshake, CERT verify (15):
* TLSv1.3 (IN), TLS handshake, Finished (20):
* TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1):
* TLSv1.3 (OUT), TLS handshake, Finished (20):
* SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384
* ALPN, server accepted to use h2
* Server certificate:
*  subject: CN=*.eu.mycompany.com
*  start date: Mar 13 09:29:46 2022 GMT
*  expire date: Jun 11 09:29:45 2022 GMT
*  subjectAltName does not match staging.somestore.com
* SSL: no alternative certificate subject name matches target host name 'staging.somestore.com'

查看日志,我发现nginx-ingress仍在尝试获取旧证书

kubectl logs -f -n ingress-nginx nginx-ingress-controller-55f88544bf-dk7ht | grep my-namespace

SSL证书“my-namespace/tls-cert”不包含服务器“somestore.eu.mycompany.com”的公共名称或主题备用名称:x509:证书有效期为somestore.com、staging.somestore.com、www.somestore.com,而不是somestore.eu.mycompany.com。

为何Kubernetes的nginx-ingress仍在尝试获取旧证书?


1
现在没有定义旧域的Ingress定义吗?我可能会再次检查一下。如果您在Nginx Pod内执行,您应该可以在根目录上找到计算出的配置文件,您可以使用cat命令检查并了解Nginx在底层是如何配置的。 - AndD
我检查了所有的入口,没有发现任何与旧域名相关的内容。 - Rodrigo
你的集群中是否有多个Ingress Nginx在运行? - gohm'c
我大约有150个入口。 - Rodrigo
有没有一种方法可以跟踪所有入口的日志?如果是的话,我可以看到哪个入口除了具有正确证书的入口之外还接受连接。 - Rodrigo
显示剩余3条评论
1个回答

1
  1. 确保你的集群中拥有正确的配置映射(ConfigMaps),密码(Secrets)或其他配置(例如SSL证书存储位置)。必须存在所需的配置,弃用的配置必须被删除。
  2. 在你的Deployment上执行一个滚动重启(rollout restart)。(例如,如果nginx-ingressingress命名空间下的deployment的名称,则执行以下命令:kubectl rollout restart -n ingress deploy/nginx-ingress)

1
Rollout 会做什么?这是一个生产环境中的集群。 - Rodrigo
1
它将优雅地逐个重启该部署中的所有Pod,而不会出现服务中断。我并不是说在执行此操作之前您不应该在开发集群中尝试更改,但如果您没有任何开发环境,则滚动重启可能是您最好的选择,因为它旨在成为零停机时间更改管理工具。 - bradib0y

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接