如何将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
相关产品推荐
相关产品推荐

