You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

裸金属Ubuntu K8S集群中Pod重启/删除时如何保留.Net Core会话数据?

在K8S StatefulSet中保留.Net Core 3.1应用会话的解决方案

1. 使用分布式会话存储(推荐)

替代.Net Core默认的内存会话存储,将数据存到外部分布式系统,Pod重建后会话数据不受影响。

可选方案:

  • Redis缓存:性能高、配置简单,适合大多数场景
    操作步骤:

    1. 在K8S集群部署Redis实例(用StatefulSet或Deployment均可),确保应用Pod能访问Redis服务地址。
    2. 给应用安装NuGet包:Microsoft.Extensions.Caching.StackExchangeRedis 和 Microsoft.AspNetCore.Session。
    3. 在Startup.cs中配置会话与Redis:
      public void ConfigureServices(IServiceCollection services)
      {
          // 配置Redis缓存
          services.AddStackExchangeRedisCache(options =>
          {
              options.Configuration = "redis-service:6379"; // 替换为你的Redis服务地址
              options.InstanceName = "AppSession:";
          });
          // 配置会话使用Redis存储
          services.AddSession(options =>
          {
              options.IdleTimeout = TimeSpan.FromMinutes(30);
              options.Cookie.HttpOnly = true;
              options.Cookie.IsEssential = true;
          });
          services.AddControllersWithViews();
      }
      
      public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
      {
          // 其他中间件配置...
          app.UseSession(); // 需放在UseRouting和UseEndpoints之间
          app.UseRouting();
          // 其他中间件配置...
      }
      
  • SQL Server:适合已有SQL Server集群的场景
    操作步骤:

    1. 执行命令生成会话存储表:dotnet sql-cache create "你的SQL连接字符串" dbo SessionTable。
    2. 安装NuGet包:Microsoft.Extensions.Caching.SqlServer 和 Microsoft.AspNetCore.Session。
    3. 在Startup.cs中配置:
      public void ConfigureServices(IServiceCollection services)
      {
          services.AddDistributedSqlServerCache(options =>
          {
              options.ConnectionString = Configuration.GetConnectionString("SessionDb");
              options.SchemaName = "dbo";
              options.TableName = "SessionTable";
          });
          services.AddSession(options =>
          {
              options.IdleTimeout = TimeSpan.FromMinutes(30);
              options.Cookie.HttpOnly = true;
          });
          services.AddControllersWithViews();
      }
      

2. 利用StatefulSet持久化卷存储会话文件

将会话文件存到StatefulSet绑定的持久化卷(PV)中,Pod重建后挂载同一PV即可保留数据。

操作步骤:

  1. 为StatefulSet配置PersistentVolumeClaim(PVC),根据需求选择单Pod独占或多Pod共享的PV(如NFS支持多Pod读写)。
  2. 修改应用会话配置,指定存储路径为PV挂载目录:
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddSession(options =>
        {
            options.IdleTimeout = TimeSpan.FromMinutes(30);
            options.Cookie.HttpOnly = true;
            options.Cookie.IsEssential = true;
        });
        // 配置文件型分布式缓存
        services.AddSingleton<IDistributedCache, DistributedFileCache>(sp =>
        {
            var env = sp.GetRequiredService<IWebHostEnvironment>();
            var cachePath = "/app/session-cache"; // 与PV挂载路径一致
            return new DistributedFileCache(new DistributedFileCacheOptions
            {
                PhysicalRootPath = cachePath
            });
        });
        services.AddControllersWithViews();
    }
    
  3. 在StatefulSet的Pod模板中添加卷挂载:
    spec:
      template:
        spec:
          volumes:
          - name: session-storage
            persistentVolumeClaim:
              claimName: session-pvc
          containers:
          - name: app-container
            volumeMounts:
            - name: session-storage
              mountPath: /app/session-cache
    

3. 基于Cookie的会话存储(仅适合轻量数据)

将加密后的会话数据存在客户端Cookie中,无需服务端存储,Pod重建后直接从Cookie读取。

操作步骤:

  1. 在Startup.cs中配置会话与数据保护密钥持久化:
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddSession(options =>
        {
            options.IdleTimeout = TimeSpan.FromMinutes(30);
            options.Cookie.HttpOnly = true;
            options.Cookie.IsEssential = true;
            options.Cookie.SecurePolicy = CookieSecurePolicy.Always; // 生产环境建议启用HTTPS
        });
        // 持久化数据保护密钥,避免Pod重建后密钥失效导致Cookie无法解密
        services.AddDataProtection()
            .PersistKeysToFileSystem(new DirectoryInfo("/app/keys")) // 密钥存到PV挂载目录
            .SetApplicationName("YourAppName");
        services.AddControllersWithViews();
    }
    
  2. 在StatefulSet中挂载PV存储密钥:
    spec:
      template:
        spec:
          volumes:
          - name: data-protection-keys
            persistentVolumeClaim:
              claimName: keys-pvc
          containers:
          - name: app-container
            volumeMounts:
            - name: data-protection-keys
              mountPath: /app/keys
    

注意:Cookie有4KB大小限制,仅适合存储少量非敏感会话数据。


内容的提问来源于stack exchange,提问作者Eslam Ali

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 00:20:44