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

相关文章

线上Java OOM问题定位与解决方案超详细解析

《线上JavaOOM问题定位与解决方案超详细解析》OOM是JVM抛出的错误,表示内存分配失败,:本文主要介绍线上JavaOOM问题定位与解决方案的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录一、OOM问题核心认知1.1 OOM定义与技术定位1.2 OOM常见类型及技术特征二、OOM问题定位工具

基于 Cursor 开发 Spring Boot 项目详细攻略

《基于Cursor开发SpringBoot项目详细攻略》Cursor是集成GPT4、Claude3.5等LLM的VSCode类AI编程工具,支持SpringBoot项目开发全流程,涵盖环境配... 目录cursor是什么?基于 Cursor 开发 Spring Boot 项目完整指南1. 环境准备2. 创建

PHP应用中处理限流和API节流的最佳实践

《PHP应用中处理限流和API节流的最佳实践》限流和API节流对于确保Web应用程序的可靠性、安全性和可扩展性至关重要,本文将详细介绍PHP应用中处理限流和API节流的最佳实践,下面就来和小编一起学习... 目录限流的重要性在 php 中实施限流的最佳实践使用集中式存储进行状态管理(如 Redis)采用滑动

深入浅出Spring中的@Autowired自动注入的工作原理及实践应用

《深入浅出Spring中的@Autowired自动注入的工作原理及实践应用》在Spring框架的学习旅程中,@Autowired无疑是一个高频出现却又让初学者头疼的注解,它看似简单,却蕴含着Sprin... 目录深入浅出Spring中的@Autowired:自动注入的奥秘什么是依赖注入?@Autowired

Python与MySQL实现数据库实时同步的详细步骤

《Python与MySQL实现数据库实时同步的详细步骤》在日常开发中,数据同步是一项常见的需求,本篇文章将使用Python和MySQL来实现数据库实时同步,我们将围绕数据变更捕获、数据处理和数据写入这... 目录前言摘要概述:数据同步方案1. 基本思路2. mysql Binlog 简介实现步骤与代码示例1

基于C#实现PDF转图片的详细教程

《基于C#实现PDF转图片的详细教程》在数字化办公场景中,PDF文件的可视化处理需求日益增长,本文将围绕Spire.PDFfor.NET这一工具,详解如何通过C#将PDF转换为JPG、PNG等主流图片... 目录引言一、组件部署二、快速入门:PDF 转图片的核心 C# 代码三、分辨率设置 - 清晰度的决定因

Java中HashMap的用法详细介绍

《Java中HashMap的用法详细介绍》JavaHashMap是一种高效的数据结构,用于存储键值对,它是基于哈希表实现的,提供快速的插入、删除和查找操作,:本文主要介绍Java中HashMap... 目录一.HashMap1.基本概念2.底层数据结构:3.HashCode和equals方法为什么重写Has

PostgreSQL简介及实战应用

《PostgreSQL简介及实战应用》PostgreSQL是一种功能强大的开源关系型数据库管理系统,以其稳定性、高性能、扩展性和复杂查询能力在众多项目中得到广泛应用,本文将从基础概念讲起,逐步深入到高... 目录前言1. PostgreSQL基础1.1 PostgreSQL简介1.2 基础语法1.3 数据库

Java使用正则提取字符串中的内容的详细步骤

《Java使用正则提取字符串中的内容的详细步骤》:本文主要介绍Java中使用正则表达式提取字符串内容的方法,通过Pattern和Matcher类实现,涵盖编译正则、查找匹配、分组捕获、数字与邮箱提... 目录1. 基础流程2. 关键方法说明3. 常见场景示例场景1:提取所有数字场景2:提取邮箱地址4. 高级

Unity新手入门学习殿堂级知识详细讲解(图文)

《Unity新手入门学习殿堂级知识详细讲解(图文)》Unity是一款跨平台游戏引擎,支持2D/3D及VR/AR开发,核心功能模块包括图形、音频、物理等,通过可视化编辑器与脚本扩展实现开发,项目结构含A... 目录入门概述什么是 UnityUnity引擎基础认知编辑器核心操作Unity 编辑器项目模式分类工程