Router vs Route详解 route和router的区别是什么( 四 )


(6)HAPorxy 进程会重启,从而应用修改了的配置文件 。
理解(5)中的脚本需要的一些背景知识:

  • SNI:TLS Server Name Indication (SNI) ,这是 TLS 网络协议的一种扩展,会在 TLS 握手前由客户端(client)告知服务器端(server)它将会连接的域名(hostname),使得服务器端可以根据该hostname 向客户端段返回指定的证书,从而使得服务器端能够支持多个hostname 需要的多个证书 。详情请参阅 https://en.wikipedia.org/wiki/Server_Name_Indication 。
  • OpenShift passthrough route:这种 route 的 SSL 连接不会在 router 上被 TLS 终止(termination),而是router 会将 TLS 链接透传到后端 。下文有解释 。
  • HAProxy 对 SNI 的支持:HAProxy 会根据 SNI 的信息中的 hostname 去选择特定的 backend 。详情请参阅 https://www.haproxy.com/blog/enhanced-ssl-load-balancing-with-server-name-indication-sni-tls-extension/ 。
  • HAProxy ACL:详情请参阅 https://www.haproxy.com/documentation/aloha/10-0/traffic-management/lb-layer7/acls/

从上面的蓝色注释中,我们能看到 HAProxy 进程通过 https 请求中通过 SNI 传入的域名 sitjenkins.com.cn ,在 os_tcp_be.map 文件中获取到了 backend 名称
be_tcp:sit:sitjenkins.com.cn,这样就和(2)步骤中的 backend 对应上了 。
OpenShift 的 router 使用的 HAProxy 采用基于域名的负载均衡路由方式,示例如下,具体说明请参加官方文档 。
Router vs Route详解 route和router的区别是什么


2.5 OpenShift edge 和 re-encrypt 类型的 route 与 HAProxy
HAProxy 前端:前端依然是在 443 端口监听外部 HTTPS 请求
frontend public_ssl bind :443..... # if the route is SNI and NOT passthrough enter the termination flow use_backend be_sni if sni
但是,当 TLS 终止类型不是 passthrough (edge 或者 re-encrypt)时,会使用backend be_sni 。
backend be_sni server fe_sni 127.0.0.1:10444 weight 1 send-prox
而这个后端是由本机的 127.0.0.1:10444 提供服务,因此又转到了前端 fe_sni:
frontend fe_sni # terminate ssl on edge bind 127.0.0.1:10444 ssl no-sslv3 crt /var/lib/haproxy/router/certs/default.pem crt-list /var/lib/haproxy/conf/cert_config.map accept-proxy mode http 。。。。。。# map to backend # Search from most specific to general path (host case). # Note: If no match, haproxy uses the default_backend, no other # use_backend directives below this will be processed. use_backend %[base,map_reg(/var/lib/haproxy/conf/os_edge_reencrypt_be.map)] default_backend openshift_default
map 映射文件:
sh-4.2$ cat /var/lib/haproxy/conf/os_edge_reencrypt_be.map^edgejenkins\.com\.cn(:[0-9]+)?(/.*)?$ be_edge_http:sit:jenkins-edge
Edge 类型 route 的 HAProxy 后端:
backend be_edge_http:sit:jenkins-edge mode http option redispatch option forwardfor balance leastconn timeout check 5000ms ..... server pod:jenkins-1-bqhfj:jenkins:10.128.2.15:8080 10.128.2.15:8080 cookie 71c6bd03732fa7da2f1b497b1e4c7993 weight 256 check inter 5000ms server pod:jenkins-1-h2fff:jenkins:10.131.0.10:8080 10.131.0.10:8080 cookie fa8d7fb72a46958a7add1406e6d26cc8 weight 256 check inter 5000ms
Re-encrypt 类型 route 的 HAProxy 后端:
# Plain http backend or backend with TLS terminated at the edge or a# secure backend with re-encryption.backend be_secure:sit:reencryptjenkins.com.cn mode http 。。。。http-request set-header X-Forwarded-Host %[req.hdr(host)] http-request set-header X-Forwarded-Port %[dst_port] http-request set-header X-Forwarded-Proto http if !{ ssl_fc } http-request set-header X-Forwarded-Proto https if { ssl_fc } http-request set-header X-Forwarded-Proto-Version h2 if { ssl_fc_alpn -i h2 } server pod:jenkins-1-bqhfj:jenkins:10.128.2.15:8080 10.128.2.15:8080 cookie ... weight 256 ssl verifyhost jenkins.sit.svc verify required ca-file /var/run/secrets/kubernetes.io/serviceaccount/service-ca.crt check inter 5000ms #与后端的链路采用 ssl 加密,并且要检查hostname server pod:jenkins-1-h2fff:jenkins:10.131.0.10:8080 10.131.0.10:8080 cookie ... weight 256 ssl verifyhost jenkins.sit.svc verify required ca-file /var/run/secrets/kubernetes.io/serviceaccount/service-ca.crt check inter 5000ms

推荐阅读