如何在 Kubernetes 中使用负载均衡器服务公开多个端口

Posted

技术标签:

【中文标题】如何在 Kubernetes 中使用负载均衡器服务公开多个端口【英文标题】:How to expose multiple port using a load balancer services in Kubernetes 【发布时间】:2017-12-22 04:38:14 【问题描述】:

我已经使用谷歌云平台(容器引擎)创建了一个集群,并使用以下 YAML 文件部署了一个 pod:

apiVersion: extensions/v1beta1
kind: Deployment
metadata: 
  name: deployment-name
spec:
  replicas: 1
  template:
    metadata:
      name: pod-name
      labels: 
        app: app-label
    spec:
      containers: 
      - name: container-name
      image: gcr.io/project-id/image-name
      resources:
        requests:
          cpu: 1
      ports:
      - name: port80
        containerPort: 80
      - name: port443
        containerPort: 443
      - name: port6001
        containerPort: 6001

然后我想创建一个服务,使 pod 能够监听所有这些端口。我知道以下 YAML 文件可用于创建侦听一个端口的服务:

apiVersion: v1
kind: Service
metadata: 
  name: service-name
spec:    
  ports:
  - port: 80
    targetPort: 80
  selector: 
    app: app-label
  type: LoadBalancer

但是,当我希望 pod 像这样在多个端口上侦听时,它不起作用:

apiVersion: v1
kind: Service
metadata: 
  name: service-name
spec:    
  ports:
  - port: 80
    targetPort: 80
  - port: 443
    targetPort: 443
  - port: 6001
    targetPort: 6001
  selector: 
    app: app-label
  type: LoadBalancer

如何让我的 pod 监听多个端口?

【问题讨论】:

您尝试过多种服务吗? @danielepolencic 感谢您的回答。我已经尝试了多种服务并且它有效,这样做的问题是您为每个服务获得一个外部 IP 地址。有没有办法让 pod 在没有多个服务的情况下监听多个端口,或者让一个服务监听多个端口? 【参考方案1】:

你有两个选择:

    您可以有多个服务,每个端口一个。正如您所指出的,每个服务最终都会使用不同的 IP 地址 您可以使用具有多个端口的单一服务。在这种特殊情况下,您必须为所有端口命名。

在您的情况下,服务变为:

apiVersion: v1
kind: Service
metadata:
  name: service-name
spec:
  ports:
  - name: http
    port: 80
    targetPort: 80
  - name: https
    port: 443
    targetPort: 443
  - name: something
    port: 6001
    targetPort: 6001
  selector:
    app: app-label
  type: LoadBalancer

这是必要的,以便可以消除端点的歧义。

【讨论】:

感谢您的回答,您是否也知道如何公开一系列端口(例如,从 6001-6300)? @danielepolencic 据我了解,k8s 目前不支持端口范围:github.com/kubernetes/kubernetes/issues/23864 嗨,我试过这种方式,但我无法从互联网访问 IP 和端口。如果我暴露一个端口它工作正常。但是当我像上面那样暴露 80 和 443 时。它失败。页面未打开。它对你有用吗? 我可以用 2 个不同的 pod 做到这一点吗? 更新:有一个解决方法github.com/kelseyhightower/dynamic-ports-tutorial

以上是关于如何在 Kubernetes 中使用负载均衡器服务公开多个端口的主要内容,如果未能解决你的问题,请参考以下文章

Kubernetes负载均衡器:Metallb

如何在Kubernetes中使用Envoy作为负载均衡器

跨 Kubernetes 主节点的负载均衡

[K8s]Kubernetes-服务负载均衡联网(上)

Spring Cloud Kubernetes 的负载均衡问题

将 kubernetes(GKE) 服务层指标发送到 GCP 负载均衡器