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

Ama*_*amp 174 containers kubernetes kubernetes-service

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

ClusterIP:在集群内部IP上公开服务.选择此值使服务只能从群集中访问.这是默认的ServiceType

NodePort:在静态端口(NodePort)上的每个Node的IP上公开服务.将自动创建NodePort服务将路由到的ClusterIP服务.您可以通过请求从群集外部联系NodePort服务<NodeIP>:<NodePort>.

LoadBalancer:使用云提供商的负载均衡器在外部公开服务.将自动创建外部负载均衡器将路由到的NodePort和ClusterIP服务.

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

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

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

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

有什么特别的原因Client是里面的Node?我认为Cluster在ClusterIP服务类型的情况下它需要在a里面.

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

kel*_*ket 152

ClusterIP公开以下内容:

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

您只能在群集内访问此服务.可从spec.clusterIp港口进入.如果spec.ports[*].targetPort设置了a ,它将从端口路由到targetPort.调用时获得的CLUSTER-IP kubectl get services是内部在集群内分配给此服务的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服务一样访问此服务.

  • 这篇文章实际上比官方的Kubernetes文档本身更有用. (21认同)
  • 你能评论一下`externalIPs`如何改变这个等式吗?具体来说,可以将`externalIPs`数组分配给`ClusterIP`类型的服务,然后服务也可以在外部IP上访问?你什么时候在NodePort上选择这个? (2认同)

Tom*_*vid 73

澄清任何正在寻找更简单级别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.
Run Code Online (Sandbox Code Playgroud)

  • 谢谢。无需太多技术知识,这有助于更好地理解该概念。 (4认同)

neo*_*yle 37

ClusterIP:服务是通过在集群豆荚/服务可达
如果我做了一个名为为MyService型的默认命名空间的服务:ClusterIP那么对于服务的以下预测的静态DNS地址将被创建:

myservice.default.svc.cluster.local(或者只是myservice.default,或默认命名空间中的pod只有"myservice"才能工作)

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

NodePort:可以ping通K8s主机节点(以及群集中的pod /服务)的同一LAN /客户端上的客户端可以访问服务(请注意,为了安全起见,您的k8s主机节点应位于私有子网上,因此Internet上的客户端赢了无法访问此服务)
如果我在3节点Kubernetes群集上的类型为:NodePort的mynamespace命名空间中创建名为mynodeportservice的服务.然后将创建类型为ServiceIP的服务,并且群集内的客户端可以通过以下可预测的静态DNS地址访问它:

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

对于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:连接到互联网的每个人都可以访问服务*(通用架构是L4 LB可以在互联网上公开访问,方法是将其置于DMZ中,或者将私有和公共IP以及k8s主机节点放在私有子网上)
(注意:这是唯一不能在100%Kubernetes实现中使用的服务类型,如裸机Kubernetes,当Kubernetes具有云提供程序集成时,它可以工作.)

