微服务应用部署
微服务应用部署
本节部署核心的微服务应用: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 暴露服务到外网。