C# Blazor Pod Scheduling — จัดการ Blazor App บน

Blazor Pod Scheduling

C# Blazor Pod Scheduling Kubernetes Docker SignalR WebSocket Sticky Session HPA Health Check .NET 8 Razor Components
| Aspect | Blazor Server | Blazor WASM | Blazor United (.NET 8) |
|---|---|---|---|
| Render | Server (SignalR) | Browser (WASM) | ทั้งสอง (per component) |
| Sticky Session | ต้องใช้ | ไม่ต้อง | ขึ้นกับ Component |
| Image Size | 80-120MB | 20-30MB (Nginx) | 80-120MB |
| Resource | CPU+RAM มาก | น้อย (Static) | ปานกลาง |
| Scale | ซับซ้อน (Session) | ง่าย (Stateless) | ปานกลาง |
| Offline | ไม่ได้ | ได้ | บางส่วน |
Docker Configuration
# === Blazor Docker Setup === # Dockerfile (Blazor Server) # FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build # WORKDIR /src # COPY *.csproj ./ # RUN dotnet restore # COPY . . # RUN dotnet publish -c Release -o /app/publish # # FROM mcr.microsoft.com/dotnet/aspnet:8.0 # WORKDIR /app # COPY --from=build /app/publish . # ENV ASPNETCORE_URLS=http://+:8080 # ENV ASPNETCORE_ENVIRONMENT=Production # EXPOSE 8080 # HEALTHCHECK --interval=30s --timeout=3s \ # CMD curl -f http://localhost:8080/health || exit 1 # ENTRYPOINT ["dotnet", "BlazorApp.dll"] # Program.cs Health Checks # var builder = WebApplication.CreateBuilder(args); # builder.Services.AddHealthChecks() # .AddDbContextCheck("database") # .AddRedis(builder.Configuration["Redis:Connection"], "redis") # .AddUrlGroup(new Uri("https://api.example.com/health"), "external-api"); # # var app = builder.Build(); # app.MapHealthChecks("/health"); # app.MapHealthChecks("/health/ready", new HealthCheckOptions { # Predicate = check => check.Tags.Contains("ready") # }); from dataclasses import dataclass @dataclass class DockerImage: variant: str base_image: str size: str use_case: str images = [ DockerImage("Blazor Server", "mcr.microsoft.com/dotnet/aspnet:8.0", "80-120MB", "Server-side rendering SignalR WebSocket"), DockerImage("Blazor WASM (Nginx)", "nginx:alpine", "20-30MB", "Client-side WASM Static Files"), DockerImage("Blazor United", "mcr.microsoft.com/dotnet/aspnet:8.0", "80-120MB", "Mixed render modes Server + WASM"), DockerImage("SDK (Build Stage)", "mcr.microsoft.com/dotnet/sdk:8.0", "~700MB (build only)", "Compile Publish ไม่อยู่ใน Final"), ] print("=== Docker Images ===") for d in images: print(f" [{d.variant}] {d.base_image}") print(f" Size: {d.size} | Use: {d.use_case}")เคล็ดลับ

- SignalR: ใช้ Redis Backplane สำหรับ Blazor Server Multi-pod
- Sticky: ตั้ง Cookie Affinity สำหรับ Ingress WebSocket
- WASM: ใช้ Brotli Compression ลด WASM Download Size 60%
- Health: ตั้ง Health Check ตรวจ DB Redis External API
- .NET 8: ใช้ Blazor United เลือก Render Mode ต่อ Component
Blazor คืออะไร
Web Framework C# Microsoft Razor Components Server SignalR WASM WebAssembly United .NET 8 NuGet Entity Framework Interactive UI
อ่านเพิ่ม: Container Orchestration นอกจาก Kubernetes มีอะไรอีก? Docker · อ่านเพิ่ม: Kubernetes ขั้นสูง สอน Helm Charts, Operators, Service Mesh · อ่านเพิ่ม: Kubernetes Operators และ CRD คืออะไร? สอนสร้าง Custom Contro
Docker ตั้งค่าอย่างไร
Multi-stage dotnet/sdk dotnet/aspnet nginx:alpine dotnet publish Release Health Check ENTRYPOINT 80-120MB Docker Compose SQL Server Redis
Kubernetes Deploy อย่างไร
Deployment Replicas Ingress Cookie Affinity SignalR WebSocket Timeout HPA Service sessionAffinity ConfigMap Secret Liveness Readiness Probe
Health Check ทำอย่างไร
ASP.NET Core AddHealthChecks DbContext Redis URL Disk MapHealthChecks /health /health/ready Liveness Readiness Startup Probe UI Dashboard
สรุป
C# Blazor Pod Scheduling Kubernetes Docker SignalR Sticky Session HPA Health Check .NET 8 WASM Redis Backplane Ingress Production





