kubernetes service 服务

1 service作用

使用kubernetes集群运行工作负载时,由于Pod经常处于用后即焚状态,Pod经常被重新生成,因此Pod对应的IP地址也会经常变化,导致无法直接访问Pod提供的服务,Kubernetes中使用了Service来解决这一问题,即在Pod前面使用Service对Pod进行代理,无论Pod怎样变化,只要有Label,就可以让Service能够联系上Pod,把PodIP地址添加到Service对应的端点列表(Endpoints)实现对PodIP跟踪,进而实现通过Service访问Pod目的。

  • 通过service为pod客户端提供访问pod方法,即可客户端访问pod入口
  • 通过标签动态感知podIP地址变化等
  • 防止pod失联
  • 定义访问pod访问策略
  • 通过label-selector相关联通过Service实现Pod的负载均衡(TCP/UDP 4层)
  • 底层实现由kube-proxy通过userspace、iptables、ipvs三种代理模式

2 Kube-proxy三种代理模式

2.1 userspace 模式

userspace 模式是 kube-proxy 的最早实现方式,主要工作原理如下:

(1)kube-proxy 监听 Kubernetes API 服务器中 Service 和 Endpoint 的变化。

(2)当有新的 Service 创建时,kube-proxy 会在节点上打开一个端口,并将这个端口映射到 Service 对应的后端 Pod。

(3)任何对这个端口的访问请求,都会被 kube-proxy 捕捉,并转发到后端的 Pod。kube-proxy 使用用户空间程序来进行这些转发操作。

这种模式的优点是实现简单,但缺点是性能较低,因为每个数据包都需要经过用户空间的处理,增加了额外的开销和延迟。

2.2 iptables 模式

iptables 模式是 kube-proxy 的改进版,相比 userspace 模式有显著的性能提升。其工作原理如下:

(1)kube-proxy 同样监听 Kubernetes API 服务器中 Service 和 Endpoint 的变化。

不同的是,kube-proxy 使用 iptables 来设置网络规则。这些规则会直接在内核空间进行处理,而不是通过用户空间。

(2)当有新的 Service 创建时,kube-proxy 会生成相应的 iptables 规则,定义从 Service IP 和端口到后端 Pod 的 NAT 转发规则。

(3)数据包在内核空间直接被转发到相应的后端 Pod,减少了上下文切换,提高了转发性能。

iptables 模式的优点是性能更好,但在处理大量规则时,规则管理和更新可能会变得复杂。

2.3 ipvs 模式

ipvs 模式是 kube-proxy 的最新实现方式,使用 Linux 内核中的 IP Virtual Server (IPVS) 技术。其工作原理如下:

(1)kube-proxy 监听 Kubernetes API 服务器中 Service 和 Endpoint 的变化

(2)kube-proxy 使用 IPVS 来创建和维护负载均衡规则。IPVS 是内核中的一个模块,专门用于负载均衡,支持多种调度算法。

(3)当有新的 Service 创建时,kube-proxy 会使用 IPVS 创建相应的负载均衡规则,定义从 Service IP 和端口到后端 Pod 的转发规则。

(4)数据包在内核空间通过 IPVS 直接转发,性能更高,同时支持更多的负载均衡算法(如轮询、最小连接数、最短延迟等)。

(5)ipvs 模式的优点是性能最佳,支持更多的负载均衡算法和更复杂的网络规则,但需要内核支持 IPVS 模块。

2.4 iptables与ipvs对比

iptables

  • 优点:灵活,功能强大(可以在数据包不同阶段对包进行操作)
  • 缺点:表中规则过多时,响应变慢,即规则遍历匹配和更新,呈线性时延。

ipvs

  • 优点:转发效率高。调度算法丰富:rr,wrr,lc,wlc,ip hash...。
  • 缺点:内核支持不全,低版本内核不能使用,需要升级到4.0或5.0以上。

3 service类型

3.1 类型

ClusterlP

  • 默认,分配一个集群内部可以访问的虚拟IP

NodePort

  • 在每个Node上分配一个端口作为外部访问入口
  • nodePort端口范围为:30000-32767

LoadBalancer

  • 工作在特定的Cloud Provider上,例如Google Cloud,AWS,OpenStack

