news 2026/5/21 11:25:55

Kubernetes资源管理与调度策略

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Kubernetes资源管理与调度策略

Kubernetes资源管理与调度策略

引言

Kubernetes已经成为容器编排的标准平台,掌握Kubernetes的资源管理和调度策略对于构建稳定、高效的容器化应用至关重要。本文将深入探讨Kubernetes的资源管理机制和调度策略。

一、Kubernetes资源模型

1.1 资源类型

Kubernetes支持两种类型的资源:

  • 可压缩资源(Compressible):CPU,可被压缩使用
  • 不可压缩资源(Incompressible):内存,不可被压缩

1.2 资源请求与限制

apiVersion: v1 kind: Pod metadata: name: resource-demo spec: containers: - name: demo image: nginx:alpine resources: requests: cpu: "100m" memory: "256Mi" limits: cpu: "500m" memory: "512Mi"

1.3 QoS等级

Kubernetes根据资源配置将Pod分为三个QoS等级:

QoS等级条件特点
Guaranteedrequests == limits资源完全保证,优先级最高
Burstablerequests < limits可突发使用资源,优先级中等
BestEffort无requests和limits资源尽力分配,优先级最低

二、节点选择与调度

2.1 节点选择器

apiVersion: v1 kind: Pod metadata: name: node-selector-demo spec: nodeSelector: disktype: ssd zone: us-east-1a containers: - name: demo image: nginx:alpine

2.2 节点亲和性

apiVersion: v1 kind: Pod metadata: name: affinity-demo spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: topology.kubernetes.io/zone operator: In values: - us-east-1a - us-east-1b preferredDuringSchedulingIgnoredDuringExecution: - weight: 1 preference: matchExpressions: - key: disktype operator: In values: - ssd containers: - name: demo image: nginx:alpine

2.3 Pod亲和性与反亲和性

apiVersion: v1 kind: Pod metadata: name: pod-affinity-demo spec: affinity: podAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: app operator: In values: - backend topologyKey: kubernetes.io/hostname podAntiAffinity: preferredDuringSchedulingIgnoredDuringExecution: - weight: 100 podAffinityTerm: labelSelector: matchExpressions: - key: app operator: In values: - database topologyKey: kubernetes.io/hostname containers: - name: demo image: nginx:alpine

三、调度策略

3.1 默认调度器

Kubernetes默认调度器使用以下步骤进行调度:

  1. 过滤阶段:排除不满足条件的节点
  2. 评分阶段:对剩余节点评分
  3. 选择阶段:选择评分最高的节点

3.2 调度器配置

apiVersion: kubescheduler.config.k8s.io/v1beta3 kind: KubeSchedulerConfiguration profiles: - schedulerName: default-scheduler plugins: score: enabled: - name: NodeResourcesLeastAllocated weight: 1 - name: NodeResourcesMostAllocated weight: 2 disabled: - name: NodeResourcesBalancedAllocation

3.3 自定义调度器

