Service介绍-Service常用类型-Endpoints服务代理

简介

K8s 中的Service是一种抽象,用于定义一组Pod的逻辑集合,并为它们提供统一的网络入口。Service充当了Pod的负载平衡器和服务发现器,为应用程序提供了稳定的网络地址,使得应用程序可以访问与之关联的Pod而无需了解其具体的IP地址或端口。

Service特点和功能:

  • 稳定的网络地址:Service为一组Pod提供了一个虚拟IP地址(ClusterIP),这个地址是稳定的,不受后端Pod的变化影响。应用程序可以通过Service的虚拟IP地址来访问与之关联的Pod。

  • 负载平衡:Service可以将传入的请求分发到与之关联的多个Pod中,实现负载平衡,从而提高应用程序的可用性和性能。

  • 服务发现:Service充当了服务发现器的角色,使得其他应用程序或服务可以通过Service名称来发现和访问它所代表的后端Pod。

  • 多种类型:Kubernetes支持多种类型的Service,包括ClusterIP、NodePort、LoadBalancer和ExternalName等,每种类型适用于不同的场景和需求。

  • 选择器匹配:Service通过标签选择器(Selectors)来确定与之关联的Pod集合。只有具有特定标签的Pod才会被Service选中。

  • 会话关联:可选的会话关联(Session Affinity)功能可以确保将来自同一客户端的请求路由到相同的后端Pod,以维护会话状态。

总之,Service 是 Kubernetes 中一种非常重要的资源,它提供了一种抽象和统一的方式来公开应用程序,并实现负载均衡和服务发现,从而简化了微服务架构中的网络管理和通信。

创建 Service

例如,假定有一组 Pod,每个 Pod 都在侦听 TCP 端口 9376,并且它们还被打上 app.kubernetes.io/name=MyApp 标签。你可以定义一个 Service 来发布该 TCP 侦听器。

apiVersion: v1
kind: Service     # 指定了资源的类型,这里是Service。
metadata:         # 指定了Service的元数据,包括标签和名称。labels:         # 指定了一组标签,这里有一个标签run: redisrun: redisname: my-service                # 指定了Service的名称,这里是 my-service
spec:						      # 指定了Service的规格,包括端口、选择器、会话关联等。internalTrafficPolicy: Cluster  # 指定了内部流量策略,这里设置为Cluster,表示只使用集群内部的流量。ipFamilies:					  # 指定了IP族,这里设置为IPv4,表示只使用IPv4地址。- IPv4ipFamilyPolicy: SingleStack     # 指定了IP族策略,这里设置为SingleStack,表示只使用单一的IP族。ports:						  # 指定了Service监听的端口和转发的目标端口。- port: 80					  # 指定了Service监听的端口,这里是80。protocol: TCP				  # 指定了协议,这里是TCP。targetPort: 6379			  # 指定了转发的目标端口,也就是后端pod 端口,这里也是80。selector:					      # 指定了Service所选择的Pod的标签,这里选择了带有run: redis 标签的 Pod。run: redissessionAffinity: None			  # 指定了会话关联的策略,这里设置为None,表示不启用会话关联type: ClusterIP				  # 指定了Service的类型,这里是ClusterIP,表示Service只在集群内部可访问。

这个Service将流量从集群内部的80端口转发到具有run: redis 标签的Pod,并且只使用IPv4地址。Service 能够将任意入站 port 映射到某个 targetPort。 默认情况下,出于方便考虑,targetPort 会被设置为与 port 字段相同的值。

端口定义

Pod 中的端口定义是有名字的,你可以在 Service 的 targetPort 属性中引用这些名字。 例如,我们可以通过以下方式将 Service 的 targetPort 绑定到 Pod 端口:

apiVersion: v1
kind: Pod
metadata:name: nginxlabels:app.kubernetes.io/name: proxy
spec:containers:- name: nginximage: nginx:stableports:- containerPort: 80name: http-web-svc---
apiVersion: v1
kind: Service
metadata:name: nginx-service
spec:selector:app.kubernetes.io/name: proxyports:- name: name-of-service-portprotocol: TCPport: 8080targetPort: http-web-svc  # 后端 pod 端口的名字 也可以写80端口

Service 的默认协议是 TCP;除此之外还有 UDP SCTP两种协议。

