我已经有一个运行HAProxy的主机。在我使用Kubernetes之前,它就已经开始运行了。它可以完美地作为反向代理和SSL终止器,用于各种主机上的各种Docker容器中的各种web内容。
现在我有一个Kubernetes集群,并在其他一些机器上运行。我已经创建了NodePort Service,它在每个工作节点上公开端口30080,如下所示:
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(不是集群的一部分)的机器上,我可以成功卷曲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之间的区别是什么?
谢谢。
SELinux是不同的。也就是说,HAProxy主机(不是集群节点)上的SELinux:
SELinux只允许web服务器向一组有限的端口进行出站连接
也就是说,如果不打开"客户端"(在本例中是HAProxy服务器)上的端口,就不能向NodePort范围(30000-32768)内的任何端口发出出站http请求。
sudo semanage port --add --type http_port_t --proto tcp 30080