【问题标题】:Connecting to Kubernetes TCP and UDP services on the same IP在同一个 IP 上连接到 Kubernetes TCP 和 UDP 服务
【发布时间】:2022-01-18 08:10:06
【问题描述】:

我在 Kubernetes 命名空间中有 2 个 pod。一个使用TCP,另一个使用UDP,两者都通过外部IP使用ClusterIP服务公开。两种服务使用相同的外部 IP。

这样我让我的用户使用相同的 IP 访问这两个服务。 我想删除spec.externalIPs 的使用,但能够允许我的用户仍然使用单个域名/IP 来访问TCP 和UDP 服务。

我不想使用spec.externalIPs,所以我认为clusterIP和NodePort服务不能使用。​负载均衡器服务不允许我在同一个服务中同时指定 TCP 和 UDP。

我已经尝试过 NGINX 入口控制器。但即使在那里也需要创建负载均衡器服务,它不能在同一服务中同时支持TCP 和UDP。

以下是集群 IP 服务暴露当前使用外部 IP 的应用程序:

apiVersion: v1
kind: Service
metadata:
  labels:
    app: tcp-udp-svc
  name: tcp-udp-service
spec:
  externalIPs:
  - <public IP- IP2>
  ports:
  - name: tcp-exp
    port: 33001
    protocol: TCP
    targetPort: 33001
  - name: udp-exp
    port: 33001
    protocol: UDP
    targetPort: 33001
  selector:
    app: tcp-udp-app
  sessionAffinity: None
  type: ClusterIP

服务如下所示

NAME                  TYPE           CLUSTER-IP            EXTERNAL-IP        PORT(S)
tcp-udp-service       ClusterIP      <internal IP IP1>     <public IP- IP2>   33001/TCP,33001/UDP

使用上述设置,端口 33001 上的 TCP 和 UDP 应用程序都可以使用 IP2 从外部正常访问。

如你所见,我使用过:

spec:
  externalIPs:
  - <public IP- IP2>

在服务中使其可被外部访问。

但是我不想使用这个设置,即。我正在寻找不使用spec.externalIPs 的设置。

当使用负载均衡器服务公开应用程序时,我看到TCP 和UDP 不能同时添加到同一个负载均衡器服务中。所以我必须为TCP 创建一个负载均衡器服务,并为UDP 添加另一个负载均衡器服务,如下所示

NAME                TYPE           CLUSTER-IP            EXTERNAL-IP        PORT(S)
tcp-service         LoadBalancer   <internal IP IP1>     <public IP- IP2>   33001/TCP

udp-service         LoadBalancer   <internal IP IP3>     <public IP- IP4>   33001/UDP


---
apiVersion: v1
kind: Service
metadata:
  name: tcp-service 
 spec:
  externalTrafficPolicy: Cluster
  ports:
  - name: tcp-svc
    port: 33001
    protocol: TCP
    targetPort: 33001
  selector:
     app: tcp-udp-app
  sessionAffinity: None
  type: LoadBalancer

---
apiVersion: v1
kind: Service
metadata:
  name: udp-service
 spec:
  externalTrafficPolicy: Cluster
  ports:
  - name: udp-svc
    port: 33001
    protocol: UDP
    targetPort: 33001
  selector:
     app: tcp-udp-app
  sessionAffinity: None
  type: LoadBalancer 

但问题是这些服务中的每一个都分配了单独的 IP(IP2 和 IP4)。 但我希望能够使用相同的 IP 访问 TCP 和 UDP 应用程序。在使用 nginx 入口控制器进行测试时,我也面临与上述相同的问题。

有没有其他可能的方法来实现我正在寻找的东西,即。在同一个 IP 上同时公开 TCP 和 UDP 服务,但不使用 spec.externalIPs?

【问题讨论】:

  • 您使用的是哪个版本的 Kubernetes,您是如何设置集群的?您是否使用裸机安装或某些云提供商?重现您的问题很重要。
  • @Mikołaj Głodziak Kubernetes 1.20 版 IKS 集群
  • 请提供您的 yaml 文件以重现您的情况。
  • 嗨@Mikołaj Głodziak,我已经编辑了问题以添加yaml
  • 为什么需要在同一个 IP 上公开 TCP 和 UDP 服务而不指定spec.externalIP?

标签: kubernetes kubernetes-ingress


【解决方案1】:

很遗憾,您将无法使用负载均衡器获得您想要的结果。 UDP 流量的任何服务类型,因为任何 VPC 负载均衡器类型都不支持 following documentation UDP 协议。

理论上,您可以通过使用loadBalancerIP 注释为 LoadBalancer 服务类型定义一个可移植的公共 IP 地址,但是这个可移植的公共 IP 地址必须预先在可移植的公共子网中可用,并且 Cloud Provivers 的 LB 需要支持 UDP 协议。可以看this doc

非 Prod 设置的解决方法:

您可以直接在工作节点上使用hostPort 到expose TCP 和 UDP 端口。可以与一些支持 TCP 和 UDP 服务的 Ingress 控制器一起使用,例如 NGINX Ingress。更多信息请见this documentation。

【讨论】:

  • 你好@anas。这是answer你的问题吗?
  • 嗨@Mikołaj,主机端口工作。我的集群设置需要每个命名空间一个入口控制器。如果我在一个入口控制器安装中将主机端口定义为 33001/UDP,这是否会阻止我在同一节点上的另一个入口控制器安装上使用定义为主机端口的相同端口但在不同的命名空间上?
猜你喜欢
  • 2019-03-26
  • 2016-04-28
  • 2019-12-19
  • 1970-01-01
  • 2019-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
相关资源
最近更新 更多