集群设置:
速览(redis服务IP为10.233.90.37
时):
psql 10.233.90.37:6379
=>成功主机:psql 10.233.90.37:80
=>成功
荚(在任何命名空间中)psql 10.233.90.37:6379
=>超时
psql redis:6379
=>超时psql redis.namespace.svc.cluster.local
=>超时psql redis:80
=>成功psql redis.namespace.svc.cluster.local:80
=>成功Kubernetes服务(NodePort,LoadBalancer,ClusterIP)将不会转发Pod的80和443以外的端口。 Pod端口可以不同,但是如果服务端口不是80或443,则对服务的请求将超时。
从主机到Kubernetes服务的请求在80和443以外的其他端口上正常工作。从Pod到其他端口的BUT请求失败。
从pod到端口80和443上的服务的请求都可以正常工作。
user@host: curl 10.233.90.37:80
200 OK
user@host: curl 10.233.90.37:5432
200 OK
# ... exec into Pod
```bash
bash-4.4# curl 10.233.90.37:80
200 OK
bash-4.4# curl 10.233.90.37:5432
Error ... timeout ...
user@host: kubectl get NetworkPolicy -A
No resources found.
user@host: kubectl get PodSecurityPolicy -A
No resources found.
示例服务:
apiVersion: v1
kind: Service
metadata:
labels:
app: redis
name: redis
namespace: namespace
spec:
ports:
- port: 6379
protocol: TCP
targetPort: 6379
name: redis
- port: 80
protocol: TCP
targetPort: 6379
name: http
selector:
app: redis
type: NodePort # I've tried ClusterIP, NodePort, and LoadBalancer
这种疯狂的Kubernetes服务端口行为是怎么回事!?
调试后,我发现它可能与ufw和iptables配置有关。
ufw设置(非常允许)
Status: enabled
80 ALLOW Anywhere
443 ALLOW Anywhere
6443 ALLOW Anywhere
2379 ALLOW Anywhere
2380 ALLOW Anywhere
10250/tcp ALLOW Anywhere
10251/tcp ALLOW Anywhere
10252/tcp ALLOW Anywhere
10255/tcp ALLOW Anywhere
179 ALLOW Anywhere
5473 ALLOW Anywhere
4789 ALLOW Anywhere
10248 ALLOW Anywhere
22 ALLOW Anywhere
80 (v6) ALLOW Anywhere (v6)
443 (v6) ALLOW Anywhere (v6)
6443 (v6) ALLOW Anywhere (v6)
2379 (v6) ALLOW Anywhere (v6)
2380 (v6) ALLOW Anywhere (v6)
10250/tcp (v6) ALLOW Anywhere (v6)
10251/tcp (v6) ALLOW Anywhere (v6)
10252/tcp (v6) ALLOW Anywhere (v6)
10255/tcp (v6) ALLOW Anywhere (v6)
179 (v6) ALLOW Anywhere (v6)
5473 (v6) ALLOW Anywhere (v6)
4789 (v6) ALLOW Anywhere (v6)
10248 (v6) ALLOW Anywhere (v6)
22 (v6) ALLOW Anywhere (v6)
Kubespray部署失败,并且禁用了ufw。启用ufw后,Kubespray部署成功。
部署后,禁用ufw将允许Pod在80、443以外的端口上进行连接。但是,禁用ufw时群集将崩溃。
知道发生了什么吗?我是否在ufw config中缺少端口...?似乎很奇怪,要成功安装kubespray,就需要ufw。
答案 0 :(得分:2)
LoadBalancer
服务公开了1个外部IP,外部客户端或用户将使用该IP与您的应用进行连接。在大多数情况下,您希望您的LoadBalancer
服务在端口80
上侦听HTTP流量,而在端口443
上侦听https。因为您希望用户输入http://yourapp.com
或https://yourapp.com
而不是http://yourapp.com:3000
。
例如,您似乎在示例服务yaml中混合了不同的服务,例如服务类型为nodePort
时使用NodePort
。您可以尝试:
apiVersion: v1
kind: Service
metadata:
labels:
app: redis
role: master
tier: backend
name: redis
spec:
ports:
- port: 80
protocol: TCP
targetPort: 6379 // service will target containers on port 6379
name: someName
selector:
app: redis
role: master
tier: backend
type: LoadBalancer