Kubernetes Services到底是什么以及它们与部署有何不同

时间:2019-07-05 04:16:44

标签: kubernetes

在阅读了诸如deploymentservicethis这样的Kubernetes文档之后,我仍然不清楚服务的目的是什么。

该服务似乎有两个用途:

  1. 将部署暴露于外界(例如,使用LoadBalancer),
  2. 将一个部署暴露给另一部署(例如,使用ClusterIP服务)。

是这种情况吗?那Ingress呢?

------更新------

Connect a Front End to a Back End Using a Service是该服务与部署一起工作的一个很好的例子。

3 个答案:

答案 0 :(得分:2)

服务

部署由一个或多个Pod和Pod的副本组成。假设我们有3个Pod副本在一个部署中运行。现在,假设没有服务。集群中的其他Pod如何访问这些Pod?通过这些吊舱的IP地址。如果我们说其中一个豆荚掉了怎么办。 Kunernetes带来另一个豆荚。现在,这些Pod的IP地址列表发生了变化,所有其他Pod都需要保持相同。启用自动缩放时的情况相同。吊舱的数量根据需求增加或减少。为避免此问题,服务开始发挥作用。因此,服务基本上是管理用于部署的Pod ip列表的程序。

是的,还涉及您在问题中发布的用途。

入口

Ingress是用于为集群中的各种服务提供单个入口点的东西。让我们来看一个简单的场景。在您的集群中,有两项服务。一个用于Web应用程序,另一个用于文档服务。如果仅使用服务而不使用入口,则需要维护两个负载平衡器。这可能会花费更多。为了避免这种情况,入口在定义时位于服务之上,并根据入口中定义的规则和路径路由到服务。

答案 1 :(得分:2)

什么是Ingress?

在Kubernetes中,Ingress是一个对象,该对象允许从Kubernetes集群外部访问Kubernetes服务。您可以通过创建规则集来配置访问权限,这些规则定义了哪些入站连接可以访问哪些服务。

这使您可以将路由规则合并为一个资源。例如,您可能希望将对example.com/api/v1/的请求发送到api-v1服务,而对example.com/api/v2/的请求发送到api-v2服务。使用Ingress,您可以轻松地进行设置,而无需创建一堆LoadBalancers或在Node上公开每个服务。

这将我们引向下一个重点...

Kubernetes入口vs负载平衡器vs NodePort

这些选项都执行相同的操作。它们使您可以向外部网络请求公开服务。它们使您可以从Kubernetes集群外部向集群内部的服务发送请求。

NodePort

enter image description here

NodePort是您在服务的YAML中声明的配置设置。将服务规范的类型设置为NodePort。然后,Kubernetes将在每个节点上为该服务分配一个特定的端口,并且对该端口上集群的任何请求都将转发到该服务。

这很酷,很简单,但并不是超级强大。您不知道将要分配服务的端口,并且有时可能会重新分配该端口。

LoadBalancer

enter image description here

您可以将服务设置为LoadBalancer类型,就像设置NodePort一样-在服务的YAML中指定type属性。集群中需要一些外部负载平衡器功能,通常由云提供商实施。

这通常严重依赖于云提供商-GKE创建了一个网络负载平衡器,该IP地址可用于访问服务。

每次要向外界公开服务时,都必须创建一个新的LoadBalancer并获取IP地址。

入口

enter image description here

NodePortLoadBalancer使您可以通过在服务的type中指定该值来公开该服务。另一方面,Ingress是对您的服务完全独立的资源。您可以分别声明,创建和销毁它到服务中。

这使它与您要公开的服务分离和隔离。它还可以帮助您将路由规则整合到一个地方。

一个缺点是您需要为集群配置一个Ingress Controller。但这很简单-在此示例中,我们将使用Nginx Ingress Controller。

答案 2 :(得分:2)

Kubernetes中的服务是什么?

一项服务允许通过网络访问Kubernetes中的一组Pod。

服务根据其标签选择Pod。对服务发出网络请求后,它将选择群集中与服务选择器匹配的所有Pod,选择其中一个,然后将网络请求转发给它。

enter image description here

Kubernetes服务与部署

Kubernetes中的服务和部署之间有什么区别?

部署负责保持一组Pod的运行。

一项服务负责启用对一组Pod的网络访问。

我们可以使用没有服务的部署来保持一组相同的Pod在Kubernetes集群中运行。可以按比例放大和缩小部署,还可以复制Pod。可以通过直接的网络请求(而不是将它们抽象到服务之后)分别访问每个Pod,但是要跟踪很多Pod很难。

我们也可以在没有部署的情况下使用服务。我们需要分别创建每个Pod(而不是像部署那样“一次全部”创建)。然后,我们的服务便可以根据标签的标签选择网络请求,将网络请求路由到这些Pod。

服务和部署不同,但是它们可以很好地协同工作。