ExternalName

  • 表示把集群外部的服务引入到集群内部中来,即实现了集群内部pod和集群外部的服务进行通信

3.2 service参数

port:访问service使用的端口

targetPort:Pod中容器端口

nodePort:通过Node实现外网用户访问k8s集群内service(30000-32767)

4 service创建

4.1 ClusterIP类型

ClusterlP根据是否生成ClusterlP又可分为普通service和handless service

普通Service:

为Kubernetes的Service分配一个集群内部可访问的固定虚拟IP(ClusterIP),实现集群内的访问。

Headless Service:

该服务不会分配ClusterIP,也不通过kube-proxy做反向代理和负载均衡。而是通过DNS提供稳定的网络ID来访问,DNS会将headless service的后端直接解析为pod IP列表。

4.1.1 普通ClusterIP service创建

通过命令行从Deployment创建Service

如果你有一个名为my-deployment的Deployment,你可以使用以下命令为其创建一个Service:

kubectl expose deployment my-deployment --port=80 --type=ClusterIP

再使用get和describe查看svc

通过IP地址访问:

service可以实现负载均衡的效果

创建一个拥有三个副本的deployment

[root@easzlab ~]# kubectl get pod
NAME                               READY   STATUS    RESTARTS   AGE
nginx-deployment-55f598f8d-gcszt   1/1     Running   0          22m
nginx-deployment-55f598f8d-kj5nz   1/1     Running   0          22m
nginx-deployment-55f598f8d-p2dsr   1/1     Running   0          22m

以其中一个pod为例

[root@easzlab ~]# kubectl exec -it nginx-deployment-55f598f8d-p2dsr  -- /bin/bash
root@nginx-deployment-55f598f8d-p2dsr:/# cd /usr/share/nginx/html
root@nginx-deployment-55f598f8d-p2dsr:/usr/share/nginx/html# echo "web1" > index.html
root@nginx-deployment-55f598f8d-p2dsr:/usr/share/nginx/html# exit

三个pod设置好后,使用curl访问,可以看到每次访问的都是不同的pod,可以实现出负载均衡的效果。

通过资源清单创建service

1.创建Deployment的YAML文件

apiVersion: apps/v1
kind: Deployment
metadata:name: my-nginx-deployment
spec:replicas: 2selector:matchLabels:app: my-nginxtemplate:metadata:labels:app: my-nginxspec:containers:- name: nginximage: nginx:1.19.0ports:- containerPort: 80

2.创建Service的YAML文件

apiVersion: v1
kind: Service
metadata:name: my-nginx-service
spec:selector:app: my-nginxports:- protocol: TCPport: 80targetPort: 80type: ClusterIP

验证资源是否创建成功

kubectl get deployments
kubectl get services

查看资源详情

kubectl describe deployment my-nginx-deployment
kubectl describe service my-nginx-service
4.1.2 Headless Service
  • 普通的ClusterlP service是service name解析为cluster ip,然后cluster ip对应到后面pod ip
  • Headless service是指service name直接解析为后面的pod ip

特点和行为

  • DNS记录:Headless Service会在Kubernetes DNS中为每个匹配的Pod创建一个A记录(Address Record),直接指向Pod的IP地址。
  • 无负载均衡:由于没有ClusterIP,Headless Service不提供内置的负载均衡。
  • 适用于StatefulSets:Headless Service非常适合与StatefulSets一起使用,因为StatefulSets为每个Pod提供了一个稳定的网络标识和持久存储。

创建Service的YAML文件

apiVersion: v1
kind: Service
metadata:name: headless-service
spec:clusterIP: None  # 设置为None以创建Headless Serviceselector:app: my-app    # 设置标签,对应deploymentports:- protocol: TCPport: 80targetPort: 80

DNS解析

在集群内部,可以使用nslookup或dig命令来解析Headless Service的DNS记录:

kubectl run -it --rm --image=tutum/dnsutils dnsutils -- nslookup headless-service.default.svc.cluster.local.

这将显示与Service选择器匹配的Pods的IP地址列表。

4.2 NodePort类型

