系列文章:


总目录索引:九析带你轻松完爆 istio 服务网格系列教程

目录

1 前言

2 邀约

3 hostPort 样例

4 hostPort 与 hostNetwork 异同

    4.1 相同点

    4.2 不同点

5 hostPort 使用场景

6 注重


1 前言

        若是你对博客有任何疑问,请告诉我。


2 邀约

        你可以从 b 站搜索 “九析”,获取免费的、更生动的视频资料:


3 hostPort 样例

        样例代码如下所示:

        pod 公布之后,便会将容器端口开放给了外部网络。外部可以通过 pod 所在宿主机和 hostPort 值接见到 Pod 内的容器提供的服务。


4 hostPort 与 hostNetwork 异同

4.1 相同点

        hostPort 与 hostNetwork 本质上都是露出 pod 宿主机 IP 给终端用户,由于 pod 生命周期并不牢固,随时都有可能被完爆,故 IP 的不确定最终导致用户使用上的不方便;此外宿主机端口占用也导致不能在统一台机子上有多个程序使用统一端口。因此一样平常情况下,不要使用 hostPort 方式。

4.2 不同点

        使用 hostNetwork,pod 实际上用的是 pod 宿主机的网络地址空间:即 pod  IP 是宿主机 IP,而非 cni 分配的 pod IP,端口是宿主机网络监听接口。

使用 hostPort,pod IP 并非宿主机 IP,而是 cni 分配的 pod IP,跟其他通俗的 pod 使用一样的 ip 分配方式,端口并非宿主机网络监听端口,只是使用了 DNAT 机制将 hostPort 指定的端口映射到了容器的端口之上(可以通过 iptables 下令举行查看)。外部接见此 pod 时,仍然使用宿主机和 hostPort 方式。pod ip 跟宿主机 ip 截图如下:

        有关端口 DNAT 通过 iptables 下令举行查看,如下截图所示:

        由上图可知,pod 所在宿主机上的 iptables nat 表流向如下:

1 当客户端提议 pod 接见时,好比 curl http://pod_in_host:hostPort

2 网络包会流经 pod 宿主机的 prerouting chain,会掷中 CNI-HOSTPORT-DNAT 链

3 网络包会流经 CNI-HOSTPORT_DNAT 链中的第 3 条规则,即 DNAT 目的,此时会将 9998 端口接见的流量路由到 80 端口去

        基于此,当客户端接见 pod 所在主机的 9998 端口时,流量会自动被路由到 IP 为 10.244.11.55(也就是 pod ip)的 80 端口上。


5 hostPort 使用场景

        nginx-ingress-controller 就使用到了 hostPort 方式,同时开启了 80 和 443 端口,如下截图所示:


6 注重

        当 pod 同时使用了 hostNetwork 和 hostPort,那么 hostNetwork 将会直接使用宿主机网络命名空间,hostPort 实在就形同虚设了。可以以为 hostNetwork 选项优先级要高于 hostPort。