0

集群设置:

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

速览(当 redis 服务 ip 为 时10.233.90.37):

  • 主机:psql 10.233.90.37:6379=> 成功
  • 主机:psql 10.233.90.37:80=> 成功

  • Pod(在任何命名空间中)psql 10.233.90.37:6379=> 超时

  • Pod(在任何命名空间中)psql redis:6379=> 超时
  • Pod(在任何命名空间中)psql redis.namespace.svc.cluster.local=> 超时
  • Pod(在任何命名空间中)psql redis:80=> 成功
  • Pod(在任何命名空间中)psql redis.namespace.svc.cluster.local:80=> 成功

Kubernetes 服务(NodePort、LoadBalancer、ClusterIP)不会为 pod 转发 80 和 443 以外的端口。Pod 端口可以不同,但​​如果 Service 端口不是 80 或 443,则对 Service 的请求会超时。

从主机到 Kubernetes 服务的请求在 80 和 443 以外的端口上工作。但是从 pod 到这些其他端口的请求失败。

从 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 config 有关。

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。Kubespray 部署成功并启用了 ufw。

部署后,禁用 ufw 将允许 pod 连接到 80、443 以外的端口。但是,禁用 ufw 时集群会崩溃。

知道发生了什么吗?我是否缺少 ufw 配置中的端口....?kubespray 安装成功需要 ufw 似乎很奇怪。

4

1 回答 1

2

LoadBalancer服务公开 1 个外部 IP,外部客户端或用户将使用它来连接您的应用程序。在大多数情况下,您希望您的LoadBalancer服务在端口上侦听80http 流量和在端口上侦听443https。因为您希望您的用户输入http://yourapp.comorhttps://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
于 2019-07-02T07:06:05.123 回答