NodePort Service通常用于以下场景:

  • 当你需要从集群外部访问服务,但不想使用外部负载均衡器时。
  • 作为临时解决方案,直到设置好外部负载均衡器。
  • 允许外部流量直接进入集群,但通过特定的节点端口。

创建NodePort Service

apiVersion: v1
kind: Service
metadata:name: nginx-nodeport
spec:type: NodePort  # 指定Service类型为NodePortselector:app: nginxports:- protocol: TCPport: 80  # Service端口,集群内部访问的端口targetPort: 80  # 转发到Pod的端口nodePort: 30080  # 节点上的静态端口,外部访问的端口

应用Service

kubectl apply -f nginx-nodeport.yaml

验证Service

kubectl get services

访问Service

一旦NodePort Service创建成功,你可以通过任何节点的IP地址加上nodePort来访问服务。

http://<任一节点IP>:30080

4.3 LoadBalancer类型

LoadBalancer是Kubernetes Service的一种类型,它为服务提供了一个外部可访问的IP地址。这个IP地址是通过云服务提供商的负载均衡器实现的,它可以将流量分发到服务背后的多个Pod。

创建LoadBalancer Service

apiVersion: v1
kind: Service
metadata:name: nginx-lb-service
spec:type: LoadBalancerselector:app: nginxports:- protocol: TCPport: 80targetPort: 80

应用Service

kubectl apply -f nginx-lb-service.yaml

检查Service状态

kubectl get services

访问LoadBalancer服务

http://<EXTERNAL-IP>

4.4 ExternalName类型

ExternalName 是一种特殊类型的Service,它不是用来创建一个集群内部的服务代理或负载均衡器,而是用于将服务名映射到一个外部的DNS名称。这种服务类型通常用于引用集群外的服务,例如指向一个外部的数据库、API服务或其他基础设施服务。

4.4.1 将公网域名引入

1. 创建ExternalName Service的YAML定义

创建一个名为externalname-service.yaml的YAML文件,定义一个ExternalName类型的Service:

apiVersion: v1
kind: Service
metadata:name: external-service
spec:type: ExternalNameexternalName: www.baidu.com  # 外部DNS名称

2. 应用Service定义

kubectl apply -f externalname-service.yaml

3. 验证Service

kubectl get services
NAME               TYPE           CLUSTER-IP     EXTERNAL-IP     PORT(S)        AGE
external-service   ExternalName   <none>         www.baidu.com   <none>         15h

4. 访问Service

在集群内的Pod可以通过Service名称访问外部服务。例如,如果集群内的Pod需要访问www.baidu.com,它们可以使用external-service.default.svc.cluster.local来解析DNS。

5. DNS解析

在集群内部,可以使用nslookup或dig命令来解析ExternalName Service的DNS记录:

kubectl run -it expod --image=busybox:1.28
# nslookup www.baidu.com
# nslookup external-service.default.svc.cluster.local.

这将显示外部DNS名称www.baidu.com。

4.5 sessionAffinity

sessionAffinity 是 Service 资源的一个属性,它用来控制在一个客户端的多个请求是否应该始终路由到同一个Pod。这种特性被称为会话亲和性(Session Affinity),它对于需要保持用户会话状态的应用非常有用,例如在Web应用程序中。

apiVersion: v1
kind: Service
metadata:name: my-service
spec:selector:app: my-appports:- protocol: TCPport: 80targetPort: 9376sessionAffinity: ClientIP # 启用基于客户端IP的会话亲和性type: ClusterIP
  1. sessionAffinity: ClientIP
  • 当设置为 ClientIP 时,启用基于客户端IP地址的会话亲和性。这意味着来自同一个客户端IP地址的所有请求将始终被路由到同一个Pod,只要该Pod仍然健康并且可用。
  • 这个特性对于需要保持用户会话状态的应用非常有用,例如,用户登录状态或购物车信息。
  • 会话亲和性持续时间由 sessionAffinityConfig 中的 timeoutSeconds 属性控制,如果Pod不可用,超时后客户端请求可以被路由到其他Pod。
  1. sessionAffinity: None
  • 当设置为 None 或者不设置 sessionAffinity 属性时,表示不启用会话亲和性。客户端请求将不会被限制到特定的Pod,而是根据Service的负载均衡算法(通常是轮询)分配到可用的Pod。
  • 这种方式适用于无状态的应用,其中每个请求都是独立的,不需要保持会话状态。

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

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