如果您创建mylbservice,则会生成L4 LB VM(a群集IP服务,以及NodePort服务也将被隐式生成).这一次我们的NodePort是30222.的想法是,L4 LB将有1.2.3.4公网IP,它会负载均衡和流量转发到具有私有IP地址的3个K8S主机节点.(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.

  • 谢谢,这是最清楚的描述。 (6认同)

Teo*_*ahi 30

让我们假设您在本地计算机上创建了一个Ubuntu VM.它的IP地址是192.168.1.104.

您登录到VM,并安装了Kubernetes.然后你创建了一个在其上运行nginx图像的pod.

1-如果要在VM中访问此nginx pod,您将创建绑定到该Pod 的ClusterIP,例如:

$ kubectl expose deployment nginxapp --name=nginxclusterip --port=80 --target-port=8080
Run Code Online (Sandbox Code Playgroud)

然后在您的浏览器上,您可以使用端口80键入nginxclusterip的IP地址,如:

http://10.152.183.2:80

2-如果要从主机访问此nginx pod,则需要使用NodePort公开部署.例如:

$ kubectl expose deployment nginxapp --name=nginxnodeport --port=80 --target-port=8080 --type=NodePort
Run Code Online (Sandbox Code Playgroud)

现在您可以从主机上访问nginx,例如:

http://192.168.1.104:31865/

在我的仪表板中,它们显示为:

在此输入图像描述

下面是一个显示基本关系的图表.

在此输入图像描述


zan*_*ngw 28

    \n
  • 概括:

    \n
      \n
    • 有五种类型的服务:

      \n
        \n
      • ClusterIP(默认):内部客户端将请求发送到稳定的内部 IP 地址。
      • \n
      • NodePort:客户端将请求发送到服务指定的一个或多个 NodePort 值上的节点的 IP 地址。
      • \n
      • LoadBalancer:客户端将请求发送到网络负载均衡器的 IP 地址。
      • \n
      • ExternalName:内部客户端使用服务的 DNS 名称作为外部 DNS 名称的别名。
      • \n
      • Headless:当您需要 Pod 分组但不需要稳定的 IP 地址时,可以使用 Headless 服务。
      • \n
      \n

      NodePort类型是ClusterIP类型的扩展。因此 NodePort 类型的服务有一个集群 IP 地址。

      \n

      LoadBalancer类型是NodePort类型的扩展。因此,LoadBalancer 类型的服务具有一个集群 IP 地址和一个或多个 nodePort 值。

      \n
    • \n
    \n
  • \n
\n
\n\n

在此输入图像描述

\n
    \n
  • 在此输入图像描述
  • \n
\n
\n
    \n
  • 细节

    \n
      \n
    • 集群IP

      \n
        \n
      • ClusterIP 是默认且最常见的服务类型。
      • \n
      • Kubernetes 将为 ClusterIP 服务分配一个集群内部 IP 地址。这使得该服务只能在集群内访问。
      • \n
      • 您无法从集群外部向服务 (Pod) 发出请求。\n您可以选择在服务定义文件中设置集群 IP。
      • \n
      • 用例\n
          \n
        • 集群内的服务间通信。例如,应用程序的前端和后端组件之间的通信。
        • \n
        \n
      • \n
      \n
    • \n
    • 节点端口

      \n
        \n
      • NodePort服务是ClusterIP服务的扩展。NodePort 服务路由到的 ClusterIP 服务会自动创建。
      • \n
      • 它通过在 ClusterIP 之上添加集群范围的端口来向集群外部公开服务。
      • \n
      • NodePort 在静态端口(NodePort)上公开每个 Node\xe2\x80\x99s IP 上的服务。每个节点都会将该端口代理到您的服务中。因此,外部流量可以访问每个节点上的固定端口。这意味着该端口上对集群的任何请求都会转发到该服务。
      • \n
      • 您可以通过请求 : 从集群外部联系 NodePort 服务。
      • \n
      • 节点端口必须在 30000\xe2\x80\x9332767 范围内。手动为服务分配端口是可选的。如果未定义,Kubernetes 会自动分配一个。
      • \n
      • 如果您要显式选择节点端口,请确保该端口尚未被其他服务使用。
      • \n
      • 用例\n
          \n
        • 当您想要启用到服务的外部连接时。\n使用 NodePort 让您可以自由地设置自己的负载平衡解决方案,配置不完全支持的环境
        • \n
        • Kubernetes,甚至直接公开一个或多个节点\xe2\x80\x99 IP。\n最好在节点上方放置负载均衡器以避免节点故障。
        • \n
        \n
      • \n
      \n
    • \n
    • 负载均衡器

      \n
        \n
      • LoadBalancer 服务是 NodePort 服务的扩展。外部负载均衡器路由到的 NodePort 和 ClusterIP 服务是自动创建的。
      • \n
      • 它将 NodePort 与基于云的负载均衡器集成。
      • \n
      • 它使用云提供商\xe2\x80\x99s 负载均衡器向外部公开服务。
      • \n
      • 每个云提供商(AWS、Azure、GCP 等)都有自己的本机负载均衡器实现。云提供商将创建一个负载均衡器,然后自动将请求路由到您的 Kubernetes 服务。
      • \n
      • 来自外部负载均衡器的流量定向到后端 Pod。云提供商决定如何进行负载平衡。
      • \n
      • 负载均衡器的实际创建是异步发生的。
      • \n
      • 每次你想向外界公开一个服务时,你都必须创建一个新的LoadBalancer并获取一个IP地址。
      • \n
      • 用例\n
          \n
        • 当您使用云提供商来托管 Kubernetes 集群时。
        • \n
        \n
      • \n
      \n
    • \n
    • 外部名称

      \n
        \n
      • ExternalName 类型的服务将服务映射到 DNS 名称,而不是典型的选择器(例如 my-service)。
      • \n
      • 您可以使用参数指定这些服务spec.externalName。\n它通过返回 CNAME 记录及其值,将服务映射到 externalName 字段的内容(例如 foo.bar.example.com)。
      • \n
      • 不建立任何类型的代理。
      • \n
      • 用例\n
          \n
        • 这通常用于在 Kubernetes 中创建服务来表示外部数据存储,例如在 Kubernetes 外部运行的数据库。
        • \n
        • 当一个命名空间中的 Pod 与另一命名空间中的服务通信时,您可以使用该ExternalName 服务(作为本地服务)。
        • \n
        \n
      • \n
      \n
    • \n
    \n
  • \n
\n


dah*_*boy 19

实际理解。

\n

我创建了 2 个服务,其中 1 个用于NodePort,另一个用于ClusterIP

\n

在此输入图像描述

\n

如果我想访问集群内的服务(从主节点或任何工作节点),则两者都可以访问。

\n

在此输入图像描述

\n

现在,如果我想从集群外部访问服务,则只能访问Nodeport而不能访问ClusterIP

\n

在此输入图像描述

\n

在这里你可以看到 localhost 不会监听端口 80,即使我的 nginx 容器正在监听端口 80。

\n
\n

是的,这是唯一的区别。

\n
    \n
  • 集群IP。公开只能从集群内部访问的服务。
  • \n
  • 节点端口。通过每个节点\xe2\x80\x99s IP 上的静态端口公开服务。
  • \n
  • 负载均衡器。通过云提供商\xe2\x80\x99s 负载均衡器公开服务。
  • \n
  • 外部名称。通过返回 CNAME 记录的值将服务映射到预定义的 externalName 字段。
  • \n
\n
\n

实际用例

\n

假设您必须在集群中创建以下架构。我想这很常见。

\n

在此输入图像描述

\n

现在,用户仅在某个端口上与前端通信。后端和数据库服务始终对外部世界隐藏。

\n


小智 14

  1. clusterIP :集群内可访问的 IP(跨集群内的节点)。
nodeA : pod1 => clusterIP1, pod2 => clusterIP2
nodeB : pod3 => clusterIP3.
Run Code Online (Sandbox Code Playgroud)

pod3 可以通过其 clusterIP 网络与 pod1 通信。

  1. nodeport :为了使 pod 可以通过 nodeIP:nodeport 从集群外部访问,它将在上面创建/保留 clusterIP 作为其 clusterIP 网络。
nodeA => nodeIPA : nodeportX
nodeB => nodeIPB : nodeportX
Run Code Online (Sandbox Code Playgroud)

您可以通过 nodeIPA:nodeportX 或 nodeIPB:nodeportX 访问 pod1 上的服务。无论哪种方式都可以工作,因为 kube-proxy(安装在每个节点中)将接收您的请求并使用 clusterIP 网络跨节点分发它[重定向它(iptables term)]。

  1. 负载均衡器

基本上只是将 LB 放在前面,以便将入站流量分配到 nodeIPA:nodeportX 和 nodeIPB:nodeportX,然后继续上面的流程编号 2。


VKa*_*atz 6

Feature ClusterIP NodePort LoadBalancer
博览会 在集群中的内部 IP 上公开服务。 向外部客户公开服务 向外部客户公开服务
这种类型使服务只能从集群内访问 NodePort 服务,每个集群节点在节点本身上打开一个端口(因此得名)并将在该端口上接收到的流量重定向到底层服务。 可通过专用负载均衡器访问的 LoadBalancer 服务,从 Kubernetes 运行的云基础架构提供
无障碍 它是默认服务,内部客户端将请求发送到稳定的内部 IP 地址。 该服务不仅可以通过内部集群 IP 和端口访问,还可以通过所有节点上的专用端口访问。 客户端通过负载均衡器的 IP 连接到服务。
Yaml 配置 type: ClusterIP type: NodePort type: LoadBalancer
端口范围 任何公共 ip 形式的集群 30000 - 32767 任何公共 ip 形式的集群


Bat*_*ses 6

Ref - My blog post Difference between ClusterIP, NodePort and LoadBalancer Service
ClusterIP - In Kubernetes, Clusterip services help applications within the cluster communicate with each other. 在此输入图像描述

NodePort - NodePort services in Kubernetes are a way to expose your application to the outside world or make it accessible from outside the cluster. 在此输入图像描述 LoadBalancer - LoadBalancer services provide a public IP address and port that act as an entry point for external traffic. 在此输入图像描述 The difference between the three service types can be stated as below 在此输入图像描述