微服务应用部署

微服务应用部署

本节部署核心的微服务应用:Product Service、Order Service、API Gateway 和 Frontend。

Product Service(商品服务)

Deployment 配置

apiVersion: v1
kind: ConfigMap
metadata:
  name: product-config
  namespace: ecommerce
data:
  APP_ENV: "production"
  LOG_LEVEL: "info"
  DB_HOST: "mongodb-0.mongodb"
  DB_NAME: "products"
  REDIS_HOST: "redis"
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: product-service
  namespace: ecommerce
  labels:
    app: product-service
    tier: backend
spec:
  replicas: 3
  selector:
    matchLabels:
      app: product-service
  template:
    metadata:
      labels:
        app: product-service
        version: v1.0.0
        tier: backend
    spec:
      serviceAccountName: app-sa
      containers:
      - name: product-service
        image: ecommerce/product-service:v1.0.0
        imagePullPolicy: Always
        ports:
        - containerPort: 8080
          name: http
          protocol: TCP
        envFrom:
        - configMapRef:
            name: product-config
        env:
        - name: DB_USER
          value: "ecommerce"
        - name: DB_PASSWORD
          valueFrom:
            secretKeyRef:
              name: app-secrets
              key: mongo-password
        - name: REDIS_PASSWORD
          valueFrom:
            secretKeyRef:
              name: app-secrets
              key: redis-password
        resources:
          requests:
            cpu: 200m
            memory: 256Mi
          limits:
            cpu: 500m
            memory: 512Mi
        livenessProbe:
          httpGet:
            path: /health
            port: 8080
          initialDelaySeconds: 30
          periodSeconds: 10
          timeoutSeconds: 5
          failureThreshold: 3
        readinessProbe:
          httpGet:
            path: /ready
            port: 8080
          initialDelaySeconds: 5
          periodSeconds: 5
          timeoutSeconds: 3
          failureThreshold: 3
        volumeMounts:
        - name: tmp
          mountPath: /tmp
      volumes:
      - name: tmp
        emptyDir: {}
---
apiVersion: v1
kind: Service
metadata:
  name: product-service
  namespace: ecommerce
  labels:
    app: product-service
spec:
  type: ClusterIP
  selector:
    app: product-service
  ports:
  - port: 8080
    targetPort: 8080
    protocol: TCP
    name: http
---
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: product-service-hpa
  namespace: ecommerce
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: product-service
  minReplicas: 3
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 70
  - type: Resource
    resource:
      name: memory
      target:
        type: Utilization
        averageUtilization: 80
  behavior:
    scaleDown:
      stabilizationWindowSeconds: 300
      policies:
      - type: Percent
        value: 50
        periodSeconds: 60
    scaleUp:
      stabilizationWindowSeconds: 0
      policies:
      - type: Percent
        value: 100
        periodSeconds: 30

Order Service(订单服务)

apiVersion: apps/v1
kind: Deployment
metadata:
  name: order-service
  namespace: ecommerce
spec:
  replicas: 3
  selector:
    matchLabels:
      app: order-service
  template:
    metadata:
      labels:
        app: order-service
        version: v1.0.0
        tier: backend
    spec:
      containers:
      - name: order-service
        image: ecommerce/order-service:v1.0.0
        ports:
        - containerPort: 8080
        env:
        - name: DB_HOST
          value: "mongodb-0.mongodb"
        - name: DB_NAME
          value: "orders"
        - name: DB_PASSWORD
          valueFrom:
            secretKeyRef:
              name: app-secrets
              key: mongo-password
        - name: PRODUCT_SERVICE_URL
          value: "http://product-service:8080"
        - name: PAYMENT_SERVICE_URL
          value: "http://payment-service:8080"
        resources:
          requests:
            cpu: 200m
            memory: 256Mi
          limits:
            cpu: 500m
            memory: 512Mi
        livenessProbe:
          httpGet:
            path: /health
            port: 8080
          initialDelaySeconds: 30
        readinessProbe:
          httpGet:
            path: /ready
            port: 8080
          initialDelaySeconds: 5
---
apiVersion: v1
kind: Service
metadata:
  name: order-service
  namespace: ecommerce
spec:
  selector:
    app: order-service
  ports:
  - port: 8080
    targetPort: 8080

API Gateway(API 网关)

