文章目录
Kubernetes 调度和资源管理
Kubernetes 调度和资源管理是其核心功能,负责在集群中高效分配和管理计算资源。通过调度策略、资源限制和优先级控制,Kubernetes 能够确保应用的性能、可靠性和高可用性。
调度的基本概念
Kubernetes 调度是指将工作负载(如 Pod)分配到合适的节点上运行的过程。调度器(kube-scheduler
)是 Kubernetes 的核心组件之一,专门负责此任务。
调度过程
- 调度请求:
- 当用户提交一个 Pod 时,API Server 将其加入调度队列。
- 节点筛选(Filtering):
- 调度器根据一系列预定义规则过滤出满足要求的节点(候选节点)。
- 节点打分(Scoring):
- 为每个候选节点打分,选择分数最高的节点作为目标节点。
- 绑定 Pod:
- 将 Pod 绑定到目标节点,并通过 API Server 通知对应节点的
kubelet
启动 Pod。
- 将 Pod 绑定到目标节点,并通过 API Server 通知对应节点的
调度算法
- 默认调度器采用了插件化设计,支持多种调度算法,包括:
- 预选算法:用于过滤不满足条件的节点。
- 优选算法:为符合条件的节点打分,选择最优节点。
- 用户可以自定义调度逻辑,甚至替换默认调度器。
资源管理
Kubernetes 通过资源配额和优先级控制实现资源的合理分配和管理,确保应用的稳定运行并防止资源滥用。
资源类型
- 计算资源:
- CPU:以核为单位,可以指定小数(如 0.5 表示半个 CPU 核)。
- 内存:以字节为单位,支持 Ki、Mi、Gi 等单位。
- 存储资源:
- 使用 PersistentVolume(PV)和 PersistentVolumeClaim(PVC)管理存储。
- 网络资源:
- 管理 Pod 的网络流量和带宽。
资源限制
通过 resources
字段定义 Pod 或容器的资源限制:
- requests:
- 资源的最低请求值,调度器根据此值选择合适的节点。
- limits:
- 资源的最大使用值,容器运行时不能超过。
示例:
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
资源配额(Resource Quotas)
- 用于限制命名空间内资源的总使用量,防止单个用户或应用占用过多资源。
- 配置示例:
apiVersion: v1
kind: ResourceQuota
metadata:
name: compute-quota
spec:
hard:
pods: "10"
requests.cpu: "4"
requests.memory: "8Gi"
limits.cpu: "10"
limits.memory: "16Gi"
调度策略
默认调度策略
-
资源需求匹配:根据 Pod 的
resources.requests
找到能够满足需求的节点。 -
节点亲和性和反亲和性:
- 控制 Pod 部署到特定节点或避免特定节点。
- 示例:
affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname operator: In values: - node1
-
Pod 亲和性和反亲和性:
- 控制 Pod 部署到与其他特定 Pod 相同或不同的节点。
- 示例:
affinity: podAffinity: requiredDuringSchedulingIgnoredDuringExecution: labelSelector: matchLabels: app: web topologyKey: "kubernetes.io/hostname"
自定义调度策略
-
Taints 和 Tolerations:
- 用于限制 Pod 被调度到带有特定污点的节点上。
- 示例:
taints: - key: "dedicated" value: "batch-processing" effect: "NoSchedule" tolerations: - key: "dedicated" operator: "Equal" value: "batch-processing" effect: "NoSchedule"
-
Priority and Preemption:
- 优先级定义 Pod 的重要性,优先级高的 Pod 会抢占低优先级 Pod 的资源。
- 配置优先级类:
apiVersion: scheduling.k8s.io/v1 kind: PriorityClass metadata: name: high-priority value: 1000000 preemptionPolicy: PreemptLowerPriority globalDefault: false description: "This priority class is for high priority pods."
资源监控与自动化
HPA(Horizontal Pod Autoscaler)
- 根据应用负载自动扩缩 Pod 的副本数。
- 基于指标:
- CPU 使用率
- 内存使用率
- 自定义指标(如 QPS)
- 示例:
apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: example-hpa spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: example-deployment minReplicas: 1 maxReplicas: 10 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 50
VPA(Vertical Pod Autoscaler)
- 自动调整 Pod 的资源分配(CPU 和内存)。
Cluster Autoscaler
- 自动调整集群节点数以满足 Pod 的资源需求。
总结
Kubernetes 的调度和资源管理通过高效的调度器、灵活的资源控制机制,以及自动化的扩展工具,确保应用在复杂的分布式环境中高效运行。结合调度策略、资源配额、优先级等功能,Kubernetes 能够实现从单节点到多节点集群的全面管理,为云原生应用提供稳定可靠的运行环境。