k8s学习--sessionAffinity会话保持(又称会话粘滞)详细解释与应用

本文主要是介绍k8s学习--sessionAffinity会话保持(又称会话粘滞)详细解释与应用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • sessionAffinity简介
    • 什么是sessionAffinity
    • 模式介绍
    • 应用场景
    • 工作原理
    • 优势
  • 应用
    • 环境
    • 步骤
      • 2. 给服务打补丁,增加会话粘滞
    • 设置回sessionAffinity为None


sessionAffinity简介

什么是sessionAffinity

简单理解
确保把来自同一客户的一个完整会话的请求转发至后台同一台服务器进行处理。


详细解释
在Kubernetes中,sessionAffinity是指Service的一种设置,用于控制外部流量如何在后端Pod之间分发。具体来说,sessionAffinity可以配置为"None"、“ClientIP"或者"ClientIP”。这些设置决定了负载均衡器如何将来自相同客户端的请求路由到后端的Pods上。


模式介绍

None
这是sessionAffinity的默认设置。当设置为"None"时,负载均衡器会根据负载均衡算法(如轮询、最少连接数等)将每个新的请求独立地分发到后端的Pods上,与之前的请求无关。

ClientIP
当设置为"ClientIP"时,负载均衡器会根据客户端的IP地址来将来自同一个客户端的请求路由到同一个后端的Pod上。这样可以确保来自同一个客户端的多次请求都被发送到同一个后端Pod上,用于保持会话一致性。

ClientIP模式的会话粘滞
这种方式通常用于需要保持会话状态的应用程序,如基于HTTP的应用程序,以确保用户在整个会话期间都能被路由到同一个后端Pod上。


应用场景

简单理解
举个大家每天都会遇到的例子,大家在淘宝或者京东上购物时,从完成用户身份认证到浏览店铺,选择心仪商品加入购物车,一直到最后下单完成支付,需要经过很多次和服务器的交互过程才能完成整个交易。由于这几次交互过程从顺序上和逻辑上是密切相关的,服务器在进行这些交互过程的某一个交互步骤时需要一个上下文(Context),即上一次交互过程的输出,因此要求这些相关的交互过程都由一台服务器完成。
在这种情况下,假设负载均衡器仍然把这些相关交互session分散到不同的服务器实例上,就会带来很糟糕的用户体验,比如客户在浏览器上每点击一次,都会弹出登录页面。或者即使用户输入了正确的验证码,却仍然提示验证码错误。由于服务器处理实例不一样,也有可能造成客户放入购物车的物品丢失。


详细解释

有状态应用程序
对于一些有状态的应用程序,比如基于HTTP协议的Web应用或者需要保持会话状态的应用,使用ClientIP模式的sessionAffinity可以确保来自同一个客户端的请求都被路由到同一个后端Pod上,从而保持会话的一致性。这对于需要在多次请求之间共享状态或者会话信息的应用程序是非常重要的。

避免会话中断
在一些情况下,如果同一个用户的请求被路由到了不同的后端Pod上,可能会导致会话中断或者状态丢失。通过使用sessionAffinity来保持会话粘滞,可以避免这种情况的发生,确保用户的体验和应用的正确性。

缓存一致性
在一些需要使用缓存的应用场景下,比如使用了本地缓存的应用或者分布式缓存系统,通过将来自同一个客户端的请求路由到同一个后端Pod上,可以提高缓存命中率,并确保缓存数据的一致性。

有序处理
对于一些需要按照顺序处理请求的应用场景,比如消息队列、任务调度等,使用sessionAffinity可以确保来自同一个客户端的请求按照顺序被发送到同一个后端Pod上进行处理,从而保证处理的顺序性。


工作原理

创建 Service
当创建一个类型为 LoadBalancer 的 Service 时,Kubernetes 控制平面会请求云服务提供商创建一个外部负载均衡器。

负载均衡器配置
外部负载均衡器被配置为监听指定的端口(或由 Service 定义的端口)。
负载均衡器将流量转发到 Kubernetes 集群内部的所有健康 Pods,这些 Pods 通过 Endpoints 对象与 Service 关联。

流量分发
当外部用户或系统访问负载均衡器的公共 IP 地址和端口时,负载均衡器根据预定义的策略(如轮询或最少连接)将流量分发到后端的 Pods。
这种分发机制确保了负载的平衡分配,并有助于处理高流量。

健康检查
大多数负载均衡器会进行健康检查,以确保流量只被转发到健康的 Pods。
如果一个 Pod 因故障停止服务,负载均衡器将自动停止向该 Pod 发送流量,直到它再次被标记为健康。

动态更新
当新的 Pods 被创建或现有的 Pods 被销毁时,Service 的 Endpoints 列表会动态更新,而负载均衡器也将相应地更新其转发规则。


优势

易于使用
用户只需声明 Service 类型为 LoadBalancer,并不需要进行复杂的配置。

自动化
负载均衡器的创建、配置和更新都是自动进行的,这减少了维护负担。

高可用性
负载均衡器提供了故障转移能力,增强了服务的可靠性。

应用

环境

Ip主机名cpu内存硬盘
192.168.10.11master012cpu双核4G100G
192.168.10.12worker012cpu双核4G100G
192.168.10.13worker022cpu双核4G100G

已部署k8s-1.27

步骤

1.创建测试用的deployment,service
这里使用yaml文件创建

vim sessionAffinity.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-server1
spec:replicas: 2selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: c1image: nginx:1.20imagePullPolicy: IfNotPresentports:- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:name: nginx-svc
spec:type: ClusterIPports:- protocol: TCPport: 80targetPort: 80selector:app: nginx

