Kubernetes指南
Linux性能优化实战eBPF 核心技术与实战SDN指南个人博客
中文
中文
  • 序言
  • 基础入门
    • Kubernetes 简介
    • Kubernetes 基本概念
    • Kubernetes 101
    • Kubernetes 201
    • Kubernetes 集群
  • 核心原理
    • 核心原理
    • 架构原理
    • 设计理念
    • 核心组件
      • etcd
      • kube-apiserver
      • kube-scheduler
      • kube-controller-manager
      • kubelet
      • kube-proxy
      • kube-dns
      • Federation
      • kubeadm
      • hyperkube
      • kubectl
    • 资源对象
      • Autoscaling
      • ConfigMap
      • CronJob
      • CustomResourceDefinition
      • DaemonSet
      • Deployment
      • Gateway API
      • Ingress
      • Job
      • LocalVolume
      • Namespace
      • NetworkPolicy
      • Node
      • PersistentVolume
      • Pod
      • PodPreset
      • ReplicaSet
      • Resource Quota
      • Secret
      • SecurityContext
      • Service
      • ServiceAccount
      • StatefulSet
      • Volume
  • 部署配置
    • 部署指南
    • kubectl 安装
    • 单机部署
    • 特性开关
    • 最佳配置
    • 版本支持
    • 集群部署
      • kubeadm
      • kops
      • Kubespray
      • Azure
      • Windows
      • LinuxKit
      • kubeasz
    • 附加组件
      • Addon-manager
      • DNS
      • Dashboard
      • 监控
      • 日志
      • Metrics
      • GPU
      • Cluster Autoscaler
      • ip-masq-agent
    • Kubernetes-The-Hard-Way
      • 准备部署环境
      • 安装必要工具
      • 创建计算资源
      • 配置创建证书
      • 配置生成配置
      • 配置生成密钥
      • 部署 Etcd 群集
      • 部署控制节点
      • 部署计算节点
      • 配置 Kubectl
      • 配置网络路由
      • 部署 DNS 扩展
      • 烟雾测试
      • 删除集群
  • 插件扩展
    • API 扩展
      • Aggregation
      • CustomResourceDefinition
    • 访问控制
      • 认证
      • RBAC 授权
      • 准入控制
    • Scheduler 扩展
    • 网络插件
      • CNI
      • Flannel
      • Calico
      • Weave
      • Cilium
      • OVN
      • Contiv
      • SR-IOV
      • Romana
      • OpenContrail
      • Kuryr
    • 运行时插件 CRI
      • CRI-tools
      • Frakti
    • 存储插件
      • 容器存储接口 CSI
      • FlexVolume
      • glusterfs
    • 网络策略
    • Ingress Controller
      • Ingress + Letsencrypt
      • minikube Ingress
      • Traefik Ingress
      • Keepalived-VIP
    • Cloud Provider 扩展
    • Device 插件
  • 服务治理
    • 服务治理
      • 一般准则
      • 滚动升级
      • Helm
      • Operator
      • Service Mesh
      • Linkerd
      • Linkerd2
    • Istio
      • 安装
      • 流量管理
      • 安全管理
      • 策略管理
      • 度量管理
      • 排错
      • 社区
    • Devops
      • Draft
      • Jenkins X
      • Spinnaker
      • Kompose
      • Skaffold
      • Argo
      • Flux GitOps
  • 实践案例
    • 实践概览
    • 资源控制
    • 集群高可用
    • 应用高可用
    • 调试
    • 端口映射
    • 端口转发
    • 用户管理
    • GPU
    • HugePage
    • 安全
    • 审计
    • 备份恢复
    • 证书轮换
    • 大规模集群
    • 大数据与机器学习
      • Spark
      • Tensorflow
    • Serverless
  • 排错指南
    • 排错概览
    • 集群排错
    • Pod 排错
    • 网络排错
    • PV 排错
      • AzureDisk
      • AzureFile
    • Windows 排错
    • 云平台排错
      • Azure
    • 排错工具
  • 社区贡献
    • 开发指南
    • 单元测试和集成测试
    • 社区贡献
  • 附录
    • 生态圈
    • 学习资源
    • 国内镜像
    • 如何贡献
    • 参考文档
