Traefik和Keycloak:错误SSL_ERROR_RX_RECORD_TOO_LONG

时间:2018-09-19 15:53:34

标签: kubernetes haproxy keycloak traefik

我使用HAProxy将所有请求从80端口重定向到443,并使用NodePort输入traefik-ingress-controller(在Kubernetes集群中为v1.6.6)。

HAProxy.conf

frontend http-frontend                                                                                                               
       bind *:80                                                                                                                     
       reqadd X-Forwarded-Proto:\ http                                                                                               
       default_backend http_app                                                                                                      

frontend https-frontend                                                                                                             
        bind *:443 ssl crt /etc/ssl/certs/my-cert.pem                                                                   
        reqadd X-Forwarded-Proto:\ https                                                                                            
        default_backend traefik_app                                                                                                 

backend http_app                                                                                                                    
    redirect scheme https if !{ ssl_fc }                                                                                        

backend traefik_app                                                                                                             
    server traefik localhost:30010 check

在Kubernetes集群上运行的每个应用程序都有一个Ingress。

其中有一个带有该入口的Keycloak吊舱(v4.1.0,用于身份验证):

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: keycloak
  annotations:
    kubernetes.io/ingress.class: traefik
spec:
  rules:
  - host: login.myapp.it
    http:
      paths:
      - backend:
          serviceName: keycloak
          servicePort: 8080

这里有一张图片:

enter image description here

当我连接到https://login.myapp.it/auth/admin/时,我将重定向到 https://login.myapp.it:80/auth/admin/master/console/(注意端口80),我收到了SSL_ERROR_RX_RECORD_TOO_LONG错误。

有人通过代理背后的密钥斗篷针对此重定向问题提供了一些提示吗?

谢谢。

2 个答案:

答案 0 :(得分:1)

听起来像是您的入口缺少TLS证书:

$ kubectl -n kube-system create secret tls your-k8s-tls-secret --key=tls.key --cert=tls.crt

然后:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: keycloak
  annotations:
    kubernetes.io/ingress.class: traefik
spec:
  tls:
  - secretName: your-k8s-tls-secret
  rules:
  - host: login.myapp.it
    http:
      paths:
      - backend:
          serviceName: keycloak
          servicePort: 8080

希望有帮助!

答案 1 :(得分:0)

我使用以下traefik注释解决了我的问题:

traefik.frontend.passHostHeader:“真”

将客户端 Host 标头转发到后端。

这里有一个完整的入口示例:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: keycloak
  annotations:
    kubernetes.io/ingress.class: traefik
    traefik.frontend.passHostHeader: "true"
spec:
  rules:
  - host: login.myapp.it
    http:
      paths:
      - backend:
          serviceName: keycloak
          servicePort: 8080

或者,我可能已经在 haproxy.cfg 中添加了以下内容:

重新请求X-Forwarded-Port:\ 443