首页 文章

Kubernetes中的ClusterIP,NodePort和LoadBalancer服务类型有什么区别?

提问于
浏览
80

1 - 我正在阅读文档,我对措辞有点困惑 . 它说:

ClusterIP:在集群内部IP上公开服务 . 选择此值使服务只能从群集中访问 . 这是默认的ServiceType NodePort:在静态端口(NodePort)上的每个节点的IP上公开服务 . 将自动创建NodePort服务将路由到的ClusterIP服务 . 您将能够通过请求<NodeIP>:<NodePort>从群集外部联系NodePort服务 . LoadBalancer:使用 Cloud 提供商的负载均衡器在外部公开服务 . 将自动创建外部负载均衡器将路由到的NodePort和ClusterIP服务 .

NodePort服务类型是否仍然使用 ClusterIP 但只是在不同的端口,该端口对外部客户端开放?所以在这种情况下 <NodeIP>:<NodePort><ClusterIP>:<NodePort> 相同?

或者 NodeIP 实际上是您运行 kubectl get nodes 时找到的IP而不是用于ClusterIP服务类型的虚拟IP?

2 - 同样在以下链接的图表中:

http://kubernetes.io/images/docs/services-iptables-overview.svg

ClientNode 内有什么特别的原因吗?我认为在ClusterIP服务类型的情况下它需要在 Cluster 内 .

如果为NodePort绘制了相同的图表,那么在 NodeCluster 之外完全绘制客户端是否有效,或者我是否完全忽略了这一点?

3 回答

  • 4

    澄清任何正在寻找更简单级别3之间差异的人 . 您可以使用最小的ClusterIp(在k8s clusteR内)或使用NodePort(在k8s群集外部的群集内)或LoadBalancer(外部世界或您在LB中定义的任何内容)的更大曝光来公开您的服务 .

    ClusterIp exposure < NodePort exposure < LoadBalancer exposure

    ClusterIp    -> Expose service through **k8s cluster** with ip/name:port
    NodePort     -> Expose service through **Internal network VM's** also external to k8s ip/name:port
    LoadBalancer -> Expose service through **External world** or whatever you defined in your LB.
    
  • 86

    ClusterIP公开以下内容:

    • spec.clusterIp:spec.ports[*].port

    您只能在群集内访问此服务 . 它可以从 spec.clusterIp 端口访问 . 如果设置了 spec.ports[*].targetPort ,它将从端口路由到targetPort . 调用 kubectl get services 时获得的CLUSTER-IP是内部在集群内分配给此服务的IP .

    NodePort公开以下内容:

    • <NodeIP>:spec.ports[*].nodePort

    • spec.clusterIp:spec.ports[*].port

    如果您从节点的外部IP在nodePort上访问此服务,它会将请求路由到 spec.clusterIp:spec.ports[*].port ,如果设置,它将依次路由到您的 spec.ports[*].targetPort . 也可以使用与ClusterIP相同的方式访问此服务 .

    您的NodeIP是节点的外部IP地址 . 您无法从 <ClusterIP>:spec.ports[*].nodePort 访问您的服务 .

    LoadBalancer公开以下内容:

    • spec.loadBalancerIp:spec.ports[*].port

    • <NodeIP>:spec.ports[*].nodePort

    • spec.clusterIp:spec.ports[*].port

    您可以从负载均衡器的IP地址访问此服务,该IP地址将您的请求路由到nodePort,nodePort又将请求路由到clusterIP端口 . 您可以像访问NodePort或ClusterIP服务一样访问此服务 .

  • 37

    ClusterIP: Services are reachable by pods/services in the Cluster
    如果我在类型为:ClusterIP的默认命名空间中创建名为myservice的服务,则将创建以下可预测的服务静态DNS地址:

    myservice.default.svc.cluster.local(或者只是myservice.default,或默认命名空间中的pod只是“myservice”会起作用)

    并且该DNS名称只能由群集内的pod和服务解析 .

    NodePort: Services are reachable by clients on the same LAN/clients who can ping the K8s Host Nodes (and pods/services in the cluster) (Note for security your k8s host nodes should be on a private subnet, thus clients on the internet won't be able to reach this service)
    如果我在3节点Kubernetes集群上的类型为:NodePort的mynamespace命名空间中创建名为mynodeportservice的服务 . 然后将创建类型为ServiceIP的服务,并且群集内的客户端可以通过以下可预测的静态DNS地址访问它:

    mynodeportservice.mynamespace.svc.cluster.local(或只是mynodeportservice.myspace)

    对于mynodeportservice在30000 - 32767范围内的nodeport上侦听的每个端口,将随机选择 . 这样,群集外部的外部客户端可以访问群集中存在的ClusterIP服务 . 假设我们的3个K8主机节点有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(因为每个Kubernetes主机节点都会监听NodePort)Kubeproxy会将请求转发到mynodeportservice的端口80 .

    LoadBalancer: Services are reachable by everyone connected to the internet (Common architecture is L4 LB is publicly accessible on the internet by putting it in a DMZ or giving it both a private and public IP and k8s host nodes are on a private subnet)*
    (注意:这是唯一一种在100%Kubernetes实现中不起作用的服务类型,如裸机Kubernetes,当Kubernetes具有 Cloud 提供商集成时,它可以工作 . )

    如果您创建mylbservice,则会生成L4 LB VM(群集IP服务,并且还将隐式生成NodePort服务) . 这次我们的NodePort是30222.想法是L4 LB将具有1.2.3.4的公共IP,并且它将负载 balancer 并将流量转发到具有私有IP地址的3个K8主机节点 . (10.10.10.1-30222,10.10.10.2-30222,10.10.10.3:30222)然后Kube Proxy会将其转发到群集内存在的ClusterIP类型的服务 .


    您还问:NodePort服务类型是否仍使用ClusterIP?是*
    或者,当运行kubectl get节点时,NodeIP实际上是IP吗?也是*

    让我们在基础之间划清界限:
    容器在容器内 . 一个pod位于replicaset中 . 复制集在部署中 .
    同样的:
    ClusterIP服务是NodePort服务的一部分 . NodePort服务是负载均衡器服务的一部分 .


    在您显示的图表中,客户端将是群集内的一个pod .

相关问题