热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

带你玩转kubernetesk8s(第29篇:k8s深入掌握Service:定义详解)

Pod的讲解终于告一段落了,现在我们来一起学习Service。Service是Kubernetes的核心概念,通过创建Service,可以

    Pod的讲解终于告一段落了,现在我们来一起学习Service。      

    Service是Kubernetes的核心概念,通过创建Service,可以为一组具有相同功能的容器应用提供一个统一的入口地址,并且将请求负载分发到后端的各个容器应用上。本章对Service的使用进行详细说明,包括Service的负载均衡机制、如何访问Service、Headless Service、DNS服务的机制和实践、Ingress 7层路由机制等。

   Service的yaml定义文件完整内容如下:

apiVersion: v1 // Required
kind: Service // Required
metadata: // Requiredname: string // Requirednamespace: string // Requiredlabels:- name: stringannotations:- name: string
spec: // Requiredselector: [] // Requiredtype: string // RequiredclusterIP: stringsessionAffinity: stringports:- name: stringprotocol: stringport: inttargetPort: intnodePort: intstatus:loadBalancer:ingress:ip: stringhostname: string

属性名称取值类型是否必选取值说明
apiVersionstringv1
kindstringService
metadataobject元数据
metadata.namestringService名称
metadata.namespacestring命名空间,不指定默认为default

metadata.labels[]

metadata.annotation[]

list

list

 

自定义标签属性列表

自定义注释属性列表

specobject详细描述
spec.selector[]list

label selector配置,将选择具有指定label标签的Pod

作为管理范围

spec.typestring

Service的类型,指定Service的访问方式,默认值为ClusterIP。

1.Cluster IP:虚拟的服务IP地址,该地址用于K8s集群内部的Pod访问,在Node上kube-prox通过设置的optables规则进行转发。

2.NodePort: 使用宿主机的端口,使能够访问各Node的外部客户端通过Node的IP地址和端口号就能访问服务。

3. LoadBalancer: 使用外接负载均衡器完成到服务的负载分发,需要在spec.status.loadBalancer字段指定外部负载均衡器的IP地址,并同时定义nodePort和clusterIP,用于公有云环境。

spec.clusterIPstring 虚拟服务IP地址,当type=clusterIP时,如果不指定。这系统进行自动分配,也可以手工指定:当type=loadBalancer时,这需要指定
spec.sessionAffinitystring 

是否支持Session,可选值为ClusterIP,默认值为空。

clusterIP: 表示同一个客户端的访问请求都转发到同一个后端Pod

spec.ports[]list Service需要暴露的端口列表
spec.ports[].namestring 端口名称
spec.ports[].protocolstring 端口协议,支持TCP和UDP。默认为TCP
spec.ports[].portinit 服务监听的端口号
spec.ports[].targePort

int

 需要转发到后端Pod的端口号
spec.ports[].nodePort

int

 

当spec.type=NodePort时,指定映射到物理机的端口号

statusobject 当spec.type=LoadBalancer时,设置外部负载均衡的地址,用于公有云环境
status.loadBalancerobject 外部负载均衡器
status.loadBalancer.ingressobject 外部负载均衡器
status.loadBalancer.ingress.ipstring 外部负载均衡器的IP地址
status.loadBalancer.ingress.hostnamestring 外部负载均衡器的主机名

Service 的基本用法

      一般来说,对外提供服务的应用程序需要通过某种机制来实现,对于容器应用最简便的方式就是通过TCP/IP机制及监听IP和端口号来实现。例如,定义一个提供Web服务的RC,由两个Tomcat容器副组成,每个容器都通过containerPort设置提供服务的端口号为8080:

webapp-rc.yaml

apiVersion: v1
kind: ReplicationController
metadata:name: webapp
spec:replicas: 2template:metadata:name: webapplabels:app: webappspec:containers:- name: webappimage: tomcatports:- containerPort: 8080

创建该RC之后获取该Pod的IP地址

kubectl get pod -l app=webapp -o yaml | grep podIP