由 GitBook 提供支持
在本页
  • Dynamic Resource Allocation (DRA) 资源管理
  • DRA 资源管理优势
  • 资源管理最佳实践
  • 故障恢复和错误处理
  • 成本优化
  • 原地 Pod 资源调整最佳实践
  • 何时使用原地调整
  • 调整策略配置
  • 与 VPA 集成
  • 资源调整最佳实践
  • 监控和告警
  • 性能考量
  • 使用 kube-advisor 检查应用程序问题
  • 参考文档
  1. 实践案例

资源控制

推荐在 YAML 清单中针对所有 pod 设置 pod 请求和限制:

  • pod 请求定义 pod 所需的 CPU 和内存量。Kubernetes 基于这些请求量进行节点调度。

  • pod 限制是 pod 可以使用的最大 CPU 和内存量,用于防治失控 Pod 占用过多资源。

如果不包含这些值,Kubernetes 调度程序将不知道需要多少资源。 调度程序可能会在资源不足的节点上运行 pod,从而无法提供可接受的应用程序性能。

群集管理员也可以为需要设置资源请求和限制的命名空间设置资源配额。

Dynamic Resource Allocation (DRA) 资源管理

从 Kubernetes v1.26 开始,DRA 提供了一种全新的资源分配和管理方式,特别适用于 GPU、FPGA 等特殊设备资源。

DRA 资源管理优势

相比传统的资源限制方式,DRA 提供了:

  1. 动态分配 - 资源按需分配,而非启动时预留

  2. 细粒度控制 - 支持设备的分区和共享

  3. 更好的利用率 - 通过智能调度提高资源利用率

  4. 灵活配置 - 支持复杂的设备配置需求

资源管理最佳实践

1. 资源类定义

创建 ResourceClass 定义可用的设备类型:

apiVersion: resource.k8s.io/v1alpha2
kind: ResourceClass
metadata:
  name: gpu-class
spec:
  driverName: gpu.example.com
  parameters:
    memory: "8Gi"
    compute: "high"
    # v1.33 新特性:支持分区设备
    partitionable: true
    maxPartitions: 4

2. 资源配额管理

在命名空间级别控制 DRA 资源使用:

apiVersion: v1
kind: ResourceQuota
metadata:
  name: dra-quota
  namespace: ml-team
spec:
  hard:
    # 限制该命名空间最多使用 4 个 GPU
    count/resourceclaims.resource.k8s.io: "4"
    # v1.33 新特性:管理员访问控制
    requests.resource.k8s.io/gpu: "4"

3. 优先级列表配置

利用 v1.33 的优先级列表特性提供设备备选方案:

apiVersion: resource.k8s.io/v1alpha2
kind: ResourceClaim
metadata:
  name: flexible-gpu-claim
spec:
  # 优先级列表:优先使用高性能 GPU,备选普通 GPU
  resourceClassNames:
  - high-perf-gpu-class    # 优先级 1
  - standard-gpu-class     # 优先级 2
  - shared-gpu-class       # 优先级 3

4. 设备污点和容忍度

使用 v1.33 的设备污点特性进行设备维护:

# 标记设备为维护状态
apiVersion: resource.k8s.io/v1alpha2
kind: ResourceSlice
metadata:
  name: gpu-node-1
spec:
  driverName: gpu.example.com
  devices:
  - name: gpu-0
    basic:
      attributes:
        memory: "16Gi"
      capacity:
        memory: "16Gi"
    # 设备污点:标记为维护状态
    taints:
    - key: "maintenance"
      value: "scheduled"
      effect: "NoSchedule"
---
# Pod 容忍维护污点
apiVersion: v1
kind: Pod
metadata:
  name: maintenance-tolerant-pod
spec:
  containers:
  - name: app
    image: my-app
    resources:
      claims:
      - name: gpu-resource
  resourceClaims:
  - name: gpu-resource
    source:
      resourceClaimName: my-gpu-claim
  # 容忍设备维护污点
  tolerations:
  - key: "resource.kubernetes.io/device.maintenance"
    operator: "Equal"
    value: "scheduled"
    effect: "NoSchedule"

5. 资源监控和度量

监控 DRA 资源使用情况:

apiVersion: v1
kind: Pod
metadata:
  name: resource-monitor
spec:
  containers:
  - name: monitor
    image: prometheus/node-exporter
    # 监控 DRA 设备状态
    volumeMounts:
    - name: dra-metrics
      mountPath: /host/sys/class/drm
      readOnly: true
  volumes:
  - name: dra-metrics
    hostPath:
      path: /sys/class/drm

故障恢复和错误处理

自动故障恢复

DRA 提供了更好的错误处理机制:

apiVersion: resource.k8s.io/v1alpha2
kind: ResourceClaim
metadata:
  name: resilient-gpu-claim
spec:
  resourceClassName: gpu-class
  # 自动重试配置
  allocationMode: WaitForFirstConsumer
  parameters:
    # 设备故障时自动重新分配
    autoReallocation: true
    # 最大重试次数
    maxRetries: 3

资源清理策略

配置资源的清理策略:

apiVersion: v1
kind: Pod
metadata:
  name: batch-job
  annotations:
    # v1.33 特性:资源清理策略
    resource.kubernetes.io/cleanup-policy: "immediate"
spec:
  restartPolicy: Never
  containers:
  - name: job
    image: batch-processor
    resources:
      claims:
      - name: gpu-resource
  resourceClaims:
  - name: gpu-resource
    source:
      resourceClaimName: batch-gpu-claim

成本优化

资源池管理

通过资源池提高利用率:

apiVersion: resource.k8s.io/v1alpha2
kind: ResourceClass
metadata:
  name: shared-gpu-pool
spec:
  driverName: gpu.example.com
  parameters:
    # 启用资源池
    pooled: true
    # 最大共享数
    maxSharedUsers: 8
    # 时间片分配
    timeSlicing: true

预算控制

结合 ResourceQuota 进行预算控制:

apiVersion: v1
kind: ResourceQuota
metadata:
  name: team-budget
  namespace: research-team
spec:
  hard:
    # 基于 GPU 小时的预算控制
    requests.resource.k8s.io/gpu-hours: "1000"
    # 最大并发 GPU 数量
    requests.resource.k8s.io/gpu: "10"

群集管理员也可以为需要设置资源请求和限制的命名空间设置资源配额。

原地 Pod 资源调整最佳实践

从 Kubernetes v1.33 开始,原地 Pod 资源调整功能升级为 Beta 版本,为资源管理带来了新的可能性。

何时使用原地调整

适用场景

  • 长运行服务:Web 服务、数据库等需要根据负载动态调整资源

  • 机器学习工作负载:训练任务在不同阶段需要不同的资源配置

  • 批处理作业:根据数据量动态调整处理资源

  • 开发测试环境:频繁调整资源配置进行性能调优

不适用场景

  • 有状态应用的重要组件:数据库主节点等关键组件

  • 资源敏感应用:对资源变化敏感的实时系统

  • 短期任务:生命周期短暂的 Pod

调整策略配置

CPU 调整策略

CPU 资源通常可以不重启容器直接调整:

apiVersion: v1
kind: Pod
metadata:
  name: web-server
spec:
  containers:
  - name: nginx
    image: nginx:latest
    resources:
      requests:
        cpu: "100m"
        memory: "128Mi"
      limits:
        cpu: "500m"
        memory: "512Mi"
    resizePolicy:
    - resourceName: cpu
      restartPolicy: NotRequired  # CPU 调整不需要重启

内存调整策略

内存调整通常需要更谨慎的处理:

apiVersion: v1
kind: Pod
metadata:
  name: memory-app
spec:
  containers:
  - name: app
    image: my-app:latest
    resources:
      requests:
        memory: "256Mi"
      limits:
        memory: "1Gi"
    resizePolicy:
    - resourceName: memory
      restartPolicy: RestartContainer  # 内存调整可能需要重启

与 VPA 集成

配置 VPA 原地调整模式

apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
  name: web-app-vpa
spec:
  targetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: web-app
  updatePolicy:
    updateMode: "InPlace"  # 启用原地调整
    minReplicas: 1
  resourcePolicy:
    containerPolicies:
    - containerName: nginx
      mode: "Auto"
      minAllowed:
        cpu: "100m"
        memory: "128Mi"
      maxAllowed:
        cpu: "2000m"
        memory: "2Gi"
      # 控制调整频率
      controlledResources: ["cpu", "memory"]

VPA 原地调整监控

监控 VPA 的调整行为:

apiVersion: v1
kind: ServiceMonitor
metadata:
  name: vpa-inplace-metrics
spec:
  selector:
    matchLabels:
      app: vpa-recommender
  endpoints:
  - port: metrics
    path: /metrics
    interval: 30s

资源调整最佳实践

1. 渐进式调整

避免大幅度的资源变更,采用渐进式调整:

