将特定容器的端口暴露给外部 IP

Expose port of a specific container to external IP

我正在部署一个由具有三个副本容器的服务组成的 helm chart。我一直在关注 these directions 向外部 IP 地址公开服务。

如何为每个容器或每个 pod 公开一个端口?我明确不想公开将端口映射到服务中某些(但任何)pod 的负载均衡器。有问题的服务是有状态集的一部分,对于外部的客户端来说,联系这三个服务中的哪一个很重要,所以我无法将其抽象到负载均衡器后面。

您需要为有状态集中的每个 pod 创建一个新服务。要区分 pods,您需要用 here
中描述的名称来标记它们 当您有单独的服务时,您可以在入口中单独使用它们。

只需添加有关创建服务的官方 Kubernetes 文档:

https://kubernetes.io/docs/concepts/services-networking/service/

Kubernetes 中的 Service 是一个 REST 对象,类似于 Pod。与所有 REST 对象一样,可以将服务定义发布到 apiserver 以创建新实例。例如,假设您有一组 Pods,每个都公开端口 9376 并带有标签 "app=MyApp".

kind: Service
apiVersion: v1
metadata:
  name: my-service
spec:
  selector:
    app: MyApp
  ports:
  - protocol: TCP
    port: 80
    targetPort: 9376

此规范将创建一个名为“my-service”的新服务对象,它以带有 "app=MyApp" 标签的任何 Pod 上的 TCP 端口 9376 为目标。该服务还将分配一个 IP 地址(有时称为“集群 IP”),供服务代理使用(见下文)。服务的选择器将被持续评估,结果将被发布到一个名为“my-service”的端点对象。

请注意,服务可以将传入端口映射到任何目标端口。默认情况下,targetPort 将设置为与端口字段相同的值。或许更有趣的是,targetPort 可以是一个字符串,指的是后端Pods 中端口的名称。分配给该名称的实际端口号在每个后端 Pod 中可能不同。这为部署和发展您的服务提供了很大的灵活性。例如,您可以更改 pods 在后端软件的下一版本中公开的端口号,而不会破坏客户端。

Kubernetes 服务支持 TCP 和 UDP 协议。默认为 TCP。