我正在使用 cert-manager 操作 k8s 集群以获取 letsencrypt 证书。我刚刚设置了 nifi (https://github.com/cetic/helm-nifi) 在此集群内,工作负载公开由相应服务抽象的 TLS 安全端口。
我设置了一个入口,将流量路由到相应的 nifi 服务。证书按预期正确获取,但当我502 bad gateway
尝试通过入口访问服务时,我不断收到一条消息。
入口控制器揭示了原因:
2020/11/07 15:45:20 [error] 10687#10687: *154495249 SSL_do_handshake() failed (SSL: error:14094412:SSL routines:ssl3_read_bytes:sslv3 alert bad certificate:SSL alert number 42) while SSL handshaking to upstream, client: 134.3.215.120, server: https://[my-domain], request: "GET /favicon.ico HTTP/2.0", upstream: "https://10.42.1.137:8443//favicon.ico", host: "https://[my-domain]", referrer: "https://[my-domain]"
这是我的入口定义:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
cert-manager.io/cluster-issuer: letsencrypt-prod
ingress.kubernetes.io/ssl-redirect: "true"
kubernetes.io/ingress.class: nginx
kubernetes.io/tls-acme: "true"
nginx.ingress.kubernetes.io/backend-protocol: HTTPS
nginx.ingress.kubernetes.io/rewrite-target: /$2
nginx.ingress.kubernetes.io/secure-backends: "true"
generation: 1
labels:
app: nifi
chart: nifi-0.5.5
heritage: Helm
release: nifi
name: nifi-ingress
namespace: nifi
resourceVersion: "138180326"
uid: a6b561a8-1fc0-11eb-b2e1-6a9097f8076d
spec:
rules:
- host: [my-domain]
http:
paths:
- backend:
serviceName: nifi
servicePort: 5422
path: /
tls:
- hosts:
- [my-domain]
secretName: nifi-tls
看起来 ingress 想要建立一个被 pod 拒绝的 TLS 连接(很明显),但我不知道如何解决这个问题。似乎很明显,在 nifi pod 上安装自签名证书就可以完成这项工作,但我不知道如何做到这一点,我宁愿相信我在这里做错了什么,因为这应该是开箱即用的。
感谢任何提示或想法。
更新/澄清:
我现在用标准配置进行设置,以便于理解。核心问题来自入口控制器日志:
2020/11/18 23:01:25 [error] 15529#15529: *166867031 SSL_do_handshake() failed (SSL: error:14094412:SSL routines:ssl3_read_bytes:sslv3 alert bad certificate:SSL alert number 42) while SSL handshaking to upstream, client: xxx, server: [nifi-ingress-hostname], request: "GET /favicon.ico HTTP/2.0", upstream: "https://[nifi-pod]:8443/favicon.ico", host: "[nifi-hostname]", referrer: "https://[nifi-ingress-hostname]"
[nifi-ingress-hostname] 是将流量路由到端口 8443 上的 nifi 服务的入口。该服务将流量转发到 [nifi-pod]:8443。[nifi-pod] 上的服务在 8443 上监听加密通信。
但是问题似乎是由于 SSL 握手失败,导致通信入口到 pod 的最后一步不起作用。我在入口处添加了这些注释:
nginx.ingress.kubernetes.io/secure-backends: "true"
nginx.ingress.kubernetes.io/ssl-passthrough: "true"
nginx.ingress.kubernetes.io/ssl-redirect: "true"
将加密流量直接传递给 pod,但这没有效果。不知何故,似乎我必须更改 Helm Chart 以将 pod 上的服务更改为 http 而不是 https,或者确保使用自签名证书进行加密连接,或者我遗漏了什么?