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

相关文章

SpringBoot整合liteflow的详细过程

《SpringBoot整合liteflow的详细过程》:本文主要介绍SpringBoot整合liteflow的详细过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋...  liteflow 是什么? 能做什么?总之一句话:能帮你规范写代码逻辑 ,编排并解耦业务逻辑,代码

Python中re模块结合正则表达式的实际应用案例

《Python中re模块结合正则表达式的实际应用案例》Python中的re模块是用于处理正则表达式的强大工具,正则表达式是一种用来匹配字符串的模式,它可以在文本中搜索和匹配特定的字符串模式,这篇文章主... 目录前言re模块常用函数一、查看文本中是否包含 A 或 B 字符串二、替换多个关键词为统一格式三、提

Java MQTT实战应用

《JavaMQTT实战应用》本文详解MQTT协议,涵盖其发布/订阅机制、低功耗高效特性、三种服务质量等级(QoS0/1/2),以及客户端、代理、主题的核心概念,最后提供Linux部署教程、Sprin... 目录一、MQTT协议二、MQTT优点三、三种服务质量等级四、客户端、代理、主题1. 客户端(Clien

浏览器插件cursor实现自动注册、续杯的详细过程

《浏览器插件cursor实现自动注册、续杯的详细过程》Cursor简易注册助手脚本通过自动化邮箱填写和验证码获取流程,大大简化了Cursor的注册过程,它不仅提高了注册效率,还通过友好的用户界面和详细... 目录前言功能概述使用方法安装脚本使用流程邮箱输入页面验证码页面实战演示技术实现核心功能实现1. 随机

HTML img标签和超链接标签详细介绍

《HTMLimg标签和超链接标签详细介绍》:本文主要介绍了HTML中img标签的使用,包括src属性(指定图片路径)、相对/绝对路径区别、alt替代文本、title提示、宽高控制及边框设置等,详细内容请阅读本文,希望能对你有所帮助... 目录img 标签src 属性alt 属性title 属性width/h

CSS3打造的现代交互式登录界面详细实现过程

《CSS3打造的现代交互式登录界面详细实现过程》本文介绍CSS3和jQuery在登录界面设计中的应用,涵盖动画、选择器、自定义字体及盒模型技术,提升界面美观与交互性,同时优化性能和可访问性,感兴趣的朋... 目录1. css3用户登录界面设计概述1.1 用户界面设计的重要性1.2 CSS3的新特性与优势1.

k8s上运行的mysql、mariadb数据库的备份记录(支持x86和arm两种架构)

《k8s上运行的mysql、mariadb数据库的备份记录(支持x86和arm两种架构)》本文记录在K8s上运行的MySQL/MariaDB备份方案,通过工具容器执行mysqldump,结合定时任务实... 目录前言一、获取需要备份的数据库的信息二、备份步骤1.准备工作(X86)1.准备工作(arm)2.手

CSS中的Static、Relative、Absolute、Fixed、Sticky的应用与详细对比

《CSS中的Static、Relative、Absolute、Fixed、Sticky的应用与详细对比》CSS中的position属性用于控制元素的定位方式,不同的定位方式会影响元素在页面中的布... css 中的 position 属性用于控制元素的定位方式,不同的定位方式会影响元素在页面中的布局和层叠关

SpringBoot3应用中集成和使用Spring Retry的实践记录

《SpringBoot3应用中集成和使用SpringRetry的实践记录》SpringRetry为SpringBoot3提供重试机制,支持注解和编程式两种方式,可配置重试策略与监听器,适用于临时性故... 目录1. 简介2. 环境准备3. 使用方式3.1 注解方式 基础使用自定义重试策略失败恢复机制注意事项

在Windows上使用qemu安装ubuntu24.04服务器的详细指南

《在Windows上使用qemu安装ubuntu24.04服务器的详细指南》本文介绍了在Windows上使用QEMU安装Ubuntu24.04的全流程:安装QEMU、准备ISO镜像、创建虚拟磁盘、配置... 目录1. 安装QEMU环境2. 准备Ubuntu 24.04镜像3. 启动QEMU安装Ubuntu4