eShopOnWeb容器编排:Kubernetes部署配置指南
【免费下载链接】eShopOnWeb 项目地址: https://gitcode.com/gh_mirrors/esh/eShopOnWeb
部署架构概览
eShopOnWeb作为典型的ASP.NET Core微服务应用,采用多容器架构设计,包含Web前端(eshopwebmvc)、API服务(eshoppublicapi)和SQL Server数据库三大核心组件。在Kubernetes环境中,这些组件将通过Deployment控制器实现高可用部署,通过Service资源提供稳定网络访问,并使用ConfigMap/Secret管理配置与敏感信息。
容器架构关系
架构说明:上图展示了eShopOnWeb在K8s集群中的部署关系,Web应用和API服务通过ClusterIP Service访问SQL Server数据库,外部流量通过Ingress控制器路由至Web前端。
前置准备与环境要求
基础环境依赖
- Kubernetes集群(v1.24+)
- Docker Engine(20.10+)
- kubectl命令行工具(与集群版本匹配)
- Helm 3.x(可选,用于包管理)
镜像准备
项目提供的Dockerfile已完成应用容器化配置,需提前构建并推送镜像至私有仓库:
# 构建Web应用镜像
docker build -t your-registry/eshopwebmvc:latest -f src/Web/Dockerfile .
# 构建API服务镜像
docker build -t your-registry/eshoppublicapi:latest -f src/PublicApi/Dockerfile .
镜像说明:Dockerfile采用多阶段构建,src/Web/Dockerfile使用
mcr.microsoft.com/dotnet/sdk:8.0作为构建环境,最终运行环境基于aspnet:8.0镜像,减少镜像体积约60%。
核心部署配置文件
1. SQL Server数据库部署
创建sqlserver-deployment.yaml定义有状态数据库服务:
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: sqlserver
spec:
serviceName: sqlserver
replicas: 1
selector:
matchLabels:
app: sqlserver
template:
metadata:
labels:
app: sqlserver
spec:
containers:
- name: sqlserver
image: mcr.microsoft.com/azure-sql-edge
ports:
- containerPort: 1433
env:
- name: SA_PASSWORD
valueFrom:
secretKeyRef:
name: sqlserver-secrets
key: sa-password
- name: ACCEPT_EULA
value: "Y"
volumeMounts:
- name: sqlserver-data
mountPath: /var/opt/mssql
volumeClaimTemplates:
- metadata:
name: sqlserver-data
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 10Gi
---
apiVersion: v1
kind: Service
metadata:
name: sqlserver
spec:
selector:
app: sqlserver
ports:
- port: 1433
targetPort: 1433
clusterIP: None # Headless Service
配套的密钥配置sqlserver-secret.yaml:
apiVersion: v1
kind: Secret
metadata:
name: sqlserver-secrets
type: Opaque
data:
sa-password: c29tZVRoaW5nQ29tcGxhaW50ZWRAMTIz # base64编码的密码
2. Web应用与API服务部署
创建web-api-deployment.yaml部署前端与API服务:
apiVersion: apps/v1
kind: Deployment
metadata:
name: eshopwebmvc
spec:
replicas: 2
selector:
matchLabels:
app: eshopwebmvc
template:
metadata:
labels:
app: eshopwebmvc
spec:
containers:
- name: eshopwebmvc
image: your-registry/eshopwebmvc:latest
ports:
- containerPort: 80
env:
- name: ConnectionStrings__CatalogConnection
value: "Server=sqlserver,1433;Database=CatalogDb;User Id=sa;Password=$(SA_PASSWORD);"
- name: SA_PASSWORD
valueFrom:
secretKeyRef:
name: sqlserver-secrets
key: sa-password
resources:
requests:
cpu: 100m
memory: 256Mi
limits:
cpu: 500m
memory: 512Mi
livenessProbe:
httpGet:
path: /health
port: 80
initialDelaySeconds: 30
periodSeconds: 10
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: eshoppublicapi
spec:
replicas: 2
selector:
matchLabels:
app: eshoppublicapi
template:
metadata:
labels:
app: eshoppublicapi
spec:
containers:
- name: eshoppublicapi
image: your-registry/eshoppublicapi:latest
ports:
- containerPort: 80
env:
- name: ConnectionStrings__CatalogConnection
value: "Server=sqlserver,1433;Database=CatalogDb;User Id=sa;Password=$(SA_PASSWORD);"
- name: SA_PASSWORD
valueFrom:
secretKeyRef:
name: sqlserver-secrets
key: sa-password
---
apiVersion: v1
kind: Service
metadata:
name: eshop-services
spec:
selector:
app: eshopwebmvc
ports:
- port: 80
targetPort: 80
type: ClusterIP
3. 外部访问配置
创建ingress.yaml配置HTTP路由:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: eshop-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
ingressClassName: nginx
rules:
- host: eshop.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: eshop-services
port:
number: 80
部署流程与验证
部署命令序列
# 创建命名空间
kubectl create namespace eshop
# 部署数据库
kubectl apply -f sqlserver-secret.yaml -n eshop
kubectl apply -f sqlserver-deployment.yaml -n eshop
# 部署应用服务
kubectl apply -f web-api-deployment.yaml -n eshop
kubectl apply -f ingress.yaml -n eshop
状态验证
# 检查Pod状态
kubectl get pods -n eshop
# 查看服务端点
kubectl get endpoints eshop-services -n eshop
# 检查日志
kubectl logs -f <pod-name> -n eshop
配置优化与最佳实践
资源限制与自动扩缩容
为Deployment添加资源限制与HPA配置:
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: eshopwebmvc-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: eshopwebmvc
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
- type: Resource
resource:
name: memory
target:
type: AverageValue
averageValue: 512Mi
健康检查配置
完善容器健康检查,避免流量路由至异常实例:
livenessProbe:
httpGet:
path: /health
port: 80
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
httpGet:
path: /health
port: 80
initialDelaySeconds: 5
periodSeconds: 5
startupProbe:
httpGet:
path: /health
port: 80
failureThreshold: 30
periodSeconds: 10
常见问题排查
数据库连接失败
- 检查SQL Server服务状态:
kubectl exec -it sqlserver-0 -n eshop /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P <password> - 验证网络连通性:
kubectl run test-pod --image=busybox --rm -it -- sh,然后使用telnet sqlserver 1433测试端口
应用启动失败
- 查看应用日志:
kubectl logs -f <pod-name> -n eshop - 检查环境变量注入:
kubectl exec -it <pod-name> -n eshop -- env | grep ConnectionStrings
持久化存储问题
- 检查PVC状态:
kubectl get pvc -n eshop - 验证StorageClass配置:
kubectl get sc
总结
通过本文档提供的Kubernetes配置,可实现eShopOnWeb应用的容器化部署。关键要点包括:
- 使用StatefulSet保证数据库存储稳定性
- 通过Secret管理敏感配置信息
- 实施健康检查与自动扩缩容保障服务可用性
- 采用Ingress控制器实现外部流量管理
完整配置文件可参考项目部署示例目录,建议结合实际环境调整资源需求与网络策略。生产环境部署时,还需补充TLS证书配置与备份策略。
【免费下载链接】eShopOnWeb 项目地址: https://gitcode.com/gh_mirrors/esh/eShopOnWeb
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