EndpointSlices

  • EndpointSlice 是 Kubernetes 1.16 引入的新概念,用于解决 Endpoints 对象过大的问题。
  • EndpointSlice 将一个服务的终端信息分成多个小的片段(Slice),每个片段包含一部分后端 Pod 的信息。
  • 每个 EndpointSlice 对象都包含了一部分服务终端的 IP 地址和端口信息,以及与之相关联的标签和条件信息。
  • EndpointSlice 可以更有效地管理大规模服务,减少对 Kubernetes API Server 的压力,并提高服务发现的性能。

使用EndpointSlice的建议

  • 对于普通的服务发现和负载均衡需求,通常只需关注 Endpoints 即可。
  • 当处理大型服务或大规模集群时,EndpointSlice 可以提供更好的性能和可伸缩性。
  • 大多数情况下,不需要直接操作 EndpointSlice,因为 Kubernetes 会自动管理它们
  • 默认情况下,控制面创建和管理的 EndpointSlice 将包含不超过 100 个端点。 你可以使用 kube-controller-manager 的 --max-endpoints-per-slice 标志设置此值,最大值为 1000。

总的来说,Endpoints 和 EndpointSlice 都是 Kubernetes 中用于表示服务终端的重要资源,它们提供了服务发现和负载均衡的功能,但 EndpointSlice 更适用于处理大规模服务和大型集群。

查看 EndpointSlice:

# 查看 endpointslice 资源
kubectl get endpointslice# 查看 endpointslice 自动生成的yaml文件
kubectl get endpointslice -oyaml

endpointslice的yaml文件介绍

addressType: IPv4							# 指定了终端的地址类型,这里是IPv4
apiVersion: discovery.k8s.io/v1				# 指定了资源的API版本
endpoints:									# 包含了服务终端的详细信息,每个元素表示一个终端
- addresses:								# 指定了后端 Pod 的IP地址- 172.21.231.188conditions:								# 包含了终端的状态条件,例如是否就绪、正在服务、是否终止等ready: trueserving: trueterminating: falsenodeName: node02							# 指定了运行该终端的节点名称targetRef:								# 指定了与终端相关联的目标资源,例如Podkind: Pod								# 资源类型为Podname: php-apache-7d4456444b-8t2bz		# 代理的后端Pod名字
kind: EndpointSlice							# 指定了资源的类型为EndpointSlice
metadata:									# 包含了资源的元数据信息generateName: php-apache-					# 指定了资源的生成名称generation: 13							# 指定了资源的生成数labels:									# 资源的标签信息,用于标识和分类资源endpointslice.kubernetes.io/managed-by: endpointslice-controller.k8s.iokubernetes.io/service-name: php-apacherun: php-apachename: php-apache-6mzj5					# 指定了资源的名称ownerReferences:							# 指定了资源的所有者引用,例如与之关联的Service- apiVersion: v1blockOwnerDeletion: truecontroller: truekind: Servicename: php-apache
ports:										# 指定了服务终端监听的端口信息
- name: ""port: 80protocol: TCP

Endpoints

在 K8S 中,Endpoints 是一种 API 资源,用于表示一个服务的终端,即该服务所关联的后端 Pod 的网络地址信息。当创建一个 Service 对象时,K8S 会自动创建相应的 Endpoints 对象,用于存储该服务的后端 Pod 的 IP 地址和端口信息。

Endpoints 主要用于以下几个方面:

  • 服务发现:Endpoints 提供了一种机制,使得其他应用程序或服务可以发现和访问与之关联的后端 Pod。通过查询 Endpoints,应用程序可以获取到与之关联的所有后端 Pod 的 IP 地址和端口信息,并与其进行通信。
  • 负载均衡:当一个服务与多个 Pod 关联时,K8S 会自动在 Endpoints 中存储这些 Pod 的地址信息。Service 对象会将请求转发到与之关联的所有 Pod 中,从而实现负载均衡的效果。
  • 服务代理:可以使用Endpoints yaml文件手动修改代理除K8S自己以外的服务。

Endpoints yaml文件介绍

查看方法