可以直接通过这两个Pod的IP地址和端口号访问Tomcat服务:

       直接通过Pod的IP地址和端口号可以访问到容器应用内的服务,但是Pod的IP地址是不可靠的,例如当Pod所在的Node发生故障时,Pod将被Kubernetes重新调度到另一个Node,Pod的IP地址将发生变化。更重要的是,如果容器应用本身是分布式的部署方式,通过多个实例共同提供服务,就需要在这些实例的前端设置一个负载均衡器来实现请求的分发。Kubernetes中的Service就是用于解决这些问题的核心组件。

       以前面创建的webapp应用为例,为了让客户端应用访问到两个Tomcat Pod实例,需要创建一个Service来提供服务。Kubernetes提供了一种快速的方法,即通过kubectl expose命令来创建Service:

kubectl expose rc webapp

    查看新创建的Service,可以看到系统为它分配了一个虚拟的IP地址(ClusterIP),Service所需的端口号则从Pod中的containerPort复制而来:

接下来就可以通过Service的IP地址和Service的端口号访问该Service了:

这里,对Service地址10.111.79.254:8080的访问被自动负载分发到了后端两个Pod之一。

      除了使用kubectl expose命令创建Service,我们也可以通过配置文件定义Service,再通过kubectl create命令进行创建。例如对于前面的webapp应用,我们可以设置一个Service,代码如下:

apiVersion: v1
kind: Service
metadata:name: webapp1
spec:ports:- port: 8081targetPort: 8080selector:app: webapp

      Service定义中的关键字段是ports和selector。本例中ports定义部分指定了Service所需的虚拟端口号为8081,由于与Pod容器端口号8080不一样,所以需要再通过targetPort来指定后端Pod的端口号。selector定义部分设置的是后端Pod所拥有的label:app=webapp。

目前Kubernetes提供了两种负载分发策略:RoundRobin和SessionAffinity,具体说明如下:

◎ RoundRobin:轮询模式,即轮询将请求转发到后端的各个Pod上。
◎ SessionAffinity:基于客户端IP地址进行会话保持的模式,即第1次将某个客户端发起的请求转发到后端的某个Pod上,之后从相同的客户端发起的请求都将被转发到后端相同的Pod上。

       在默认情况下,Kubernetes采用RoundRobin模式对客户端请求进行负载分发,但我们也可以通过设置service.spec.sessionAffinity=ClientIP来启用SessionAffinity策略。这样,同一个客户端IP发来的请求就会被转发到后端固定的某个Pod上了。

       通过Service的定义,Kubernetes实现了一种分布式应用统一入口的定义和负载均衡机制。Service还可以进行其他类型的设置,例如设置多个端口号、直接设置为集群外部服务,或实现为Headless Service(无头服务)模式。


多端口Service

      有时一个容器应用也可能提供多个端口的服务,那么在Service的定义中也可以相应地设置为将多个端口对应到多个应用服务。在下面的例子中,Service设置了两个端口号,并且为每个端口号都进行了命名:

apiVersion: v1
kind: Service
metadata:name: webapp2
spec:ports:- port: 8080targetPort: 8080name: web- port: 8005targetPort: 8005name: managementselector:app: webapp

另一个例子是两个端口号使用了不同的4层协议—TCP和UDP:

apiVersion: v1
kind: Service
metadata:name: webapp3
spec:ports:- port: 8080protocol: UDPname: tdp- port: 8080protocol: TCPname: tcpselector:app: webapp


外部服务Service

     在某些环境中,应用系统需要将一个外部数据库作为后端服务进行连接,或将另一个集群或Namespace中的服务作为服务的后端,这时可以通过创建一个无Label Selector的Service来实现:

kind: Service
apiVersion: v1
metadata:name: my-service
spec:ports:- protocol: TCPport: 80targetPort: 80

     

通过该定义创建的是一个不带标签选择器的Service,即无法选择后端的Pod,系统不会自动创建Endpoint,因此需要手动创建一个和该Service同名的Endpoint,用于指向实际的后端访问地址。创建Endpoint的配置文件内容如下:

kind: Endpoints
apiVersion: v1
metadata:name: my-service
subsets:
- addresses:- ip: 1.2.3.4ports:- port: 8080

 

  访问没有标签选择器的Service和带有标签选择器的Service一样,请求将会被路由到由用户手动定义的后端Endpoint上。

 

    小结:

            本节内容到此结束,是不是觉得很简单呢?

            觉得简单,说明我们已经入k8s的门了,继续加油!

            多多点关注哦~

            


推荐阅读
  • 从理想主义者的内心深处萌发的技术信仰,推动了云原生技术在全球范围内的快速发展。本文将带你深入了解阿里巴巴在开源领域的贡献与成就。 ... [详细]
  • 本文探讨了在使用JavaMail发送电子邮件时,抄送功能未能正常工作的问题,并提供了详细的代码示例和解决方法。 ... [详细]
  • 使用Echarts for Weixin 小程序实现中国地图及区域点击事件
    本文介绍了如何使用Echarts for Weixin在微信小程序中构建中国地图,并实现区域点击事件。包括效果展示、条件准备和逻辑实现的具体步骤。 ... [详细]
  • 本文总结了近年来在实际项目中使用消息中间件的经验和常见问题,旨在为Java初学者和中级开发者提供实用的参考。文章详细介绍了消息中间件在分布式系统中的作用,以及如何通过消息中间件实现高可用性和可扩展性。 ... [详细]
  • DirectShow Filter 开发指南
    本文总结了 DirectShow Filter 的开发经验,重点介绍了 Source Filter、In-Place Transform Filter 和 Render Filter 的实现方法。通过使用 DirectShow 提供的类,可以简化 Filter 的开发过程。 ... [详细]
  • ABP框架是ASP.NET Boilerplate的简称,它不仅是一个开源且文档丰富的应用程序框架,还提供了一套基于领域驱动设计(DDD)的最佳实践架构模型。本文将详细介绍ABP框架的特点、项目结构及其在Web API优先架构中的应用。 ... [详细]
  • Java EE 平台集成了多种服务、API 和协议,旨在支持基于 Web 的多层应用程序开发。本文将详细介绍 Java EE 中的 13 种关键技术规范,帮助开发者更好地理解和应用这些技术。 ... [详细]
  • vue引入echarts地图的四种方式
    一、vue中引入echart1、安装echarts:npminstallecharts--save2、在main.js文件中引入echarts实例:  Vue.prototype.$echartsecharts3、在需要用到echart图形的vue文件中引入:   importechartsfrom"echarts";4、如果用到map(地图),还 ... [详细]
  • 本文详细介绍了JQuery Mobile框架中特有的事件和方法,帮助开发者更好地理解和应用这些特性,提升移动Web开发的效率。 ... [详细]
  • OBS Studio自动化实践:利用脚本批量生成录制场景
    本文探讨了如何利用OBS Studio进行高效录屏,并通过脚本实现场景的自动生成。适合对自动化办公感兴趣的读者。 ... [详细]
  • Flutter 核心技术与混合开发模式深入解析
    本文深入探讨了 Flutter 的核心技术,特别是其混合开发模式,包括统一管理模式和三端分离模式,以及混合栈原理。通过对比不同模式的优缺点,帮助开发者选择最适合项目的混合开发策略。 ... [详细]
  • 腾讯云移动推送TPNS(Tencent Push Notification Service)为APP开发者和运营人员提供了一站式、高效、稳定的推送解决方案,帮助提升用户活跃度和运营效率。 ... [详细]
  • 本文介绍了如何将Spring属性占位符与Jersey的@Path和@ApplicationPath注解结合使用,以便在资源路径中动态解析属性值。 ... [详细]
  • 深入理解Java多线程与并发机制
    本文探讨了Java多线程和并发机制的核心概念,包括多线程类的分类、执行器框架、并发容器及控制工具。通过详细解析这些组件,帮助开发者更好地理解和应用多线程技术。 ... [详细]
  • Spring 中策略模式的应用:Resource 接口详解
    本文探讨了在 Spring 框架中如何利用 Resource 接口实现资源访问策略。Resource 接口作为资源访问策略的抽象,通过多种实现类支持不同类型的资源访问。 ... [详细]
author-avatar
小群群zheng
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有