{T}

伸缩性架构 学习笔记(第 5 部分)

5.2 核心编排能力

1. 服务发现

javascript
// Kubernetes 服务发现机制
const serviceDiscovery = {
  // 1. DNS 服务发现
  dns: {
    mechanism: 'CoreDNS 自动解析',
    format: '<service-name>.<namespace>.svc.cluster.local',
    example: 'frontend-service.default.svc.cluster.local'
  },
  
  // 2. 环境变量发现
  envVariables: {
    mechanism: 'Kubernetes 自动注入',
    example: {
      FRONTEND_SERVICE_SERVICE_HOST: '10.96.0.1',
      FRONTEND_SERVICE_SERVICE_PORT: '80'
    }
  },
  
  // 3. Service 对象
  service: {
    types: ['ClusterIP', 'NodePort', 'LoadBalancer', 'ExternalName'],
    selector: '通过标签选择器关联 Pod'
  }
}

2. 负载均衡

yaml
# Kubernetes Service 负载均衡配置
apiVersion: v1
kind: Service
metadata:
  name: backend-service
spec:
  selector:
    app: backend
  ports:
  - port: 8080
    targetPort: 8080
  # 负载均衡策略
  sessionAffinity: None  # 或 ClientIP
  # 外部流量策略
  externalTrafficPolicy: Local  # 或 Cluster

3. 故障恢复

yaml
# 健康检查配置
livenessProbe:
  httpGet:
    path: /health
    port: 80
  initialDelaySeconds: 30
  periodSeconds: 10
  failureThreshold: 3

readinessProbe:
  httpGet:
    path: /ready
    port: 80
  initialDelaySeconds: 5
  periodSeconds: 5
  failureThreshold: 3

startupProbe:
  httpGet:
    path: /health
    port: 80
  initialDelaySeconds: 0
  periodSeconds: 10
  failureThreshold: 30

4. 配置管理

yaml
# ConfigMap 配置
apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  database_url: "postgresql://db:5432/mydb"
  redis_url: "redis://redis:6379"
  log_level: "info"

---
# Secret 敏感配置
apiVersion: v1
kind: Secret
metadata:
  name: app-secret
type: Opaque
data:
  database_password: cGFzc3dvcmQxMjM=  # base64 编码
  api_key: YWJjZGVmZ2hpamtsbW5vcA==

---
# 在 Pod 中使用配置
apiVersion: v1
kind: Pod
metadata:
  name: app-pod
spec:
  containers:
  - name: app
    image: my-app:v1
    envFrom:
    - configMapRef:
        name: app-config
    - secretRef:
        name: app-secret

5. 存储管理

yaml
# PersistentVolume 持久化存储
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-storage
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: standard
  hostPath:
    path: /mnt/data

---
# PersistentVolumeClaim 存储声明
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-storage
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
  storageClassName: standard

---
# 在 Pod 中挂载存储
apiVersion: v1
kind: Pod
metadata:
  name: app-with-storage
spec:
  containers:
  - name: app
    image: my-app:v1
    volumeMounts:
    - mountPath: /app/data
      name: data-volume
  volumes:
  - name: data-volume
    persistentVolumeClaim:
      claimName: pvc-storage

六、伸缩性架构最佳实践

6.1 伸缩策略设计

javascript
// 伸缩策略配置
const scalingStrategy = {
  // 1. 预测性伸缩
  predictive: {
    method: '基于历史数据预测',
    scenarios: ['定时任务', '促销活动', '节假日'],
    implementation: 'CronJob + HPA'
  },
  
  // 2. 响应式伸缩
  reactive: {
    method: '基于实时指标伸缩',
    metrics: ['CPU', '内存', 'QPS', '自定义指标'],
    implementation: 'HPA + VPA'
  },
  
  // 3. 混合伸缩
  hybrid: {
    method: '预测 + 响应式结合',
    advantage: '应对突发流量,减少延迟',
    implementation: 'KEDA + HPA'
  }
}