ClusterIP:集群中的 pod/services 可以访问服务
如果我在类型的默认命名空间中创建一个名为 myservice 的服务:ClusterIP,那么将为该服务创建以下可预测的静态 DNS 地址:
myservice.default.svc.cluster.local(或者只是 myservice.default,或者通过默认命名空间中的 pod,只有“myservice”可以工作)
并且该 DNS 名称只能由集群内的 pod 和服务解析。
NodePort:服务可由同一 LAN 上的客户端/可以 ping K8s 主机节点(以及集群中的 pod/服务)的客户端访问(注意安全,您的 k8s 主机节点应位于私有子网上,因此 Internet 上的客户端胜出'无法访问此服务)
如果我在 mynamespace 命名空间类型中创建一个名为 mynodeportservice 的服务:在 3 节点 Kubernetes 集群上的 NodePort。然后将创建一个服务类型:ClusterIP,集群内的客户端可以通过以下可预测的静态 DNS 地址访问它:
mynodeportservice.mynamespace.svc.cluster.local(或只是 mynodeportservice.mynamespace)
对于 mynodeportservice 在 30000 - 32767 范围内的节点端口上侦听的每个端口,将随机选择。这样集群外部的外部客户端就可以访问集群内部存在的 ClusterIP 服务。假设我们的 3 个 K8s 主机节点的 IP 分别为 10.10.10.1、10.10.10.2、10.10.10.3,Kubernetes 服务正在监听 80 端口,随机选择的 Nodeport 是 31852。
存在于集群外部的客户端可以访问10.10.10.1:31852、10.10.10.2:31852 或 10.10.10.3:31852(因为 NodePort 被每个 Kubernetes 主机节点监听)Kubeproxy 会将请求转发到 mynodeportservice 的 80 端口。
LoadBalancer:连接到互联网的每个人都可以访问服务*(常见的架构是 L4 LB 可以通过将其放在 DMZ 中或同时为其提供私有和公共 IP 和 k8s 主机节点在私有子网上来在互联网上公开访问)
(注意:这是唯一不能在 100% 的 Kubernetes 实现中工作的服务类型,比如裸机 Kubernetes,它在 Kubernetes 具有云提供商集成时工作。)
如果您创建 mylbservice,则将生成 L4 LB VM(集群 IP 服务和 NodePort 服务也将隐式生成)。这次我们的 NodePort 是 30222。想法是 L4 LB 将有一个公共 IP 1.2.3.4,它将负载均衡并将流量转发到具有私有 IP 地址的 3 个 K8s 主机节点。(10.10.10.1:30222, 10.10.10.2:30222, 10.10.10.3:30222) 然后 Kube Proxy 会将其转发给集群内部存在的 ClusterIP 类型的服务。
你还问:NodePort服务类型还用ClusterIP吗?是*
或者 NodeIP 实际上是您运行 kubectl get nodes 时找到的 IP?同样是的*
让我们在基本原理之间画一个平行线:
一个容器在一个吊舱内。一个 pod 在一个副本集中。副本集在部署中。
类似地:
ClusterIP 服务是 NodePort 服务的一部分。NodePort 服务是负载均衡器服务的一部分。
在您显示的该图中,客户端将是集群内的一个 pod。