Kubernetes服务不会转发到80和443以外的端口

时间:2019-07-02 01:57:51

标签: kubernetes devops project-calico coredns cni

集群设置:

  • 操作系统:Ubuntu 18.04,带有Kubernetes推荐的安装设置
  • 集群使用Kubespray启动
  • CNI是印花棉布

速览(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。

1 个答案:

答案 0 :(得分:2)

LoadBalancer服务公开了1个外部IP,外部客户端或用户将使用该IP与您的应用进行连接。在大多数情况下,您希望您的LoadBalancer服务在端口80上侦听HTTP流量,而在端口443上侦听https。因为您希望用户输入http://yourapp.comhttps://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