创建deployment和service并查看

kubectl apply -f sessionAffinity.yaml
kubectl get pods

在这里插入图片描述

进入pod,创建网页web1(根据name进入)

kubectl exec -it nginx-server1-855bbbf689-lmw92 -- bash
root@nginx-server1-855bbbf689-lmw92:/# echo web1 > /usr/share/nginx/html/index.html
root@nginx-server1-855bbbf689-lmw92:/# exit

进入pod,创建网页web2

kubectl exec -it nginx-server1-855bbbf689-xczvl -- bash
root@nginx-server1-855bbbf689-xczvl:/# echo web2 > /usr/share/nginx/html/index.html
root@nginx-server1-855bbbf689-xczvl:/# exit

查看服务

kubectl get svc

在这里插入图片描述

测试默认的负载均衡

curl 10.108.198.133

正常
在这里插入图片描述

2. 给服务打补丁,增加会话粘滞

设置为ClientIP模式

kubectl patch svc nginx-svc -p '{"spec":{"sessionAffinity":"ClientIP"}}'

测试

curl 10.108.198.133

效果实现
一系列相关联的访问请求会分配到一台服务器上。
在这里插入图片描述

设置回sessionAffinity为None

kubectl patch svc nginx-svc -p '{"spec":{"sessionAffinity":"None"}}'

测试

curl 10.108.198.133

在这里插入图片描述
成功恢复轮询效果

实验完成

这篇关于k8s学习--sessionAffinity会话保持(又称会话粘滞)详细解释与应用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1033520

相关文章

分布式锁在Spring Boot应用中的实现过程

《分布式锁在SpringBoot应用中的实现过程》文章介绍在SpringBoot中通过自定义Lock注解、LockAspect切面和RedisLockUtils工具类实现分布式锁,确保多实例并发操作... 目录Lock注解LockASPect切面RedisLockUtils工具类总结在现代微服务架构中,分布

Python pandas库自学超详细教程

《Pythonpandas库自学超详细教程》文章介绍了Pandas库的基本功能、安装方法及核心操作,涵盖数据导入(CSV/Excel等)、数据结构(Series、DataFrame)、数据清洗、转换... 目录一、什么是Pandas库(1)、Pandas 应用(2)、Pandas 功能(3)、数据结构二、安

Apache Ignite 与 Spring Boot 集成详细指南

《ApacheIgnite与SpringBoot集成详细指南》ApacheIgnite官方指南详解如何通过SpringBootStarter扩展实现自动配置,支持厚/轻客户端模式,简化Ign... 目录 一、背景:为什么需要这个集成? 二、两种集成方式(对应两种客户端模型) 三、方式一:自动配置 Thick

Python标准库之数据压缩和存档的应用详解

《Python标准库之数据压缩和存档的应用详解》在数据处理与存储领域,压缩和存档是提升效率的关键技术,Python标准库提供了一套完整的工具链,下面小编就来和大家简单介绍一下吧... 目录一、核心模块架构与设计哲学二、关键模块深度解析1.tarfile:专业级归档工具2.zipfile:跨平台归档首选3.

使用IDEA部署Docker应用指南分享

《使用IDEA部署Docker应用指南分享》本文介绍了使用IDEA部署Docker应用的四步流程:创建Dockerfile、配置IDEADocker连接、设置运行调试环境、构建运行镜像,并强调需准备本... 目录一、创建 dockerfile 配置文件二、配置 IDEA 的 Docker 连接三、配置 Do

深入浅出SpringBoot WebSocket构建实时应用全面指南

《深入浅出SpringBootWebSocket构建实时应用全面指南》WebSocket是一种在单个TCP连接上进行全双工通信的协议,这篇文章主要为大家详细介绍了SpringBoot如何集成WebS... 目录前言为什么需要 WebSocketWebSocket 是什么Spring Boot 如何简化 We

Java Stream流之GroupBy的用法及应用场景

《JavaStream流之GroupBy的用法及应用场景》本教程将详细介绍如何在Java中使用Stream流的groupby方法,包括基本用法和一些常见的实际应用场景,感兴趣的朋友一起看看吧... 目录Java Stream流之GroupBy的用法1. 前言2. 基础概念什么是 GroupBy?Stream

python中列表应用和扩展性实用详解

《python中列表应用和扩展性实用详解》文章介绍了Python列表的核心特性:有序数据集合,用[]定义,元素类型可不同,支持迭代、循环、切片,可执行增删改查、排序、推导式及嵌套操作,是常用的数据处理... 目录1、列表定义2、格式3、列表是可迭代对象4、列表的常见操作总结1、列表定义是处理一组有序项目的

Python对接支付宝支付之使用AliPay实现的详细操作指南

《Python对接支付宝支付之使用AliPay实现的详细操作指南》支付宝没有提供PythonSDK,但是强大的github就有提供python-alipay-sdk,封装里很多复杂操作,使用这个我们就... 目录一、引言二、准备工作2.1 支付宝开放平台入驻与应用创建2.2 密钥生成与配置2.3 安装ali

C#中的Converter的具体应用

《C#中的Converter的具体应用》C#中的Converter提供了一种灵活的类型转换机制,本文详细介绍了Converter的基本概念、使用场景,具有一定的参考价值,感兴趣的可以了解一下... 目录Converter的基本概念1. Converter委托2. 使用场景布尔型转换示例示例1:简单的字符串到