【问题标题】:HAProxy Not Working with Kubernetes NodePort for Backend (Bare Metal)HAProxy 不适用于后端的 Kubernetes NodePort(裸机)
【发布时间】:2021-10-29 15:07:54
【问题描述】:

我已经有一台运行 HAProxy 的主机。在我对 Kubernetes 做任何事情之前,它就一直在运行。它可以完美地作为反向代理和 SSL 终结器,用于各种其他主机上的各种 Docker 容器中的各种 Web 事物。

现在我有一个 Kubernetes 集群并在其他一些机器上运行。我已经创建了在每个工作节点上公开端口 30080 的 NodePort 服务,如下所示:

apiVersion: v1
kind: Service
metadata:
  name: snginx
  labels:
    app: nginx
spec:
  type: NodePort
  externalTrafficPolicy: Local    #Cluster or Local
  selector:
    app: nginx
  ports:
  - protocol: TCP
    port: 8080
    targetPort: 80
    nodePort: 30080

从运行 HAProxy 的机器(不是集群的一部分),我可以成功地 curl NodePort( curl 10.0.0.20:30080 ),我得到“欢迎使用 nginx!...”但是,如果我设置那个 NodePort 作为 HAProxy 中的后端,我得到一个 503“没有可用的服务器”,并且 HAProxy 流量日志说:

localhost haproxy[18489]: [redactedIP]:49399 [30/Aug/2021:19:24:00.764] http-in~ load/load 66/0/-1/-1/67 503 212 - - SC-- 1/1/0/0/3 0/0 "GET / HTTP/1.1"

haproxy 管理日志说:

Aug 30 20:07:13 localhost haproxy[18839]: Server load/load is DOWN, reason: Layer4 connection problem, info: "General socket error (Permission denied)"

但是,我已经禁用了防火墙

sudo systemctl disable --now firewalld

并验证状态未运行。此外,我安装集群时禁用了 SELinux。另外,我可以 ping 10.0.0.20 就好了。

“load”是我用于测试负载平衡的主机名(即 load.mydomain.com)。

此外,如果我在物理路由器上使用 PAT 从建筑物外部直接路由到该 NodePort,它会按预期工作。

什么给了?代理请求和 curl 有什么区别?

谢谢。

【问题讨论】:

    标签: kubernetes haproxy kube-proxy


    【解决方案1】:

    SELinux 是不同的。即HAProxy主机(不是集群节点)上的SELinux:

    “SELinux 只允许 Web 服务器与一组有限的端口建立出站连接”

    也就是说,如果不在“客户端”(本例中为 HAProxy 服务器)上打开该端口,您就无法向 NodePort 范围 (30000-32768) 中的任何端口发出出站 http 请求。

    sudo semanage port --add --type http_port_t --proto tcp 30080
    

    【讨论】:

      猜你喜欢
      • 2021-12-10
      • 2020-10-14
      • 2019-05-14
      • 2017-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-06
      • 1970-01-01
      相关资源
      最近更新 更多