相关文章

【Linux】多线程(互斥 同步)

我们在上一节多线程提到没有任何保护措施的抢票是会造成数据不一致的问题的。 那我们怎么办&#xff1f; 答案就是进行加锁。 目录 加锁&#xff1a;认识锁和接口&#xff1a;初始化&#xff1a;加锁 && 解锁&#xff1a;全局的方式&#xff1a;局部的方式&#xff1a…

【SkiaSharp绘图15】SKPath属性详解:边界、填充、凹凸、类型判断、坐标、路径类型

文章目录 SKPath 构造函数SKPath 属性Bounds 边界(宽边界)TightBounds紧边界FillType填充方式IsConcave 是否凹/ IsConvex 是否凸IsEmpty是否为空IsLine是否为线段IsRect是否为矩形IsOval是否为椭圆或圆IsRoundRect是否为圆角矩形Item[] 获取路径的坐标LastPoint最后点的坐标Po…

2024最全软件测试面试八股文(答案+文档+视频讲解)

Part1 1、你的测试职业发展是什么&#xff1f; 测试经验越多&#xff0c;测试能力越高。所以我的职业发展是需要时间积累的&#xff0c;一步步向着高级测试工程师奔去。而且我也有初步的职业规划&#xff0c;前3年积累测试经验&#xff0c;按如何做好测试工程师的要点去要求自…

OrangePi AIpro开发板测评 —— 相机图像获取

&#x1f482; 个人主页: 同学来啦&#x1f91f; 版权: 本文由【同学来啦】原创、在CSDN首发、需要转载请联系博主 &#x1f4ac; 如果文章对你有帮助&#xff0c;欢迎关注、点赞、收藏和订阅专栏哦 文章目录 &#x1f31f; 一、引言&#x1f31f; 二、OrangePi AIpro 简要介绍…

力扣206

题目 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1]示例 2&#xff1a; 输入&#xff1a;head [1,2] 输出&#xff1a;[2,1]示例 3&#xff1a; 输…

基于Transformer的端到端的目标检测 | 读论文

本文正在参加 人工智能创作者扶持计划 提及到计算机视觉的目标检测&#xff0c;我们一般会最先想到卷积神经网络&#xff08;CNN&#xff09;&#xff0c;因为这算是目标检测领域的开山之作了&#xff0c;在很长的一段时间里人们都折服于卷积神经网络在图像处理领域的优势&…

【数据库】E-R图、E-R模型到关系模式的转换、关系代数表达式、范式

一、E-R图 1、基本概念 2、实体集之间的联系 3、E-R图要点 &#xff08;1&#xff09;实体&#xff08;型&#xff09;的表示 &#xff08;2&#xff09;E-R图属性的表示 &#xff08;3&#xff09;联系的表示 4、E-R模型的例题 二、E-R模型到关系模式的转换 1、实体型的转换…

使用getline()从文件中读取一行字符串

我们知道&#xff0c;getline() 方法定义在 istream 类中&#xff0c;而 fstream 和 ifstream 类继承自 istream 类&#xff0c;因此 fstream 和 ifstream 的类对象可以调用 getline() 成员方法。 当文件流对象调用 getline() 方法时&#xff0c;该方法的功能就变成了从指定文件…

基于STM32F103C8T6的同步电机驱动-CubeMX配置与IQmath调用

基于STM32F103C8T6的同步电机驱动-CubeMX配置与IQmath调用 一、功能描述: 上位机通过CAN总线实现对电机的运动控制,主要包含三种模式:位置模式、速度模式以及力矩模式。驱动器硬件核心为STM32F103C8T6,带相电压采集电路以及母线电压采集电路。其中供电电压12V。 PWM中心对…

【单片机毕业设计选题24047】-基于阿里云的工地环境监测系统

系统功能: 基于STM32完成 主机&#xff08;阿里云以及oled屏显示位置一&#xff09;&#xff1a;烟雾检测&#xff0c;温湿度检测&#xff0c;噪声检测&#xff0c;且用OLED屏显示&#xff0c;设置阈值&#xff0c;超过报警&#xff08;蜂鸣器&#xff09;。 从机&#xff0…

