使用边缘/代理节点证书身份

时间:2019-07-09 15:06:58

标签: docker kubernetes haproxy

我将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供其他尝试查找的人使用克服这些困难的方法。

2 个答案:

答案 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列表中。