eShopOnWeb容器编排:Kubernetes部署配置指南

eShopOnWeb容器编排:Kubernetes部署配置指南

【免费下载链接】eShopOnWeb 【免费下载链接】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

常见问题排查

数据库连接失败

  1. 检查SQL Server服务状态:kubectl exec -it sqlserver-0 -n eshop /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P <password>
  2. 验证网络连通性:kubectl run test-pod --image=busybox --rm -it -- sh,然后使用telnet sqlserver 1433测试端口

应用启动失败

  1. 查看应用日志:kubectl logs -f <pod-name> -n eshop
  2. 检查环境变量注入:kubectl exec -it <pod-name> -n eshop -- env | grep ConnectionStrings

持久化存储问题

  1. 检查PVC状态:kubectl get pvc -n eshop
  2. 验证StorageClass配置:kubectl get sc

总结

通过本文档提供的Kubernetes配置,可实现eShopOnWeb应用的容器化部署。关键要点包括:

  • 使用StatefulSet保证数据库存储稳定性
  • 通过Secret管理敏感配置信息
  • 实施健康检查与自动扩缩容保障服务可用性
  • 采用Ingress控制器实现外部流量管理

完整配置文件可参考项目部署示例目录,建议结合实际环境调整资源需求与网络策略。生产环境部署时,还需补充TLS证书配置与备份策略。

【免费下载链接】eShopOnWeb 【免费下载链接】eShopOnWeb 项目地址: https://gitcode.com/gh_mirrors/esh/eShopOnWeb

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值