在Kubernetes 服务中创建的 Pod 对外提供网络访问的方式:

直接使用Pod的IP地址和端口访问。

使用与Pod绑定的ClusterIP和端口访问。

使用K8S集群中的主机IP地址和端口访问。

这三种情况,分别对应着K8S 服务中不同的网络设置。

一、Deploy 中设置ContainerPort

如果只在 Demployment 的 yaml 文件中配置ports:containerPort;不另外创建 Service 的话,只能使用Pod的IP地址和端口进行访问。

1.1、可以访问到的地址

Pod 容器正常启动后,可以在K8s集群所在的任意主机上通过Pod的IP地址和容器端口号访问。

1.2、不可以访问到的位置

非K8S集群的机器是无法访问到的。

二、通过Service 设置ClusterIP

kind: Service

spec:

ports:

- port: 1000(ClusterIP)

targetPort: 8000 (containerPort)

集群ClusterIP地址,是在K8S集群中对某个或者某些 pod 设置一个虚拟的IP地址。这样可以解决多个相同的 Pod 对象,调用时负载均衡的情况

2.1、可以访问到的地址

在K8S集群中的任意一个主机上可以通过ClusterIP和ClusterPort进行访问。

2.2、不可以访问到的位置

非K8S集群的机器是无法访问到的。

PS:如果同一个Service 对象中同时设置了ClusterIP信息和NodePort信息的话,ClusterIP信息可能就不能使用了。

三、通过Service 设置NodePort

kind: Service

spec:

type: NodePort

ports:

- port: 1000(ClusterIP)

targetPort: 8000(containerPort)

nodePort: 2000(NodePort)

NodePort 会在所有的K8S集群主机中监听设置的端口,将接受到的服务,传输给Pod中正确的端口上。

3.1、可以访问到的地址

NodePort映射的端口可以在 K8s 中的任意主机上访问的。

NodePort映射的端口可以在非 K8S 集群的机器上,通过K8S集群的主机和NodePort的端口形式访问到。

3.2、不可以访问到的位置

无法与 K8s 集群通信的主机,无法访问到。

四、Kubernetes clusterIP 问题说明

4.1、网络调用范围说明

POD 之间通过ClusterIP相互调用

K8S 集群所在服务器通过 ClusterIP 调用

外部服务器通过 ClusterIP 调用

4.2、ClusterIP 使用的作用

Kubernetes 服务创建的 POD 时,其名称的构成是: deploymentName – RSName – 随机字符。并且没有重新创建的 Pod 名称都不一样。这样就不可以通过 POD 名称调用 POD。

ClusterIP 通过 Labels 设置,定位到相应的 POD,并且会将 ClusterIP 的 Name 和 ClusterIP 的IP地址信息,写入到 DNS 服务中。这样就可以通过明确 POD 的调用方式。

4.3、ClusterIP 使用的疑点

一般情况下,在 K8S 机器中只有 POD 会使用 K8S 集群配置的 DNS 服务;这样就使得:在 K8S 集群服务器上,并不能通过 ClusterIP 的 Name 访问 ClusterIP 的 IP 信息;也就不能访问 Pod。

在 K8S 集群服务器中,使用 ClusterIP 的 IP 地址,访问 POD 时,很可能是不能正常访问的。如果是在 POD 所在的部署机器,是可以正常访问的。在其他的 K8S 集群的机器中,就会访问异常。

4.4、补充说明

这种情况是因为:iptables 和 ipvs 中设置的问题。其中涉及到 iptables 中各种模块和关键词;还要熟悉 ipvadm 管理工具。后续有时间再补充这块的知识。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