# 分步骤调整资源
kubectl patch pod my-app --subresource resize --type='merge' -p='
{
  "spec": {
    "containers": [{
      "name": "app",
      "resources": {
        "requests": {"cpu": "200m"},  # 从 100m 先调整到 200m
        "limits": {"cpu": "400m"}
      }
    }]
  }
}'

# 观察一段时间后再进一步调整
kubectl patch pod my-app --subresource resize --type='merge' -p='
{
  "spec": {
    "containers": [{
      "name": "app", 
      "resources": {
        "requests": {"cpu": "500m"},  # 进一步调整到目标值
        "limits": {"cpu": "1000m"}
      }
    }]
  }
}'

2. 资源调整验证

调整后验证 Pod 状态和性能:

# 检查调整状态
kubectl get pod my-app -o jsonpath='{.status.containerStatuses[0].resources}'

# 监控资源使用
kubectl top pod my-app

# 检查 Pod 事件
kubectl describe pod my-app | grep -A 10 Events

3. 回滚策略

准备资源调整的回滚方案:

# 保存原始配置
kubectl get pod my-app -o yaml > my-app-original.yaml

# 如需回滚,恢复原始资源配置
kubectl apply -f my-app-original.yaml --subresource resize

监控和告警

资源调整监控

创建 ServiceMonitor 监控资源调整事件:

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: pod-resize-monitor
spec:
  selector:
    matchLabels:
      app: kubelet
  endpoints:
  - port: https-metrics
    scheme: https
    path: /metrics
    bearerTokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token
    tlsConfig:
      insecureSkipVerify: true

告警规则

配置资源调整相关的告警:

apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
  name: pod-resize-alerts
spec:
  groups:
  - name: pod.resize
    rules:
    - alert: PodResizeFailure
      expr: increase(kubelet_pod_resize_failures_total[5m]) > 0
      for: 1m
      labels:
        severity: warning
      annotations:
        summary: "Pod 资源调整失败"
        description: "Pod {{ $labels.pod }} 在过去 5 分钟内发生资源调整失败"
    
    - alert: FrequentPodResize
      expr: increase(kubelet_pod_resize_total[1h]) > 10
      for: 5m
      labels:
        severity: info
      annotations:
        summary: "Pod 频繁调整资源"
        description: "Pod {{ $labels.pod }} 在过去 1 小时内调整资源超过 10 次"

性能考量

调整频率控制

避免过于频繁的资源调整:

apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
  name: controlled-vpa
spec:
  targetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: my-app
  updatePolicy:
    updateMode: "InPlace"
    # 控制最小调整间隔
    minReplicas: 1
    evictionPolicy:
      changeRequirement: 0.2  # 20% 的变化才触发调整
  resourcePolicy:
    containerPolicies:
    - containerName: app
      # 设置调整阈值
      minDiff:
        cpu: "50m"
        memory: "64Mi"

节点资源考量

确保节点有足够资源支持调整:

# 检查节点可用资源
kubectl describe nodes | grep -A 5 "Allocated resources"

# 监控节点资源压力
kubectl top nodes

使用 kube-advisor 检查应用程序问题

运行 kube-advisor 示例:

$ kubectl apply -f https://github.com/Azure/kube-advisor/raw/master/sa.yaml

$ kubectl run --rm -i -t kube-advisor --image=mcr.microsoft.com/aks/kubeadvisor --restart=Never --overrides="{ \"apiVersion\": \"v1\", \"spec\": { \"serviceAccountName\": \"kube-advisor\" } }"
If you don't see a command prompt, try pressing enter.
+--------------+-------------------------+----------------+-------------+--------------------------------+
|  NAMESPACE   |  POD NAME               | POD CPU/MEMORY | CONTAINER   |             ISSUE              |
+--------------+-------------------------+----------------+-------------+--------------------------------+
| default      | demo-58bcb96b46-9952m   | 0 / 41272Ki    | demo        | CPU Resource Limits Missing    |
+              +                         +                +             +--------------------------------+
|              |                         |                |             | Memory Resource Limits Missing |
+              +                         +                +             +--------------------------------+
|              |                         |                |             | CPU Request Limits Missing     |
+              +                         +                +             +--------------------------------+
|              |                         |                |             | Memory Request Limits Missing  |
+--------------+-------------------------+----------------+-------------+--------------------------------+

参考文档

上一页实践概览下一页集群高可用

最后更新于8天前

你可以定期运行 工具,检查应用程序的配置是否存在问题。

kube-advisor
https://github.com/Azure/kube-advisor
Best practices for application developers to manage resources in Azure Kubernetes Service