kubectl get endpoints php-apache -oyaml
apiVersion: v1  							# 指定了 Kubernetes API 的版本
kind: Endpoints								# 指定了资源类型为 Endpoints
metadata:									# 包含了资源的元数据信息,包括标签和名称labels:run: php-apachename: php-apache							# 资源名字
subsets:									# 包含了终端的子集信息,每个子集表示一组后端 Pod
- addresses:								- ip: 172.21.231.188						# 后端Pod地址nodeName: node02						# Pod 运行在在那个节点上targetRef:kind: Pod                             # 后端代理的资源类型name: php-apache-7d4456444b-8t2bz		# 代理的Pod名字ports:- port: 80								# 指定代理后端 Pod 的端口号protocol: TCP							# 指定协议

使用Endpoints 代理K8S外部服务

例如使用 Endpoints 外部nginx服务,具体配置如下:

---
apiVersion: v1
kind: Service
metadata:labels:k8s-app: web-nginx        # 标签必须和下面的Endpoints标签一致name: web-nginx             # Service 名字必须和下面Endpoints 名字一直
spec:ports:- name: http				  # ports 名字必须和下面一致port: 8080			      # Service 自己的端口按需修改protocol: TCP             # 协议按需修改targetPort: 80            # 代理外部服务端口必须和Endpoints的端口一致sessionAffinity: None		  # 是否建立回话关联type: ClusterIP			  # 服务类型
---
apiVersion: v1
kind: Endpoints
metadata:labels:k8s-app: web-nginx        # 标签和上面一致name: web-nginx			  # 名字和上面一致
subsets:
- addresses:				  # 需要代理外部的服务地址   有几个就写几个- ip: 192.168.1.161
#  - ip: 192.168.1.207
#  - ip: 192.168.1.251ports:- name: http                # post 名字和上面一致port: 80                  # 端口和外部服务的端口一致和上面的端口一致protocol: TCP			  # 和上面一致

修改好以后创建

按照我这个配置正常情况下肯定是可以代理外部服务了,这样代理外部服务主要是为了统一所有环境的配置文件。

kubectl create -f web-nginx.yaml

使用 Service 代理外部域名

使用 Service 代理百度域名 ,肯定能代理成功,但是百度不允许跨域访问。

apiVersion: v1
kind: Service
metadata:labels:app: web-nginxname: web-nginx
spec:type: ExternalNameexternalName: www.baidu.com

Service 常用类型

ClusterIP

通过集群的内部 IP 公开 Service,选择该值时 Service 只能够在集群内部访问。 这也是你没有为服务显式指定 type 时使用的默认值。

示例:

apiVersion: v1
kind: Service
metadata:labels:run: php-apachename: php-apache
spec:ports:- port: 80protocol: TCPtargetPort: 80selector:run: php-apachetype: ClusterIP    # 不指定类型默认是 ClusterIP

NodePort

通过每个节点上的 IP 和静态端口(NodePort)公开 Service。 为了让 Service 可通过节点端口访问,Kubernetes 会为 Service 配置集群 IP 地址, 相当于你请求了 type: ClusterIP 的服务。

示例:

apiVersion: v1
kind: Service
metadata:name: my-service
spec:type: NodePortselector:app.kubernetes.io/name: MyAppports:# 默认情况下,为了方便起见,`targetPort` 被设置为与 `port` 字段相同的值。- port: 80targetPort: 80# 可选字段# 默认情况下,为了方便起见,Kubernetes 控制平面会从某个范围内分配一个端口号#(默认:30000-32767)nodePort: 30007  # NodePort 可以自己指定端口,不指定的话就是随机端口

K8S 默认的端口范围是(30000-32767)可以自己修改:
二进制方式部署的修改apiserver启动文件即可
–service-node-port-range=30000-32767

vim /usr/lib/systemd/system/kube-apiserver.service

kubeadm 方式部署的修改这个文件夹下面 /etc/kubernetes/ 找到kube-apiserver.yaml 有关的文件修改即可 ,参数都是一样的。

LoadBalancer

用于将外部流量均衡地分发到集群中的后端 Pod。LoadBalancer 在云提供商(如AWS、阿里云,腾讯云等)上创建一个负载均衡器,并将该负载均衡器配置为将流量路由到 Kubernetes 集群中的 Service。这使得应用程序可以通过公共 IP 地址或 DNS 名称访问 Kubernetes 集群中的服务。

示例:

apiVersion: v1
kind: Service
metadata:name: my-service
spec:selector:app.kubernetes.io/name: MyAppports:- protocol: TCPport: 80targetPort: 9376clusterIP: 10.0.171.239type: LoadBalancer
status:loadBalancer:ingress:- ip: 192.0.2.127

