如何为没有端口的容器创建 kubernetes 服务

How to create a kubernetes service for a container without a port

我正在将一个由不同组件组成的应用程序引入 Kubernetes。现在我遇到一些组件,它们的 compose 文件没有任何端口,我不知道如何为它们创建服务。我检查了这些组件,它们的网络设置如下:

"NetworkSettings": {
    "Bridge": "",
    "Ports": {},
    "Gateway": "172.18.133.1",
    "GlobalIPv6Address": "",
    "GlobalIPv6PrefixLen": 0,
    "IPAddress": "172.18.133.14",
    [other-configs]
}

我们如何为这些组件创建服务?

假设你说的是public访问,根据docker documentation

By default, when you create a container, it does not publish any of its ports to the outside world. To make a port available to services outside of Docker, or to Docker containers which are not connected to the container’s network, use the --publish or -p flag.

如果您指的是 docker-compose 上的 inter-container 通信,您必须检查您的应用程序,因为 docker 网络上的端口不需要 "exposing"。

普通 Docker/Docker Compose 和 Kubernetes 之间有很大区别。在 Docker 中,一个容器可以使用另一个容器的名称作为主机名和容器恰好正在侦听的任何端口来访问另一个容器,而无需任何特殊声明。在 Kubernetes 中,所有 pod-to-pod 通信通常通过服务进行。

即使您不在外部发布容器的端口,它的 Docker 文件通常会包含一个 EXPOSE 声明,命名一些特定的端口,您可以将它们放在 pod 和服务规范中.如果您没有 Docker 文件,docker historydocker inspect 可以告诉您。甚至没有这些信息,您将不得不使用其他可能的 non-technical 方法来找到它。

如果容器根本不接受入站连接(例如,它是 job-queueing 系统的工作容器),您可能根本不需要服务。

如果您不接受入站连接,但仍然需要一个服务(这是 a requirement when using Istio),那么该服务需要声明

type: ClusterIP
clusterIP: None

这没有很好地记录,但事实证明代码中有一条规则,即服务必须至少有一个端口没有这个。