我正在将包含不同组件的应用程序带到Kubernetes。现在,我遇到了一些组件,这些组件的组合文件没有任何端口,而且我不知道如何为它们创建服务。我检查了这些组件,它们的网络设置如下:
"NetworkSettings": {
"Bridge": "",
"Ports": {},
"Gateway": "172.18.133.1",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"IPAddress": "172.18.133.14",
[other-configs]
}
我们如何为此类组件创建服务?
答案 0 :(得分:2)
普通Docker / Docker Compose和Kubernetes之间有很大的区别。在Docker中,一个容器可以使用另一个容器的名称作为主机名以及该容器碰巧监听的任何端口而到达另一个容器,而无需任何特殊声明。在Kubernetes中,所有Pod到Pod的通信通常都是通过服务进行的。
即使您没有在外部发布容器的端口,其Dockerfile也会经常包含一个Environment Info:
System:
OS: Linux 4.15 Ubuntu 18.04.2 LTS (Bionic Beaver)
CPU: (8) x64 Intel(R) Core(TM) i7-4702MQ CPU @ 2.20GHz
Binaries:
Node: 8.11.3 - /usr/bin/node
Yarn: 1.7.0 - /usr/bin/yarn
npm: 6.9.0 - /usr/bin/npm
Browsers:
Chrome: Not Found
Firefox: 67.0.2
npmGlobalPackages:
@vue/cli: 3.8.4
声明来命名某些特定的端口,您可以将它们放在pod和服务规范中。如果您没有Dockerfile,EXPOSE
或docker history
会告诉您。即使没有这些信息,您也必须使用其他可能的非技术手段来找到它。
如果容器根本不接受入站连接(例如,它是工作排队系统的工作容器),则可能根本不需要服务。
如果您不接受入站连接,但仍需要服务(这是a requirement when using Istio),则服务需要声明
docker inspect
这没有被很好地证明,但是事实证明,在代码中确实有一个规则,即服务必须至少具有一个端口,而没有此端口。
答案 1 :(得分:1)
根据docker documentation,假设您正在谈论公共访问,
默认情况下,创建容器时,它不会发布任何 通往外界的港口。使端口可用于服务 Docker外部或未连接的Docker容器 容器的网络,请使用--publish或-p标志。
如果您是指docker-compose上的容器间通信,则必须检查您的应用程序,因为端口不需要在docker网络上“公开”。