如要设置内部负载均衡器,请根据你所使用的云平台,为 Service 添加以下注解之一:

阿里云:

metadata:annotations:service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type: "intranet"

百度云:

metadata:name: my-serviceannotations:service.beta.kubernetes.io/cce-load-balancer-internal-vpc: "true"

腾讯云:

metadata:annotations:service.kubernetes.io/qcloud-loadbalancer-internal-subnetid: subnet-xxxxx

AWS:

metadata:name: my-serviceannotations:service.beta.kubernetes.io/aws-load-balancer-internal: "true"

ExternalName

将服务映射到 externalName 字段的内容(例如,映射到主机名 api.foo.bar.example)。 该映射将集群的 DNS 服务器配置为返回具有该外部主机名值的 CNAME 记录。

示例:

## 代理外部域名就是用的这个类型
apiVersion: v1
kind: Service
metadata:name: my-servicenamespace: prod
spec:type: ExternalNameexternalName: my.database.example.com

无头Service(Headless Services)

无头服务K8S中一种特殊类型的服务,与普通的服务类型(如ClusterIP、NodePort、LoadBalancer)不同,它并不分配 ClusterIP,也不会代理流量到任何后端 Pod。相反,它的主要目的是为了服务发现,通过 DNS 记录提供了服务的所有 Pod 的 IP 地址列表。这样,应用程序可以直接通过 Pod 的 IP 地址来访问服务,而不需要经过 Kubernetes 的服务代理。

由于无头服务提供了每个 Pod 的直接 IP 地址,因此它通常用于运行有状态应用程序,如数据库、缓存

示例:

apiVersion: v1
kind: Service
metadata:name: mysqllabels:app: mysqlapp.kubernetes.io/name: mysql
spec:ports:- name: mysqlport: 3306clusterIP: None   # 类型设置为noneselector:app: mysql

查询 DNS 记录: 使用 Pod 内置的 DNS 解析功能,可以通过无头服务的 DNS 名称来获取所有后端 Pod 的 IP 地址列表。例如,通过查询 my-headless-service.namespace.svc.cluster.local 可以获取到所有与 my-headless-service 服务关联的 Pod 的 IP 地址列表。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/793884.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux:make/makefile的使用

一、什么是makefile/make 会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力 一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的 规则来指定,哪些文件需要先编译&am…

深度学习的发展历史与关键技术

深度学习的发展历史与关键技术 引言1. 早期神经网络:感知机2. 多层感知机3. 梯度下降算法4. 反向传播算法5. 深度神经网络6. 深度学习的发展历程6.1 早期阶段6.2 重新复兴6.3 深度学习的兴起 结论 引言 深度学习作为人工智能领域的一个重要分支,在过去几…

蓝桥杯嵌入式总结

