ingress-nginx、cert-manager 和 ingressClassName
ingress-nginx, cert-manager and ingressClassName
我最近将 ingress-nginx
升级到版本 1.0.3。
因此,我从 ingress 中删除了 kubernetes.io/ingress.class
注释,并用 .spec.ingressClassName
代替。
我是运行cert-manager-v1.4.0
.
今天早上我收到一封电子邮件,说我的 Let's Encrypt 证书将在 10 天后过期。我试图弄清楚它出了什么问题 - 不能肯定这完全是由于 ingress-nginx 升级造成的。
我删除了 CertificateRequest
看它是否会自行修复。我得到了一个新的 Ingress
挑战,但是:
挑战入口正确设置了 kubernetes.io/ingress.class
注释,即使我的入口有 .spec.ingressClassName
而不是 - 不知道如何或为什么,但它似乎应该没事。
但是,挑战入口没有被入口控制器接收到,它说:
ingress class annotation is not equal to the expected by Ingress Controller
我猜它只需要 .spec.ingressClassName
,尽管我认为注释也应该有效。
所以我在挑战入口上手动设置了 .spec.ingressClassName
。它立即被 ingress controller 看到,其余过程 运行 顺利,我得到了一个新证书 - yay.
在我看来这种情况还会再次发生,所以我需要知道如何:
说服 cert-manager
使用 .spec.ingressClassName
而不是 kubernetes.io/ingress.class
创建挑战入口。也许这在 1.5 或 1.6 中已修复?
说服 ingress-nginx
尊重挑战入口的 kubernetes.io/ingress.class
注释。我不知道为什么这不起作用。
问题
问题已通过证书续订解决,无需在挑战入口中手动设置 spec.ingressClassName
即可正常工作(我在旧版本中看到过),问题出在其他地方。
还有最后一个可用的(在撰写本文时)cert-manager v1.5.4
挑战入口具有“开箱即用”的正确设置:
spec:
ingressClassName: nginx
---
$ kubectl get ing
NAME CLASS HOSTS ADDRESS PORTS AGE
cm-acme-http-solver-szxfg nginx dummy-host ip_address 80 11s
工作原理(概念)
我将描述此过程的工作原理的主要步骤,以便在几乎所有情况下都可以直接进行故障排除。我将 letsencypt staging
作为 issuer
。
当 certificate
被请求创建时有一个链,issuer
跟随它完成(所有资源都有所有者 - 链中的前一个资源):
main ingress resource
-> certificate
-> certificaterequest
-> order
-> challenge
-> challenge ingress
.
了解这一点,如果出现问题,您可以通过链向下并使用 kubectl describe
命令查找问题出现的位置。
疑难解答示例
我故意在 .spec.tls.hosts
的入口中添加了一个错误的域并应用了它。下面是链条的样子(所有名称都是唯一的!):
查看证书:
$ kubectl get cert
NAME READY SECRET AGE
lets-secret-test-2 False lets-secret-test-2 15m
描述 certificate
我们感兴趣的(您可以注意到我更改了域,已经有秘密):
$ kubectl describe cert lets-secret-test-2
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Issuing 16m cert-manager Existing issued Secret is not up to date for spec: [spec.commonName spec.dnsNames]
Normal Reused 16m cert-manager Reusing private key stored in existing Secret resource "lets-secret-test-2"
Normal Requested 16m cert-manager Created new CertificateRequest resource "lets-secret-test-2-pvb25"
没什么可疑的,继续前进。
$ kubectl get certificaterequest
NAME APPROVED DENIED READY ISSUER REQUESTOR AGE
lets-secret-test-2-pvb25 True False letsencrypt-staging system:serviceaccount:cert-manager:cert-manager 19m
正在描述 certificaterequest
:
$ kubectl describe certificaterequest lets-secret-test-2-pvb25
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal cert-manager.io 19m cert-manager Certificate request has been approved by cert-manager.io
Normal OrderCreated 19m cert-manager Created Order resource default/lets-secret-test-2-pvb25-2336849393
再一次,一切看起来都很好,没有错误,前进到 order
:
$ kubectl get order
NAME STATE AGE
lets-secret-test-2-pvb25-2336849393 pending 21m
它说 pending
,那更近了:
$ kubectl describe order lets-secret-test-2-pvb25-2336849393
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Created 21m cert-manager Created Challenge resource "lets-secret-test-2-pvb25-2336849393-3788447910" for domain "dummy-domain"
Challenge
可能会有所启发,继续前进:
$ kubectl get challenge
NAME STATE DOMAIN AGE
lets-secret-test-2-pvb25-2336849393-3788447910 pending dummy-domain 23m
对其进行描述:
$ kubectl describe challenge lets-secret-test-2-pvb25-2336849393-3788447910
正在检查status
:
Status:
Presented: true
Processing: true
Reason: Waiting for HTTP-01 challenge propagation: failed to perform self check GET request 'http://dummy-domain/.well-known/acme-challenge/xxxxyyyyzzzzz': Get "http://dummy-domain/.well-known/acme-challenge/xxxxyyyyzzzzz": dial tcp: lookup dummy-domain on xx.yy.zz.ww:53: no such host
State: pending
现在很明显 domain
有问题,值得检查一下:
找到并修复了“错误”:
$ kubectl apply -f ingress.yaml
ingress.networking.k8s.io/ingress configured
证书是 ready
!
$ kubectl get cert
NAME READY SECRET AGE
lets-secret-test-2 True lets-secret-test-2 26m
使用 cert-manager 更新证书的正确方法
可以通过删除相应的密钥来更新证书,但是 documentation says it's not recommended:
Deleting the Secret resource associated with a Certificate resource is
not a recommended solution for manually rotating the private key. The
recommended way to manually rotate the private key is to trigger the
reissuance of the Certificate resource with the following command
(requires the kubectl cert-manager plugin):
kubectl cert-manager renew cert-1
Kubectl cert-manager
描述了命令安装过程 here 以及其他命令和示例。
有用的链接:
我最近将 ingress-nginx
升级到版本 1.0.3。
因此,我从 ingress 中删除了 kubernetes.io/ingress.class
注释,并用 .spec.ingressClassName
代替。
我是运行cert-manager-v1.4.0
.
今天早上我收到一封电子邮件,说我的 Let's Encrypt 证书将在 10 天后过期。我试图弄清楚它出了什么问题 - 不能肯定这完全是由于 ingress-nginx 升级造成的。
我删除了 CertificateRequest
看它是否会自行修复。我得到了一个新的 Ingress
挑战,但是:
挑战入口正确设置了
kubernetes.io/ingress.class
注释,即使我的入口有.spec.ingressClassName
而不是 - 不知道如何或为什么,但它似乎应该没事。但是,挑战入口没有被入口控制器接收到,它说:
ingress class annotation is not equal to the expected by Ingress Controller
我猜它只需要 .spec.ingressClassName
,尽管我认为注释也应该有效。
所以我在挑战入口上手动设置了 .spec.ingressClassName
。它立即被 ingress controller 看到,其余过程 运行 顺利,我得到了一个新证书 - yay.
在我看来这种情况还会再次发生,所以我需要知道如何:
说服
cert-manager
使用.spec.ingressClassName
而不是kubernetes.io/ingress.class
创建挑战入口。也许这在 1.5 或 1.6 中已修复?说服
ingress-nginx
尊重挑战入口的kubernetes.io/ingress.class
注释。我不知道为什么这不起作用。
问题
问题已通过证书续订解决,无需在挑战入口中手动设置 spec.ingressClassName
即可正常工作(我在旧版本中看到过),问题出在其他地方。
还有最后一个可用的(在撰写本文时)cert-manager v1.5.4
挑战入口具有“开箱即用”的正确设置:
spec:
ingressClassName: nginx
---
$ kubectl get ing
NAME CLASS HOSTS ADDRESS PORTS AGE
cm-acme-http-solver-szxfg nginx dummy-host ip_address 80 11s
工作原理(概念)
我将描述此过程的工作原理的主要步骤,以便在几乎所有情况下都可以直接进行故障排除。我将 letsencypt staging
作为 issuer
。
当 certificate
被请求创建时有一个链,issuer
跟随它完成(所有资源都有所有者 - 链中的前一个资源):
main ingress resource
-> certificate
-> certificaterequest
-> order
-> challenge
-> challenge ingress
.
了解这一点,如果出现问题,您可以通过链向下并使用 kubectl describe
命令查找问题出现的位置。
疑难解答示例
我故意在 .spec.tls.hosts
的入口中添加了一个错误的域并应用了它。下面是链条的样子(所有名称都是唯一的!):
查看证书:
$ kubectl get cert
NAME READY SECRET AGE
lets-secret-test-2 False lets-secret-test-2 15m
描述 certificate
我们感兴趣的(您可以注意到我更改了域,已经有秘密):
$ kubectl describe cert lets-secret-test-2
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Issuing 16m cert-manager Existing issued Secret is not up to date for spec: [spec.commonName spec.dnsNames]
Normal Reused 16m cert-manager Reusing private key stored in existing Secret resource "lets-secret-test-2"
Normal Requested 16m cert-manager Created new CertificateRequest resource "lets-secret-test-2-pvb25"
没什么可疑的,继续前进。
$ kubectl get certificaterequest
NAME APPROVED DENIED READY ISSUER REQUESTOR AGE
lets-secret-test-2-pvb25 True False letsencrypt-staging system:serviceaccount:cert-manager:cert-manager 19m
正在描述 certificaterequest
:
$ kubectl describe certificaterequest lets-secret-test-2-pvb25
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal cert-manager.io 19m cert-manager Certificate request has been approved by cert-manager.io
Normal OrderCreated 19m cert-manager Created Order resource default/lets-secret-test-2-pvb25-2336849393
再一次,一切看起来都很好,没有错误,前进到 order
:
$ kubectl get order
NAME STATE AGE
lets-secret-test-2-pvb25-2336849393 pending 21m
它说 pending
,那更近了:
$ kubectl describe order lets-secret-test-2-pvb25-2336849393
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Created 21m cert-manager Created Challenge resource "lets-secret-test-2-pvb25-2336849393-3788447910" for domain "dummy-domain"
Challenge
可能会有所启发,继续前进:
$ kubectl get challenge
NAME STATE DOMAIN AGE
lets-secret-test-2-pvb25-2336849393-3788447910 pending dummy-domain 23m
对其进行描述:
$ kubectl describe challenge lets-secret-test-2-pvb25-2336849393-3788447910
正在检查status
:
Status:
Presented: true
Processing: true
Reason: Waiting for HTTP-01 challenge propagation: failed to perform self check GET request 'http://dummy-domain/.well-known/acme-challenge/xxxxyyyyzzzzz': Get "http://dummy-domain/.well-known/acme-challenge/xxxxyyyyzzzzz": dial tcp: lookup dummy-domain on xx.yy.zz.ww:53: no such host
State: pending
现在很明显 domain
有问题,值得检查一下:
找到并修复了“错误”:
$ kubectl apply -f ingress.yaml
ingress.networking.k8s.io/ingress configured
证书是 ready
!
$ kubectl get cert
NAME READY SECRET AGE
lets-secret-test-2 True lets-secret-test-2 26m
使用 cert-manager 更新证书的正确方法
可以通过删除相应的密钥来更新证书,但是 documentation says it's not recommended:
Deleting the Secret resource associated with a Certificate resource is not a recommended solution for manually rotating the private key. The recommended way to manually rotate the private key is to trigger the reissuance of the Certificate resource with the following command (requires the kubectl cert-manager plugin):
kubectl cert-manager renew cert-1
Kubectl cert-manager
描述了命令安装过程 here 以及其他命令和示例。