我将haproxy用作堡垒服务器/群集网关,因为网络中只有某些节点可以直接访问外部网络。我的内部节点是kubernetes群集的一部分,并且需要能够从群集外部需要证书身份的私有注册表中提取图像。
k8s群集内部节点->边缘节点上的haproxy-> docker注册表
我正在尝试在haproxy.cfg中配置我的back_end以路由到docker注册表,并使用边缘节点的证书标识更新请求。 (内部节点没有docker注册表可接受的证书,并且不允许我在内部节点上托管外部节点的证书。)我现在所拥有的如下所示...
frontend ft_ssl
bind <boxIP>:443
mode http
default_backend bk_global_import_registry_certs
backend bk_global_import_registry_certs
mode http
balance roundrobin
server registry_alias-0 <registryIP>:443 ssl ca-file fullyqualified/ca.crt crt fullyqualified/file.pem check
server registry_alias-1 <registryIP2>:443 ssl ca-file fullyqualified/ca.crt crt fullyqualified/file.pem check
我目前在/etc/systemd/system/docker.service.d/http-proxy.conf中有HTTPS_PROXY setting,并且收到了400 Bad Request。以下是已清理的日志消息,仅更改为删除IP或拼写错误。
内部IP:randomPort [09 / Jul / 2019:13:28:08.659] ft_ssl bk_global_import_registry_certs 0/0/10/5/15 400350------ 1/1/0/0/0 0/0 {}“ CONNECT externalFQDN:443 HTTP / 1.1”
对于那些通过kubernetes或docker标签查看此信息的人,我也考虑过设置pull-through cache,但意识到这仅适用于Docker的公共注册表-请参见Docker GitHub issue 1431供其他尝试查找的人使用克服这些困难的方法。
答案 0 :(得分:1)
发布有助于我们解决问题的答案,以防其他人...
来自内部节点的所有流量现在都路由到HAProxy。
我不再使用/etc/systemd/system/docker.service.d/http-proxy.conf中的HTTPS_PROXY设置。通过代理进行代理是不合适的,因为我无法使用内部节点的证书针对Docker注册表进行身份验证。
现在从内部节点,我将docker注册表视为不安全的注册表,方法是将其地址添加到insecure-registries中的/etc/docker/daemon.json中:[]。
我们现在可以使用在HAProxy后端上向前传递的证书访问内部私有注册表。我们确实在前端验证证书,但是由于我们在不安全的注册表中列出了注册表,因此Docker接受证书名称不匹配。
已注意到一个副作用:使用“默认”泊坞窗提取映像而不指定前缀不会成功使用我们的解决方案。例如,要从Docker中拉出,请从Registry-1.docker.io/imageName:imageVersion中拉出,而不仅仅是imageName:imageVersion。
答案 1 :(得分:0)
我可能会误会,但据我所知Haproxy不能用作直接HTTP代理,它只能用作反向HTTP代理。您应该使用Squid或类似的东西作为直接HTTP代理。
如果您希望Haproxy像您一样终止SSL,则需要将Docker映像的主机名部分更改为Haproxy节点的主机名。您还应确保Docker守护程序信任Haproxy证书,或将Haproxy添加到所有Kube节点上的INSECURE_REGISTRIES列表中。