为什么在Kuberntes部署/容器定义中需要使用port / containerPort?

时间:2019-07-25 08:03:55

标签: kubernetes kubernetes-service kubernetes-deployment kubernetes-container kubernetes-networking

当我定义例如在kubernetes中的部署中,有一个包含容器列表的部分,每个容器包含一个端口数组,例如:

apiVersion: apps/v1
kind: Deployment
spec:
  template:
    spec:
      containers:
      - name: my-nginx
        image: nginx
        ports:
        - containerPort: 80

现在文档here明确表示它不影响连接性:

  

要从容器公开的端口列表。在这里暴露一个端口给   有关网络连接的系统附加信息   容器使用,但主要是提供信息。没有指定端口   此处不阻止该端口暴露。任何端口   侦听容器内默认的“ 0.0.0.0”地址将是   可从网络访问。无法更新。

现在看来它并没有真正影响任何东西,而只是影响了信息,但这到底意味着什么,用在什么地方?

我发现它的一种用法是,如果port定义了一个名称,则可以使用该名称从服务中引用它。

是该规范还是其他一些用途?

2 个答案:

答案 0 :(得分:1)

pod中的容器共享网络名称空间,这意味着IP,路由等内容。端口在容器之间不共享。每个容器都需要具有特定的端口才能公开其服务。

当一个容器暴露两个以上的端口时,它需要使用端口名,因此其他k8s抽象(例如service)可以找到正确的端口。

  

Kubernetes IP地址位于Pod范围内-Pod中的容器共享其网络名称空间-包括其IP地址。这意味着Pod中的容器可以全部到达彼此在localhost上的端口。这也意味着Pod中的容器必须协调端口使用,但这与VM中的进程没有什么不同。这就是所谓的“每脚IP”模型。kubernetes-network-model

答案 1 :(得分:1)

引用文档时,

  

要从容器公开的端口列表。在此处公开端口可为系统提供有关容器使用的网络连接的其他信息,但主要是参考信息。在此处未指定端口并不能防止该端口暴露。任何从容器中的默认“ 0.0.0.0”地址监听的端口都可以从网络访问。无法更新。

定义containerPorts的目的纯粹是为了文档。它仅由其他开发人员用来了解容器侦听的端口。 Kubernetes借鉴了docker的想法,该想法与hereEXPOSE命令相同。