Kubernetes 以istio ingressgateway作为SSL后端的Haproxy

Kubernetes 以istio ingressgateway作为SSL后端的Haproxy,kubernetes,haproxy,istio,envoyproxy,Kubernetes,Haproxy,Istio,Envoyproxy,最初,我使用tcp模式进行测试,这是可行的。haproxy tcp直通配置如下所示: frontend https_in bind *:443 mode tcp option forwardfor option tcplog log global default_backend https_backend backend https_backend mode tcp

最初,我使用tcp模式进行测试,这是可行的。haproxy tcp直通配置如下所示:

frontend https_in
        bind *:443
        mode tcp
        option forwardfor
        option tcplog
        log global
        default_backend https_backend

backend https_backend
        mode tcp
        server s1 10.21.0.60:31390 check
        server s2 10.21.0.169:31390 check
        server s3 10.21.0.173:31390 check
模式http配置应该是什么样子?我需要解密流量,注入一些报头(如forwarded for)并再次加密,将其发送到ssl istio入口网关后端

我的配置尝试多次(但均未成功)以下是一个快照:

frontend https_in
    mode http
    bind *:443 ssl crt /etc/haproxy/prod.pem crt /etc/haproxy/dev.pem crt /etc/haproxy/stg.pem no-sslv3

    option http-server-close
    option forwardfor
    reqadd X-Forwarded-Proto:\ https
    reqadd X-Forwarded-Port:\ 443

    rspadd  Strict-Transport-Security:\ max-age=15768000

    tcp-request inspect-delay 5s
    tcp-request content accept if { req_ssl_hello_type 1 }
    acl acl_app1 req_ssl_sni -i mydomain.test
    use_backend https_backend if acl_app1

backend https_backend
    mode http
    server s1 10.21.0.60:31390 check ssl verify none
在haproxy日志中我看到

haproxy[12734]: Server https_backend/s1 is DOWN, reason: Layer6 invalid response, info: "SSL handshake failure (Connection reset by peer)", check duration: 1ms. 0 active and 0 backup servers left. 0 sessions active, 0 requeued, 0 remaining in queue.
haproxy[12734]: Server https_backend/s1 is DOWN, reason: Layer6 invalid response, info: "SSL handshake failure (Connection reset by peer)", check duration: 1ms. 0 active and 0 backup servers left. 0 sessions active, 0 requeued, 0 remaining in queue.
haproxy[12734]: backend https_backend has no server available!
如果我删除该复选框,但仍尝试查询haproxy:

haproxy[13381]: https_in~ https_in/<NOSRV> -1/-1/-1/-1/0 503 213 - - SC-- 1/1/0/0/0 0/0 "GET / HTTP/1.1"
haproxy[13381]:https_in~https_in/-1/-1/-1/-0 503 213--SC--1/1/0/0/0/0“GET/HTTP/1.1”
我无法计算SNI设置从haproxy传递到istio以使其工作


我在调试日志级别上的envoyproxy和istio ingressgateway日志中也找不到任何有用的内容。

您发布此问题已经有一段时间了,但我遇到了相同的问题。因此,我能够使用
openssl s\u client
命令验证HAProxy错误

openssl s_客户端-connectip:port
将返回一个
write:errno=104
,这意味着它是一个由对等方重置的
连接
错误

但是,当我提供服务器名称时,我能够成功地连接到后端:
openssl s_client-connectip:port-servername server.name

在从HAProxy中挖掘后端选项后,我偶然发现了该选项,其中提到:

此选项允许您指定进行健康检查时要使用的SNI 通过SSL。只能使用字符串来设置

因此,我使用此选项来配置后端服务器,如下所示

server lokomotive-contour ip:port ssl verify none check-sni server.name sni str(server.name) check
关键部分是前面提到的
检查sni
选项;这将在运行状况检查期间配置SNI

但是我还发现,要使通过该后端的常规流量路由正常工作,必须使用
sni str()
选项


ps:请确保您使用的是HAProxy 1.8或更高版本,因为仅从1.8开始支持
检查sni
,我将授予您一把金铲。我解决了这个问题,或者说istio ingress为我解决了这个问题,因为它缺少一公吨的“常规入口功能”。现在我正在使用整个istio服务mesh包(mtls、jaeger、许多mtls发起和出口网关),但我放弃了入口网关(因为它是他妈的无用和有问题的)。我的入口点是:haproxy(tcp,仅适用于proxyprotocol)->防火墙/内部网络交叉->k8s nginx控制器(注入istio侧车)