使用HAProxy Ingress Controller时,TLS握手间歇性失败

时间:2020-09-29 09:02:09

标签: ssl kubernetes haproxy-ingress

我正在使用HAProxy Ingress Controller(https://github.com/helm/charts/tree/master/incubator/haproxy-ingress)对我的应用程序进行TLS终止。 我有一个简单的Node.JS服务器,它在8080上侦听HTTP,并在1935年作为一个简单的回显服务器(不是HTTP)。
我使用HAProxy Ingress控制器将端口包装在TLS中。 (8080-> 443(HTTPS),1935-> 1936(TCP + TLS))
我安装了HAProxy Ingress Controller,

helm upgrade --install haproxy-ingress incubator/haproxy-ingress \
   --namespace test \
  -f ./haproxy-ingress-values.yaml \
  --version v0.0.27

,其中haproxy-ingress-values.yaml的内容是


controller:
  ingressClass: haproxy
  replicaCount: 1
  service:
    type: LoadBalancer
  tcp:
    1936: "test/simple-server:1935:::test/ingress-cert"
  nodeSelector:
    "kubernetes.io/os": linux
defaultBackend:
  nodeSelector:
    "kubernetes.io/os": linux

这是我的入口:


apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: ingress
  annotations:
    kubernetes.io/ingress.class: "haproxy"
spec:
  tls:
  - hosts:
    secretName: ingress-cert
  rules:
    - http:
        paths:
        - path: /
          backend:
            serviceName: "simple-server"
            servicePort: 8080

证书是自签名的。 如果我使用

测试TLS握手
echo | openssl s_client -connect "<IP>":1936

有时(失败次数的1/3)失败

CONNECTED(00000005)
139828847829440:error:1408F10B:SSL routines:ssl3_get_record:wrong version number:../ssl/record/ssl3_record.c:332:
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 5 bytes and written 316 bytes
Verification: OK
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
Early data was not sent
Verify return code: 0 (ok)
---

对于443端口,不会发生相同的问题。
有关重现该问题的详细设置,请参见here

[编辑]
正如@JoaoMorais指出的,这是因为默认的统计端口是1936。 尽管我没有打开统计信息,但看起来它仍然会干扰行为。
有两种对我有用的解决方案。

  • 将我的服务的1936年端口更改为另一个端口
  • 在安装haproxy-inress图表时,通过添加如下所示的值来更改统计信息端口。
controller:
  stats:
    port: 5000

1 个答案:

答案 0 :(得分:2)

默认情况下,HAProxy允许在相同或其他前端/侦听部分以及其他haproxy进程之间重用相同的端口号。可以在global部分中添加noreuseport来更改此设置。

默认的HAProxy Ingress配置使用端口号1936公开统计信息。如果此类端口号被tcp代理重用,则传入的请求将在两个前端之间分配-有时将调用您的服务,有时会调用stats页面。将tcp代理或统计信息页面(doc here)更改为另一个端口应该可以解决此问题。

相关问题