J'ai installé un nouveau cluster kubernetes sur GKE en utilisant le contrôleur nginx-ingress . TLS ne fonctionne pas, il utilise les faux certificats.
Il y a beaucoup de détails de configuration, j'ai donc fait un dépôt - https://github.com/jobevers/test_ssl_ingress
Bref, les étapes ont été
La configuration nginx-ingress provient de https://zihao.me/post/cheap-out-google-container-engine-load-balancer/ (et ressemble beaucoup à de nombreux exemples de le dépôt d'entrée-nginx).
Mon ingress.yaml est presque identique à l'exemple
Quand je fais du curl, je reçois
$ curl -kv https://35.196.134.52
[...]
* common name: Kubernetes Ingress Controller Fake Certificate (does not match '35.196.134.52')
[...]
* issuer: O=Acme Co,CN=Kubernetes Ingress Controller Fake Certificate
[...]
ce qui montre que j'utilise toujours les certificats par défaut.
Comment suis-je censé l'obtenir en utilisant le mien?
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: test-ssl-ingress
annotations:
kubernetes.io/ingress.class: "nginx"
spec:
tls:
- secretName: tls-secret
rules:
- http:
paths:
- path: /
backend:
serviceName: demo-echo-service
servicePort: 80
kubectl create secret tls tls-secret --key tls/privkey.pem --cert tls/fullchain.pem
Débogage plus loin, le certificat est trouvé et existe sur le serveur:
$ kubectl -n kube-system exec -it $(kubectl -n kube-system get pods | grep ingress | head -1 | cut -f 1 -d " ") -- ls -1 /ingress-controller/ssl/
default-fake-certificate-full-chain.pem
default-fake-certificate.pem
default-tls-secret-full-chain.pem
default-tls-secret.pem
Et, d'après le journal, je vois
kubectl -n kube-system log -f $(kubectl -n kube-system get pods | grep ingress | head -1 | cut -f 1 -d " ")
[...]
I1013 17:21:45.423998 6 queue.go:111] syncing default/test-ssl-ingress
I1013 17:21:45.424009 6 backend_ssl.go:40] starting syncing of secret default/tls-secret
I1013 17:21:45.424135 6 ssl.go:60] Creating temp file /ingress-controller/ssl/default-tls-secret.pem236555242 for Keypair: default-tls-secret.pem
I1013 17:21:45.424946 6 ssl.go:118] parsing ssl certificate extensions
I1013 17:21:45.743635 6 backend_ssl.go:102] found 'tls.crt' and 'tls.key', configuring default/tls-secret as a TLS Secret (CN: [...])
[...]
Mais, en regardant le nginx.conf, il utilise toujours les faux certificats:
$ kubectl -n kube-system exec -it $(kubectl -n kube-system get pods | grep ingress | head -1 | cut -f 1 -d " ") -- cat /etc/nginx/nginx.conf | grep ssl_cert
ssl_certificate /ingress-controller/ssl/default-fake-certificate.pem;
ssl_certificate_key /ingress-controller/ssl/default-fake-certificate.pem;
Il s'avère que la définition d'entrée doit ressembler à:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: test-ssl-ingress
annotations:
kubernetes.io/ingress.class: "nginx"
spec:
tls:
- hosts:
- app.example.com
secretName: tls-secret
rules:
- Host: app.example.com
http:
paths:
- path: /
backend:
serviceName: demo-echo-service
servicePort: 80
L'entrée hôte sous les règles doit correspondre à l'une des entrées hôtes sous tls.
Je viens juste de faire face à ce problème avec v0.30.0
et il s'avère que d'avoir une configuration d'entrée comme celle-ci sans nom d'hôte explicite est ok:
spec:
tls:
- secretName: ssl-certificate
De mon côté, le problème était que j'avais une annotation sur l'entrée avec un int64
valeur qui n'a pas été analysée correctement et inférieure à celle définie kubernetes.io/ingress.class
donc essentiellement nginx n'a pas trouvé le contrôleur d'entrée correctement indiqué dans les journaux:
ignoring add for ingress <ingressname> based on annotation kubernetes.io/ingress.class with value
L'utilisation de chaînes dans les annotations a donc résolu le problème.