4.2.2 暴露端口

Docker 的网络模型中,使用默认网络的容器化应用需要通过NAT机制将其“暴露”(expose)到外部网络中才能被其他节点之上的容器客户端所访问。然而,Kubernetes 系统的网络模型中,各 Pod 的 IP 地址处于同一网络平面,无论是否为容器指定了要暴露的端口,都不会影响集群中其他节点之上的Pod客户端对其进行访问,这就意味着,任何监听在非lo接口上的端口都可以通过Pod网络直接被请求。从这个角度来说,容器端口只是信息性数据,它只是为集群用户提供了一个快速了解相关Pod对象的可访问端口的途径,而且显式指定容器端口,还能为其赋予一个名称以方便调用。

容器的 ports 字段的值是一个列表,由一到多个端口对象组成,它的常用嵌套字段包括如下几个。

  • containerPort <intrger>:必选字段,指定在Pod对象的IP地址上暴露的容器端口,有效范围为(0, 65536);使用时,应该总是指定容器应用正常监听着的端口。
  • name <string>:当前端口的名称,必须符合 IANA_SVC_NAME 规范且在当前 Pod 内必须是唯一的;此端口名可被 Service 资源调用。
  • protocol:端口相关的协议,其值仅可为TCP或UDP,默认为TCP。

下面的资源配置清单示例(pod-example-with-port.yaml)中定义的 pod-example 指定了要暴露容器上 TCP 的 80 端口,并将之命令为 http:

apiVersion: v1
kind: Pod
metadata:
    name: pod-example
spec:
    containers:
    - name: myapp
      image: ikubernetes/myapp:v1
      ports:
      - name: http
        containerPort: 80
        protocol: TCP

然而,Pod 对象的IP地址仅在当前集群内可达,它们无法直接接收来自集群外部客户端的请求流量,尽管它们的服务可达性不受工作节点边界的约束,但依然受制于集群边界。一个简单的解决方案是通过其所在的工作节点的IP地址和端口将其暴露到集群外部,如图 4-6 所示。

通过 hostIP 和 hostPort 暴露容器服务
图 1.6.2.2 - 通过 hostIP 和 hostPort 暴露容器服务
  • hostPort <integer>:主机端口,它将接收到的请求通过NAT机制转发至由 containerPort 字段指定的容器接口。
  • hostIP <string>:主机端口要绑定的主机IP,默认为 0.0.0.0,即主机之上所有可用的IP地址;考虑到托管的Pod对象是由调度器调度运行的,工作节点的IP地址难以明确指定,因此此字段通常使用默认值。

需要注意的是,hostPort 和 NodePort 类型的 Service 对象暴露端口的方式不同,NodePort 是通过所有节点暴露容器服务,而 hostPort 则是经由 Pod 对象所在的节点的IP地址来进行。

results matching ""

    No results matching ""