Posted at

cert-managerのingress-shimのyamlを書き間違えて証明書が発行されなかった

More than 1 year has passed since last update.

cert-manager + nginx-ingressで証明書が発行されないヘマをやらかしたので備忘。

その日は疲れててこんなyamlを書いてしまいました。

---

apiVersion: certmanager.k8s.io/v1alpha1
kind: Issuer
metadata:
name: letsencrypt-staging
namespace: mynamespace
spec:
acme:
server: https://acme-staging-v02.api.letsencrypt.org/directory
email: email@example.com
privateKeySecretRef:
name: my-key-name
http01: {}
---

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: nginx
certmanager.k8s.io/issuer: letsencrypt-staging
certmanager.k8s.io/acme-challenge-type: http01
name: front-door
namespace: mynamespace
spec:
rules:
- host: www.example.com
http:
paths:
- backend:
serviceName: my-backend-service
servicePort: 8080
path: /
tls:
- secretName: my-key-name # <<< ※これがダメ
hosts:
- www.example.com

---

一見ingress-shimのドキュメントにあるようなシンプルなものですよね。

でもいつまで待っても証明書が発行できません。


原因

よく見たらingressのspec.tls.secretNameIssuerで指定したものと同じになってました。

そりゃ発行されないですよね。

ちなみにそのときのログにはこんなのが出てました。


Ingress Controllerのログ

$ kubectl logs -f -n <ingress-nginxのnamespace> <ingress controller Pod名>

W0927 00:00:00.805191 10 backend_ssl.go:48] Error obtaining X.509 certificate: Secret "mynamespace/my-key-name" contains no keypair or CA certificate
W0927 00:00:00.805358 10 controller.go:1058] Error getting SSL certificate "mynamespace/my-key-name": local SSL certificate mynamespace/my-key-name was not found. Using default certificate


CertManager Controllerのログ

$ kubectl logs -f -n <cert-managerのnamespace> <cert-manager controller Pod名>

I0927 00:00:00.100894 1 controller.go:171] certificates controller: syncing item 'mynamespace/my-key-name'
E0927 00:00:00.102084 1 controller.go:180] certificates controller: Re-queuing item "mynamespace/my-key-name" due to error processing: no data for "tls.crt" in secret 'mynamespace/my-key-name'

# 同じようなログが延々続く


解決方法

単純にingressのspec.tls.secretNameIssuerで指定したものとは違うものにすればOKです。

apiVersion: extensions/v1beta1

kind: Ingress

# [...]

spec:
rules:
- host: www.example.com
http:
paths:
- backend:
serviceName: my-backend-service
servicePort: 8080
path: /
tls:
- secretName: www.example.com.tls # <<<ここを修正
hosts:
- www.example.com

通常はあまり引っかからない問題と思いますが、ドキュメントからyamlをコピペして必要な箇所を直すってやるときについうっかり修正してしまうとこうなります。気をつけましょう(自戒)。

以上です。