LeetCode题练习与总结:对链表进行插入排序--147

一、题目描述 给定单个链表的头 head &#xff0c;使用 插入排序 对链表进行排序&#xff0c;并返回 排序后链表的头 。 插入排序 算法的步骤: 插入排序是迭代的&#xff0c;每次只移动一个元素&#xff0c;直到所有元素可以形成一个有序的输出列表。每次迭代中&#xff0c;…

Element中的日期时间选择器DateTimePicker和级联选择器Cascader

简述&#xff1a;在Element UI框架中&#xff0c;Cascader&#xff08;级联选择器&#xff09;和DateTimePicker&#xff08;日期时间选择器&#xff09;是两个非常实用且常用的组件&#xff0c;它们分别用于日期选择和多层级选择&#xff0c;提供了丰富的交互体验和便捷的数据…

【server】nacos 安装

1、本地安装 1.1 nacos官网 Nacos官网| Nacos 配置中心 | Nacos 下载| Nacos 官方社区 | Nacos 官网 git 下载地址&#xff1a;https://github.com/alibaba/nacos/releases 1.2 解压并修改配置 1.2.1 通过properties 修改配置&#xff0c;添加数据库配置 1.2.2 创建数据库&…

字节码编程ASM之生成变量并sout

写在前面 本文看下如何通过asm生成变量并sout。 1&#xff1a;代码 直接看代码吧&#xff0c;注释很详细&#xff0c;有不懂的&#xff0c;留言告诉我&#xff1a; package com.dahuyuo.asmtest;import org.objectweb.asm.*; import org.objectweb.asm.commons.AdviceAdapt…

VCS+Vivado联合仿真BUG

场景&#xff1a; 在vcsvivado联合仿真过程中&#xff0c;对vivado导出的shell脚本修改&#xff0c;修改某些source文件路径&#xff0c;vcs编译时会报Permission Denied。 问题描述 对shell脚本修改如下&#xff1a; 修改仅为注释掉某一行&#xff0c;下面变为source文件新…

Linux shell编程学习笔记62: top命令 linux下的任务管理器

0 前言 top命令是Unix 和 Linux下常用的性能分析工具&#xff0c;提供了一个动态的、交互式的实时视图&#xff0c;显示系统的整体性能信息&#xff0c;以及正在运行的进程的相关信息&#xff0c;包括各个进程的资源占用状况&#xff0c;类似于Windows的任务管理器。 1 top命令…

数据特征采样在 MySQL 同步一致性校验中的实践

作者&#xff1a;vivo 互联网存储研发团队 - Shang Yongxing 本文介绍了当前DTS应用中&#xff0c;MySQL数据同步使用到的数据一致性校验工具&#xff0c;并对它的实现思路进行分享。 一、背景 在 MySQL 的使用过程中&#xff0c;经常会因为如集群拆分、数据传输、数据聚合等…

【堆 优先队列】23. 合并 K 个升序链表

本文涉及知识点 堆 优先队列 LeetCode23. 合并 K 个升序链表 给你一个链表数组&#xff0c;每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中&#xff0c;返回合并后的链表。 示例 1&#xff1a; 输入&#xff1a;lists [[1,4,5],[1,3,4],[2,6]] 输出&#…

基流科技:超算界的新星,Pre-A轮融资大获成功

基流科技:超算界的新星,Pre-A轮融资大获成功! 在科技的浪潮中,一颗新星正在冉冉升起——基流科技,一家开放算力网络提供商,以其革命性的技术在超算界引起了轰动。今年年初,基流科技完成了 Pre-A 轮融资,由光速光合领投,此前已获得奇绩创坛、微梦传媒等知名投资方的青…

mysql定时备份数据库

文章目录 核心目标思路具体方法一、编写脚本二、修改文件属性三、找一个mysqldump文件四、把.sh放到定时器里 其它&#xff1a;windows的脚本 核心目标 解决数据库定时备份的工作。centos环境。 思路 用centos的crontab定时执行脚本。 具体方法 一、编写脚本 编写backup_…