apiVersion: v1
kind: ConfigMap
metadata:
  name: gateway-nginx-config
  namespace: ecommerce
data:
  nginx.conf: |
    events {
      worker_connections 4096;
    }
    
    http {
      upstream product_backend {
        server product-service:8080;
      }
      
      upstream order_backend {
        server order-service:8080;
      }
      
      upstream payment_backend {
        server payment-service:8080;
      }
      
      server {
        listen 80;
        server_name _;
        
        # 健康检查
        location /health {
          access_log off;
          return 200 "healthy\n";
        }
        
        # 产品 API
        location /api/products {
          proxy_pass http://product_backend;
          proxy_set_header Host $host;
          proxy_set_header X-Real-IP $remote_addr;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
        
        # 订单 API
        location /api/orders {
          proxy_pass http://order_backend;
          proxy_set_header Host $host;
          proxy_set_header X-Real-IP $remote_addr;
        }
        
        # 支付 API
        location /api/payments {
          proxy_pass http://payment_backend;
          proxy_set_header Host $host;
          proxy_set_header X-Real-IP $remote_addr;
        }
        
        # CORS 配置
        add_header 'Access-Control-Allow-Origin' '*' always;
        add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS' always;
      }
    }
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: api-gateway
  namespace: ecommerce
spec:
  replicas: 2
  selector:
    matchLabels:
      app: api-gateway
  template:
    metadata:
      labels:
        app: api-gateway
        tier: gateway
    spec:
      containers:
      - name: nginx
        image: nginx:1.25-alpine
        ports:
        - containerPort: 80
        volumeMounts:
        - name: nginx-config
          mountPath: /etc/nginx/nginx.conf
          subPath: nginx.conf
        resources:
          requests:
            cpu: 100m
            memory: 128Mi
          limits:
            cpu: 200m
            memory: 256Mi
      volumes:
      - name: nginx-config
        configMap:
          name: gateway-nginx-config
---
apiVersion: v1
kind: Service
metadata:
  name: api-gateway
  namespace: ecommerce
spec:
  selector:
    app: api-gateway
  ports:
  - port: 80
    targetPort: 80

Frontend(前端应用)

apiVersion: apps/v1
kind: Deployment
metadata:
  name: frontend
  namespace: ecommerce
spec:
  replicas: 2
  selector:
    matchLabels:
      app: frontend
  template:
    metadata:
      labels:
        app: frontend
        tier: frontend
    spec:
      containers:
      - name: frontend
        image: ecommerce/frontend:v1.0.0
        ports:
        - containerPort: 80
        env:
        - name: API_GATEWAY_URL
          value: "http://api-gateway"
        resources:
          requests:
            cpu: 100m
            memory: 128Mi
          limits:
            cpu: 200m
            memory: 256Mi
        livenessProbe:
          httpGet:
            path: /
            port: 80
          initialDelaySeconds: 10
        readinessProbe:
          httpGet:
            path: /
            port: 80
          initialDelaySeconds: 5
---
apiVersion: v1
kind: Service
metadata:
  name: frontend
  namespace: ecommerce
spec:
  selector:
    app: frontend
  ports:
  - port: 80
    targetPort: 80

部署验证

# 1. 查看所有部署
kubectl get deployments -n ecommerce

# 2. 查看所有 Pod
kubectl get pods -n ecommerce -o wide

# 3. 查看所有 Service
kubectl get svc -n ecommerce

# 4. 查看 HPA 状态
kubectl get hpa -n ecommerce

# 5. 测试服务连接
kubectl run test -it --rm --image=busybox -n ecommerce -- sh
wget -O- http://product-service:8080/health
wget -O- http://api-gateway/health

Pod 反亲和性配置

为了提高可用性,配置 Pod 反亲和性:

spec:
  template:
    spec:
      affinity:
        podAntiAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 100
            podAffinityTerm:
              labelSelector:
                matchExpressions:
                - key: app
                  operator: In
                  values:
                  - product-service
              topologyKey: kubernetes.io/hostname

小结

本节部署了核心微服务:

Product Service:商品服务 + HPA 自动扩缩容
Order Service:订单服务 + 服务间通信
API Gateway:Nginx 反向代理 + 路由转发
Frontend:前端应用 + 静态资源服务
高可用:多副本 + Pod 反亲和性

下一节配置 Ingress 暴露服务到外网。