1. 资源请求与限制调整
- 合理设置请求值:检查容器的资源请求(requests)设置,确保其准确反映容器正常运行所需的资源量。如果请求值设置过低,会导致容器在资源紧张时无法获取足够资源。例如,对于一个 CPU 密集型的服务,若之前设置的 CPU 请求值过低,可适当提高该值,如从 0.1 核提升至 0.5 核。
- 调整限制值:审视资源限制(limits),避免设置过于保守或宽松。过于保守的限制会导致容器在突发流量时无法利用更多资源,而宽松的限制则可能造成资源浪费。例如,若某个内存敏感型容器之前设置的内存限制过高,可根据实际使用情况降低,如从 2GB 降至 1.5GB。
2. 水平 Pod 自动伸缩(HPA)
- 基于 CPU 使用率:配置 HPA 根据 CPU 使用率自动调整 Pod 的副本数量。例如,设置当 CPU 使用率超过 80%时,自动增加副本;当低于 50%时,自动减少副本。可以通过以下命令配置:
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
name: my-service-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: my-service
minReplicas: 2
maxReplicas: 10
targetCPUUtilizationPercentage: 80
- 基于其他指标:除 CPU 外,还可基于内存使用率、自定义指标(如请求队列长度等)进行伸缩。例如,若服务对内存要求较高,可配置基于内存使用率的 HPA:
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
name: my-service-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: my-service
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: 70
3. 垂直 Pod 自动伸缩(VPA)
- 启用 VPA:通过启用 VPA 来自动调整容器的资源请求和限制。VPA 会根据容器的历史资源使用情况进行分析,并作出调整。例如:
apiVersion: autoscaling.k8s.io/v1beta2
kind: VerticalPodAutoscaler
metadata:
name: my-service-vpa
spec:
targetRef:
apiVersion: apps/v1
kind: Deployment
name: my-service
updatePolicy:
updateMode: "Auto"
- 观察调整效果:密切关注 VPA 调整后的效果,确保调整后的资源配置既满足容器需求,又不过度占用资源。
4. 节点资源监控与调整
- 监控节点资源:利用工具(如 Prometheus + Grafana)监控节点的 CPU、内存、磁盘 I/O、网络带宽等资源使用情况。及时发现节点资源瓶颈,例如某个节点 CPU 长期处于 90%以上使用率,可能需要对该节点进行处理。
- 节点资源平衡:如果某个节点资源紧张,可通过 Kubernetes 的污点(taint)和容忍(toleration)机制,将部分 Pod 迁移到其他资源较为空闲的节点。例如,给资源紧张的节点添加污点
node.kubernetes.io/resource-pressure:NoSchedule
,并为一些非关键 Pod 添加相应的容忍。
5. 容器优化
- 优化容器镜像:检查容器镜像,删除不必要的文件和依赖,减小镜像体积,从而减少容器启动时间和占用的磁盘空间。例如,在构建镜像时,使用多阶段构建,只保留最终运行时所需的文件。
- 调整容器内应用配置:优化容器内运行的应用程序配置,如调整数据库连接池大小、优化缓存设置等,以提高应用程序的资源利用效率。例如,对于一个 Java Web 应用,合理调整 Tomcat 的线程池大小。
6. 服务拓扑与亲和性设置
- 亲和性设置:通过 Pod 亲和性(affinity)和反亲和性(anti - affinity)设置,将相关的 Pod 放置在合适的节点上。例如,对于一组相互依赖的微服务 Pod,可以设置亲和性,让它们尽量部署在同一节点或同一可用区,减少网络开销。
apiVersion: v1
kind: Pod
metadata:
name: my - pod
spec:
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchLabels:
app: my - related - app
topologyKey: kubernetes.io/hostname
- 反亲和性设置:对于一些可能竞争资源的 Pod,设置反亲和性,避免它们部署在同一节点。例如,对于两个高资源消耗的服务 Pod:
apiVersion: v1
kind: Pod
metadata:
name: my - pod
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchLabels:
app: my - competing - app
topologyKey: kubernetes.io/hostname