Kubernetes Service 简介

英文原文:https://kubernetes.io/docs/tutorials/kubernetes-basics/expose-intro/

Kubernetes服务概述


Kubernetes Pods不是永恒的,实际上它有一个生命周期。当一个工作节点挂掉的时候,运行在上面的Pods也会消失。一个复制操控程序将会通过创建新的Pods使你的应用保持运行,来动态地驱动集群恢复到期望的状态。再举一个例子,考虑一个拥有3个副本的镜像处理后台。这些副本是可以互相替代的;前端系统不需要关注后端的副本,甚至也不需要关注一个Pod是消失还是被重建。即便如此,每一个Kubernetes集群中的Pod都有一个唯一的IP地址,即使在同一个节点上的多个Pods也是这样,所以需要有一种方法能够使Pods中的变化自动保持一致,以保证你的应用持续正常运行。这就要提到服务了。在Kubernetes中,一个服务也是一个抽象概念,它定义了一个逻辑意义上的Pods集合,以及一个控制谁能访问它们的协议[policy]。服务可以使Pods之间的依赖很松散的耦合。一个服务使用YAML(优先)或者JSON来定义,就像所有的Kubernetes对象一样。一个服务标定的Pods集合通常由一个LabelSelector来决定(关于为什么在属性集中你也许不想让服务包含selector,可以看下面的内容)。

即使Pods每个都有一个唯一的IP地址,但是没有服务,这些IP就不会暴露在集群外面。服务允许你的应用接收通讯。服务可以在ServiceSpec中指定一个type来以不同的方式向外部暴露:

  • ClusterIP(默认的) – 在集群中将服务暴露在一个内部IP上。这种类型使得服务只能在集群内部访问。

  • NodePort – 使用NAT,对于集群中每一个选中的节点,将服务暴露在同一个端口上。这样可以使用:来从集群外部访问服务。NodePort是ClusterIP的超集。

  • LoadBalancer – 在当前云环境中创建一个外部的负载均衡器(如果支持的话),并且为服务指定一个固定的外部IP。LoadBalancer是NodePort的超集。

  • ExternalName – 使用一个任意的名字,通过返回一个包含该名字的CNAME记录来暴露服务(在属性集中通过externalName指定名字)。不使用任何协议。这个类型需要kube-dns版本为v1.7及以上。

关于服务的不同类型更多信息,可以参看Using Source IP教程。也可以参看Connecting Applications with Services

另外,要注意在一些场景下,服务的属性集中并没有定义selector。一个没有selector的服务也不会创建对应的路径[Endpoints]对象。这样可以允许用户手动将一个服务映射到指定的路径上。另一个不含selector的原因可能是你严格使用了type: ExternalName

一个Kubernetes服务是一个抽象层,定义了一个逻辑上的Pods集合,并且对这些Pods启用外部通讯暴露,负载均衡和服务发现

服务和标签[Services and Labels]


一个服务在一组Pods中路由流量。服务是一个抽象的概念,它允许pods在Kubernetes中消亡和复制而不影响应用运行。依赖Pods的发现和路由(比如一个应用的前端和后端组件)也是经由服务来处理。

服务使用labels和selectors来匹配一组Pods,这是一个分组元素,可以在Kubernetes中对多个对象进行逻辑操作。Labels是附加到对象上的键值对,可以以多种方式使用,比如:

  • 指明该对象是用于开发,测试,还是生产环境

  • 嵌入版本标签

  • 使用标签对一个对象进行分类

Labels可以在对象创建时附加到对象上,也可以以后再添加。并且你可以随时修改它们。