用到外部时钟:UART,ADC,RTC 用到中断:UART,TIM LED_KEY: 将高低电平写入对应引脚 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET); 读取对应引脚的电平状态 HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0) UART: 发送: int fputc(int …

P1331 海战 (深搜)

题目背景 在峰会期间,武装部队得处于高度戒备。警察将监视每一条大街,军队将保卫建筑物,领空将布满了 F-2003 飞机。 此外,巡洋船只和舰队将被派去保护海岸线。不幸的是,因为种种原因,国防海军部仅有很少的…

设置Chrome打开链接在新标签页显示

Chrome版本 版本 123.0.6312.106(正式版本) (64 位) 下面这两个页面都有设置按钮: https://www.google.com/?pli1或者https://www.google.com/?hlzh-CN 要先退出账号,要不然看不到右下角的 “设置” 。…

TCP/IP协议、HTTP协议和FTP协议等网络协议包简介

文章目录 一、常见的网络协议二、TCP/IP协议1、TCP/IP协议模型被划分为四个层次2、TCP/IP五层模型3、TCP/IP七层模型 三、FTP网络协议四、Http网络协议1、Http网络协议简介2、Http网络协议的内容3、HTTP请求协议包组成4、HTTP响应协议包组成 一、常见的网络协议 常见的网络协议…

内部类(InnerClass) 总结

类的成员之五:内部类1. 什么是内部类? 将一个类A定义在另一个类B里面,里面的那个类A就称为内部类(InnerClass),类B则称为外部类(OuterClass)。 内部只供外部类使用 2. 为什么需要内部…

富格林:正规思路实现得益出金

富格林悉知,随着金融市场的不断发展,黄金作为一种正规投资品种被越来越多投资者认识,在黄金投资市场中,有各种各样复杂的信息,投资者要懂得明辨是非,树立正规做单思路避免受害亏损。以下也为大家总结几点正…

STM32为什么不能跑Linux?

STM32是一系列基于ARM Cortex-M微控制器的产品,它们主要用于嵌入式系统中。而Linux则是一个开源的类Unix操作系统,主要面向的是桌面电脑、服务器等资源丰富的计算机。虽然理论上可以将Linux移植到STM32上运行,但是由于两者之间存在着很多技术…

vivado 配置存储器器件编程2

为双 QSPI (x8) 器件创建配置存储器文件 您可使用 write_cfgmem Tcl 命令来为双 QSPI (x8) 器件生成 .mcs 镜像。此命令会将配置数据自动拆分为 2 个独立 的 .mcs 文件。 注释 : 为 SPIx8 生成 .mcs 时指定的大小即为这 2 个四通道闪存器件的总大小。…

QA测试开发工程师面试题满分问答5: 内存溢出和内存泄漏问题

概念阐述 内存溢出(Memory Overflow)和内存泄漏(Memory Leak)是与计算机程序中的内存管理相关的问题,它们描述了不同的情况。 内存溢出是指程序在申请内存时,要求的内存超出了系统所能提供的可用内存资源…

SSM框架学习——Eclipse创建Spring MVC maven项目

Spring MVC项目创建 什么是Spring MVC Spring MVC是Spring内置的,实现了Web MVC设计模式的框架。 它解决了Web开发过程中很多的问题,例如参数接收、表单验证等。另外它采用松散耦合可插拔组件等结构,具有相对较高的灵活性和扩展性。 Spri…

vue创建项目下载动态路由v-for mounted websocket :style :class store使用说明

在Vue中创建一个项目,并整合动态路由、v-for、mounted生命周期钩子、WebSocket、:style、:class以及Vuex的store,涉及到多个Vue核心特性的使用。下面我将简要说明如何逐步整合这些特性。 1. 创建Vue项目 使用Vue CLI创建项目: 2. 配置动态路…

html怎么实现axios发请求,并且实现跨域

方案是代理服务器 前端处理 一、下包 save是开发环境的意思 可以单独弄个server文件夹或者其他也行 npm install express --savenpm install http-proxy-middleware --save二、准备proxy-server.js文件 const express = require(express) const {createProxyMiddleware } = r…

C++ 类(初篇)

类的引入 C语言中,结构体中只能定义变量,在C中,结构体内不仅可以定义变量,也可以定义函数。 而为了区分C和C我们将结构体重新命名成class去定义 类的定义 标准格式: class className {// 类体:由成员函…

【计算机网络】epoll

IO多路转接 - epoll 一、I/O多路转接之 epoll1. epoll 接口(1)epoll_create()(2)epoll_wait()(3)epoll_ctl() 2. epoll 原理3. epoll 的优点4. epoll 的使用5. epoll 的工作模式(1)水…

实验四 Java图形界面与事件处理(头歌)

实验四 Java图形界面与事件处理(头歌) 制作不易!点个关注!给大家带来更多的价值! 目录 实验四 Java图形界面与事件处理(头歌) 制作不易!点个关注!给大家带来更多的价值!代码如下: 代码如下&…

platformio创建项目卡死问题(ctl解决)

vscode上安装完platformio后,创建一个新项目,始终在转圈,查阅官网文档后发现可以使用ctl在终端中创建项目,本文方案的前提是终端走了代理。 根据官网命令安装ctl: curl -fsSL -o get-platformio.py https://raw.gith…

case语句

Oracle从入门到总裁:​​​​​​https://blog.csdn.net/weixin_67859959/article/details/135209645 CASE 语句的执行方式与 IF...THEN...ELSIF 语句的执行方式类似,但是它是通过一个表达式的值来决定执行哪个分支 CASE 选择器表达式 WHEN 条件 1 THEN 语句序列 …

2024.03.23校招 实习 内推 面经

绿*泡*泡VX: neituijunsir 交流*裙 ,内推/实习/校招汇总表格 1、校招 | 元戎启行 2024春招(内推) 校招 | 元戎启行 2024春招(内推) 2、校招 | 博雅工道机器人 2024春季校园招聘开始了! 校招…