【问题标题】:How to make service TCP/UDP ports externally accessible in Kubernetes?如何在 Kubernetes 中使服务 TCP/UDP 端口可以从外部访问?
【发布时间】:2018-11-14 08:39:40
【问题描述】:

我有很多租户在一个 Kubernetes 集群(在 AWS 上)上运行,每个租户都有一个 Pod,它暴露一个 TCP 端口(不是 HTTP)和一个 UDP 端口。

  • 我不需要负载平衡功能。
  • 该方法应该公开一个外部可用的 IP 地址,每个租户都有一个专用端口
  • 我不想将节点直接暴露在互联网上

到目前为止,我有以下服务:

apiVersion: v1
kind: Service
metadata:
  name: my-service
  labels:
    app: my-app
spec:
  type: NodePort
  ports:
    - port: 8111
      targetPort: 8111
      protocol: UDP
      name: my-udp
    - port: 8222
      targetPort: 8222
      protocol: TCP
      name: my-tcp
  selector:
    app: my-app

要走的路是什么?

【问题讨论】:

  • 你需要使用kubernetes服务。这是我为可能对您有用的类似问题写的详细答案 - stackoverflow.com/a/50080291/1220089。我不是投反对票的人,但我怀疑你的问题是重复的。
  • 您可以使用 Ingress(GKE 支持但我不了解 AWS)并将其附加到反向代理。

标签: kubernetes


【解决方案1】:
  • Deploy AWS 集群上的 NGINX 入口控制器
  • 将您的服务 my-service 类型从 NodePort 更改为 ClusterIP
  • ingress-nginx 命名空间中编辑 configMap tcp-services 添加:
data:
  "8222": your-namespace/my-service:8222
  • configMap udp-services 相同:
data:
  "8111": your-namespace/my-service:8111

现在,您可以使用 nginx 控制器 IP <ip:8222> (TCP) 和 <ip:8111> (UDP) 从外部访问您的应用程序

【讨论】:

【解决方案2】:

@ffledgling 提供的description 正是你所需要的。

但我不得不提一下,如果要公开端口,则必须使用负载均衡器或将节点公开到 Internet。例如,您可以向 Internet 公开一个节点并只允许访问一些必要的端口。

【讨论】:

  • AWS 负载均衡器不支持 UDP,仅支持 TCP。此外,我不想为每个租户创建一个 AWS 负载均衡器 => 昂贵。如果我只暴露一个节点,那么这个节点确实会成为单点故障。
  • @mitchkman 实际上,除了为 UDP 和 TCP 公开节点或为 TCP 使用单独的 AWS ELB 之外,您别无选择。此外,您可以公开超过 1 个节点。这里没有魔法。 “我不想将节点直接暴露给互联网”——在 AWS 上根本不可能使用 UDP,而对于没有 ELB 的 TCP。
猜你喜欢
  • 2015-12-14
  • 2020-07-15
  • 1970-01-01
  • 2017-05-19
  • 2021-02-03
  • 1970-01-01
  • 2016-02-19
  • 2021-02-26
  • 2021-07-05
相关资源
最近更新 更多