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

如何将Hyper-V上的Windows VM(SQL/.NET应用)迁移至Kubernetes并保障高可用?

迁移至Kubernetes并构建高可用架构方案

一、先搭好支持Windows容器的K8s集群

  • 得保证集群至少有2台Windows Worker节点(用来承载SQL Server和.NET应用的容器,实现节点级故障转移),Master节点用Linux即可(K8s Master目前Linux生态更成熟稳定)。
  • 给Windows Worker节点安装Docker并切换到Windows容器模式,再将节点加入K8s集群。

二、迁移SQL Server到K8s

1. 容器化现有SQL Server

  • 先把现有SQL Server中的数据库备份出来,示例命令:BACKUP DATABASE [你的数据库名] TO DISK = 'D:\backup\your-db.bak'。
  • 基于微软官方Windows版SQL Server镜像构建自定义镜像(如果有特殊配置),简单Dockerfile示例:
FROM mcr.microsoft.com/mssql/server:2019-latest-windows
COPY your-db.bak /var/opt/mssql/backup/
COPY restore-db.sql /var/opt/mssql/scripts/
# 替换为你的SA密码
RUN sqlcmd -S localhost -U SA -P YourStrong!Passw0rd -i /var/opt/mssql/scripts/restore-db.sql

其中restore-db.sql写入数据库恢复脚本即可。

2. 部署高可用SQL实例

  • 使用StatefulSet部署SQL Server,它专为有状态应用设计,能为每个Pod分配稳定的网络标识和持久化存储。
  • 配置PV/PVC:为SQL挂载持久化存储,确保Pod重启后数据不丢失,存储后端优先选Hyper-V共享存储、NAS等高可用方案。
  • 配置SQL Server Always On可用性组:可通过StatefulSet配合Service手动配置,也可使用微软官方的SQL Server Operator简化操作,实现故障自动切换到健康实例。
  • 配置两类Service:一个Headless Service给StatefulSet的Pod提供稳定网络标识;一个ClusterIP Service作为应用访问的统一入口,故障转移时自动切换流量。

三、迁移.NET应用到K8s

1. 容器化.NET应用

  • 编写Dockerfile构建Windows容器镜像,以.NET 6为例:
FROM mcr.microsoft.com/dotnet/aspnet:6.0-nanoserver-ltsc2022 AS base
WORKDIR /app
EXPOSE 80

FROM mcr.microsoft.com/dotnet/sdk:6.0-nanoserver-ltsc2022 AS build
WORKDIR /src
COPY ["YourApp/YourApp.csproj", "YourApp/"]
RUN dotnet restore "YourApp/YourApp.csproj"
COPY . .
WORKDIR "/src/YourApp"
RUN dotnet build "YourApp.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "YourApp.csproj" -c Release -o /app/publish /p:UseAppHost=false

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "YourApp.dll"]
  • 测试容器内应用能否正常访问K8s中的SQL Service,连接字符串示例:Server=sql-service-name,1433;Database=your-db;User Id=SA;Password=YourStrong!Passw0rd;。

2. 部署高可用.NET应用

  • 使用Deployment部署,设置replicas: 2(或更多),让多个应用实例分布在不同Windows Worker节点上。
  • 配置Service(NodePort或LoadBalancer)暴露应用,K8s会自动为Pod做负载均衡,单个Pod故障时流量会自动切换到健康实例。
  • 添加就绪探针和存活探针,让K8s能实时检测应用状态,自动重启故障Pod或移除不健康的Pod端点,示例配置:
livenessProbe:
  httpGet:
    path: /healthz
    port: 80
  initialDelaySeconds: 30
  periodSeconds: 10
readinessProbe:
  httpGet:
    path: /ready
    port: 80
  initialDelaySeconds: 5
  periodSeconds: 5

(需确保你的.NET应用提供对应的健康检查接口)

四、整体高可用保障要点

  • 节点故障转移:至少2台Windows Worker节点,单节点宕机时,K8s会将Pod调度到健康节点。
  • 存储高可用:SQL的持久化存储必须用高可用存储类,避免单节点存储故障导致数据不可访问。
  • 监控告警:部署Prometheus+Grafana监控集群、SQL和应用状态,设置告警规则(如Pod异常、资源占用过高),及时发现故障。
  • 备份兜底:定期将SQL备份文件同步到外部存储(如NAS、云存储),避免集群故障导致数据丢失。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 11:05:17