来自kubernetes docs:
pod中的应用程序都使用相同的网络命名空间(相同的IP和端口空间),因此可以相互“查找”并使用localhost进行通信 .
是否可以使用某些特定于容器的名称而不是 locahost
?
例如,使用 docker-compose up
,您可以使用服务名称进行通信 . [docs]
所以,如果我的 docker-compose.yml 文件是
version: '2'
services:
web:
build: .
ports:
- "8000:8000"
srv:
build: .
ports:
- "3000:3000"
然后我通过调用 http://srv:3000/
, not http://localhost:3000
从 web
中访问 srv
如何在kubernetes中实现相同的行为?有什么方法可以指定在pods的yaml配置中使用什么名称?
2 回答
localhost
只是网络环回设备的名称(IPv4通常为127.0.0.1
,IPv6为::1
) . 这通常在/etc/hosts
文件中指定 .一个pod有自己的IP,因此每个容器内部共享该IP . 如果这些容器应该是独立的(即不需要配置),它们应该都在自己的容器中 . 然后,您可以为每个允许DNS查找的service定义为来自同一名称空间中的pod的"$SERVICENAME",或者来自不同名称空间中的pod的"$SERVICENAME.$NAMESPACE" .
docker-compose
部署单个容器,将它们链接在一起,以便彼此了解彼此的名称和IP .Kubernetes中的
Pod
类似,但这不是Pod用于保存多个外部服务并将它们链接在一起的目的 .Pod用于必须在同一主机上运行的容器,并且仅在它们之间进行交互 . 容器通过localhost在内部进行通信 .
大多数
Pods
实际上是一个容器 .Pod
使用Services
与外部通信 . 从本质上讲,Pod看起来好像只是一个容器 .在引擎盖下,Pod至少有2个容器:
pause
容器管理Pod的IP,然后管理您附加的容器 . 这允许您的容器崩溃,重新启动并在Pod中重新链接而不更改IP,允许在不涉及调度程序的情况下管理容器崩溃,并确保Pod在其生命周期内保持在单个节点上,因此重新启动很快 .如果我们在每次崩溃时重新安排的容器,它们可能最终会在不同的主机上运行,路由必须更新等等......