package main import ( "context" "k8s.io/kubernetes/pkg/scheduler/framework" "k8s.io/kubernetes/pkg/scheduler/framework/plugins/noderesources" ) type CustomScheduler struct { framework.Framework } func (s *CustomScheduler) Schedule(ctx context.Context, state *framework.CycleState, pod *v1.Pod) (result framework.ScheduleResult, err error) { // 自定义调度逻辑 return result, nil } func main() { framework.RegisterPlugin("custom-scorer", noderesources.NewLeastAllocated) scheduler := &CustomScheduler{} scheduler.Run() }

四、资源配额与限制范围

4.1 ResourceQuota

apiVersion: v1 kind: ResourceQuota metadata: name: namespace-quota spec: hard: requests.cpu: "4" requests.memory: "8Gi" limits.cpu: "8" limits.memory: "16Gi" pods: "10" services: "5" configmaps: "10"

4.2 LimitRange

apiVersion: v1 kind: LimitRange metadata: name: container-limits spec: limits: - type: Container default: cpu: "500m" memory: "512Mi" defaultRequest: cpu: "100m" memory: "256Mi" max: cpu: "2" memory: "2Gi" min: cpu: "50m" memory: "128Mi" - type: Pod max: cpu: "4" memory: "4Gi" min: cpu: "100m" memory: "256Mi"

五、Horizontal Pod Autoscaler

5.1 HPA配置

apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: hpa-demo spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: demo-deployment minReplicas: 2 maxReplicas: 10 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 70 - type: Resource resource: name: memory target: type: Utilization averageUtilization: 80

5.2 自定义指标

apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: hpa-custom-metrics spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: demo-deployment minReplicas: 2 maxReplicas: 10 metrics: - type: Pods pods: metric: name: requests-per-second target: type: AverageValue averageValue: 100m

六、Vertical Pod Autoscaler

6.1 VPA配置

apiVersion: autoscaling.k8s.io/v1 kind: VerticalPodAutoscaler metadata: name: vpa-demo spec: targetRef: apiVersion: "apps/v1" kind: Deployment name: demo-deployment updatePolicy: updateMode: "Auto" resourcePolicy: containerPolicies: - containerName: "*" minAllowed: cpu: "50m" memory: "128Mi" maxAllowed: cpu: "2" memory: "2Gi"

七、调度器插件

7.1 启用插件

apiVersion: kubescheduler.config.k8s.io/v1beta3 kind: KubeSchedulerConfiguration profiles: - schedulerName: default-scheduler plugins: filter: enabled: - name: NodeResourcesFit - name: NodeAffinity - name: PodAffinity score: enabled: - name: NodeResourcesLeastAllocated weight: 1 - name: ImageLocality weight: 2

7.2 常用插件

插件类型作用
NodeResourcesFitFilter检查节点资源是否满足Pod需求
NodeAffinityFilter/Score节点亲和性
PodAffinityFilter/ScorePod亲和性
NodeResourcesLeastAllocatedScore优先选择资源使用最少的节点
NodeResourcesMostAllocatedScore优先选择资源使用最多的节点
ImageLocalityScore优先选择已有镜像的节点

八、污点与容忍度

8.1 节点污点

# 添加污点 kubectl taint nodes node-1 key=value:NoSchedule # 查看污点 kubectl get nodes node-1 -o jsonpath='{.spec.taints}' # 删除污点 kubectl taint nodes node-1 key-

8.2 Pod容忍度

apiVersion: v1 kind: Pod metadata: name: toleration-demo spec: tolerations: - key: "key" operator: "Equal" value: "value" effect: "NoSchedule" - key: "node.kubernetes.io/unreachable" operator: "Exists" tolerationSeconds: 6000 containers: - name: demo image: nginx:alpine

8.3 污点效果

效果说明
NoSchedule不调度到该节点,除非Pod有容忍度
PreferNoSchedule尽量不调度到该节点
NoExecute不调度到该节点,且驱逐已存在的Pod

九、实战案例:资源优化

9.1 配置优化

apiVersion: apps/v1 kind: Deployment metadata: name: optimized-app spec: replicas: 3 selector: matchLabels: app: optimized-app template: metadata: labels: app: optimized-app spec: affinity: podAntiAffinity: preferredDuringSchedulingIgnoredDuringExecution: - weight: 100 podAffinityTerm: labelSelector: matchLabels: app: optimized-app topologyKey: kubernetes.io/hostname containers: - name: app image: myapp:latest resources: requests: cpu: "200m" memory: "512Mi" limits: cpu: "1" memory: "1Gi" livenessProbe: httpGet: path: /health port: 8080 initialDelaySeconds: 10 periodSeconds: 5 readinessProbe: httpGet: path: /ready port: 8080 initialDelaySeconds: 5 periodSeconds: 3

9.2 监控与调整

# 查看节点资源使用 kubectl top nodes # 查看Pod资源使用 kubectl top pods # 查看事件 kubectl get events # 查看调度器日志 kubectl logs -n kube-system kube-scheduler-<node-name>

十、总结

Kubernetes的资源管理和调度策略是构建高效、稳定容器化应用的关键。通过合理配置资源请求和限制、使用节点选择器和亲和性、配置HPA和VPA自动扩缩容,可以实现资源的最优利用。

在实际项目中,需要根据应用特点和集群状况不断调整调度策略,实现最佳的资源利用率和应用性能。持续监控和优化是Kubernetes运维的重要组成部分。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/18 11:20:15

游戏帧率不稳深度调校:DLSS版本动态切换实战指南

游戏帧率不稳深度调校&#xff1a;DLSS版本动态切换实战指南 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper DLSS Swapper是一款专为游戏性能优化设计的动态库管理工具&#xff0c;它允许玩家在不等待游戏官方更新的情…

作者头像 李华
网站建设 2026/5/18 11:20:04

从RFC4493到实战:深入解析AES-CMAC算法原理与实现

1. AES-CMAC算法初探&#xff1a;从RFC4493开始 第一次接触AES-CMAC时&#xff0c;我完全被RFC文档里那些数学符号和流程图搞晕了。直到在嵌入式项目中真正用它解决消息认证问题&#xff0c;才发现这个算法设计得如此巧妙。AES-CMAC本质上是一种基于AES加密的消息认证码算法&a…

作者头像 李华
网站建设 2026/5/18 11:17:03

AWS实战|从零搭建高可用Web应用网络架构

1. 为什么需要高可用Web应用架构&#xff1f; 最近帮朋友公司迁移电商平台到AWS时&#xff0c;他们最担心的就是大促期间服务器挂掉。这让我想起三年前自己踩过的坑——当时用单可用区部署的官网&#xff0c;因为一次区域级故障直接宕机8小时。现在回头看&#xff0c;其实只要在…

作者头像 李华
网站建设 2026/5/18 11:17:03

String、StringBuilder、StringBuffer的区别?

在Java中&#xff0c;String、StringBuilder和StringBuffer都是用于处理字符串的类。虽然它们的目的相似&#xff0c;但它们之间存在一些重要的区别。本文将详细探讨这三者的特点、使用场景及示例代码。1. String String 是 Java 中的一种不可变&#xff08;immutable&#xff…

作者头像 李华