Kubernetes学习总结(8)—— Kubernetes Pod 资源管理 和 Pod 服务质量
发布日期:2025-04-03 07:25:32 浏览次数:9 分类:精选文章

本文共 3770 字,大约阅读时间需要 12 分钟。

一、Pod资源管理

1.1 resource的定义

容器运行过程中需要分配所需的资源,与CGGroup联动配合实现资源分配。资源的分配单位是CPU和内存,主要通过两种定义方式:requests和limits。

  • requests:表示请求资源,用于初始Kubernetes调度Pod时的依据,表示必须满足的分配资源。
  • limits:表示资源的限制,Pod不能超过这个限制值,超出的部分会通过CGGroup限制,确保资源使用不超出预定范围。

Pod中可以通过以下四个字段定义资源:

  • spec.container[].resources.requests.cpu:请求CPU资源大小,如0.1个CPU或100m表示分配1/10个CPU;
  • spec.container[].resources.requests.memory:请求内存大小,单位可用Mi、Gi等;
  • spec.container[].resources.limits.cpu:限制CPU使用大小,不能超过阀值;
  • spec.container[].resources.limits.memory:限制内存使用大小,超过会导致OOM(出内存)。
  • 以nginx-demo为例,定义一个Pod请求250m CPU资源,限制500m;请求128Mi内存,限制256Mi:

    apiVersion: v1kind: Podmetadata:  name: nginx-demo  labels:    name: nginx-demospec:  containers:  - name: nginx-demo    image: nginx:1.7.9    imagePullPolicy: IfNotPresent    ports:    - name: nginx-port-80      protocol: TCP      containerPort: 80    resources:      requests:        cpu: 250m        memory: 128Mi      limits:        cpu: 500m        memory: 256Mi

    1.2 配置定义

    如果已经存在Pod,先将其删除:

    kubectl delete pod nginx-demo

    或者定义一个新的Pod名称。应用YAML文件:

    kubectl apply -f nginx-resource.yaml

    1.3 资源分配详情

    查看Pod的资源分配情况:

    kubectl get pods

    查看Pod详细信息:

    kubectl describe pods nginx-demo

    1.4 资源测试

    通过stress镜像测试CPU资源:

    apiVersion: v1kind: Podmetadata:  name: cpu-demo  annotations:    kubernetes.io/description: "demo for cpu requests and"spec:  containers:  - name: stress-cpu    image: vish/stress    resources:      requests:        cpu: 250m      limits:        cpu: 500m    args: ["-cpus", "1"]

    创建Pod并查看资源使用情况:

    kubectl apply -f cpu-demo.yaml

    1.5 内存测试

    定义memory-demo.yaml限制内存为512Mi,使用stress镜像压侧256Mi:

    apiVersion: v1kind: Podmetadata:  name: memoryDemo  annotations:    kubernetes.io/description: "stress demo for memory limits"spec:  containers:  - name: memory-stress-limits    image: polinux/stress    resources:      requests:        memory: 128Mi      limits:        memory: 512Mi    command: ["stress"]    args: ["--vm", "1", "--vm-bytes", "256M", "--vm-hang", "1"]

    应用并查看状态:

    kubectl apply -f memory-demo.yaml

    二、Pod服务质量

    服务质量(QoS)为Pod调度和驱逐提供参考因素,无外乎三种QoS类型:

  • BestEffort(尽最大努力):默认服务质量,优先级最低,资源分配灵活;
  • Burstable(可波动):提供资源保障,requests资源要求固定,不能超过limits;
  • Guaranteed(完全保障):资源数量与requests和limits相同,优先级最高。
  • 2.1 BestEffort服务质量

    默认服务质量,无需额外定义:

    apiVersion: v1kind: Podmetadata:  name: nginx-qos-besteffort  labels:    name: nginx-qos-besteffortspec:  containers:  - name: nginx-qos-besteffort    image: nginx:1.7.9    imagePullPolicy: IfNotPresent    ports:    - name: nginx-port-80      protocol: TCP      containerPort: 80    resources: {}

    创建Pod并查看QoS类型:

    kubectl apply -f nginx-qos-besteffort.yaml

    2.2 Burstable服务质量

    定义一个可波动的Pod:

    apiVersion: v1kind: Podmetadata:  name: nginx-qos-burstable  labels:    name: nginx-qos-burstablespec:  containers:  - name: nginx-qos-burstable    image: nginx:1.7.9    imagePullPolicy: IfNotPresent    ports:    - name: nginx-port-80      protocol: TCP      containerPort: 80    resources:      requests:        cpu: 100m        memory: 128Mi      limits:        cpu: 200m        memory: 256Mi

    应用并查看QoS类型:

    kubectl apply -f nginx-qos-burstable.yaml

    2.3 Guaranteed服务质量

    定义一个完全保障的Pod:

    apiVersion: v1kind: Podmetadata:  name: nginx-qos-guaranteed  labels:    name: nginx-qos-guaranteedspec:  containers:  - name: nginx-qos-guaranteed    image: nginx:1.7.9    imagePullPolicy: IfNotPresent    ports:    - name: nginx-port-80      protocol: TCP      containerPort: 80    resources:      requests:        cpu: 200m        memory: 256Mi      limits:        cpu: 200m        memory: 256Mi

    创建Pod并查看QoS类型:

    kubectl apply -f nginx-qos-guaranteed.yaml

    2.4 QoS策略

    更高服务质量的Pod优先级更高,调度和驱逐时给予更高优先级。

    总结

  • 资源定义建议

    • limits和requests建议保持1:2比例,避免过多资源分配争抢;
    • 推荐在namespace层面定义一个limitrange,确保Pod能分配到资源;
    • 在节点上设置保留资源:
      --system-reserved=cpu=200m,memory=1G

      驱逐策略:

      --eviction-hard=memory.available<500Mi
  • 服务质量优先级:从高到低为Guaranteed > Burstable > BestEffort。

  • 上一篇:Kubernetes学习总结(9)—— 基础架构的未来是 K8s,那么 K8s 的未来在何方?
    下一篇:Kubernetes学习总结(7)——学习 Kubernetes 的 Pod

    发表评论

    最新留言

    留言是一种美德,欢迎回访!
    [***.207.175.100]2025年04月28日 23时14分05秒

    关于作者

        喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
    -- 愿君每日到此一游!

    推荐文章

    Kubernetes原生的CICD工具Tekton详解 2023-01-29
    Kubernetes多master节点高可用集群安装 2023-01-29
    Kubernetes存储之Persistent Volumes简介 2023-01-29
    Kubernetes学习总结(10)—— 何为云原生,与 kubernetes 是什么关系 2023-01-29
    Kubernetes学习总结(11)—— Kubernetes Pod 到底是什么? 2023-01-29
    Kubernetes学习总结(12)—— 学习 kubernetes 的10个技巧或建议 2023-01-29
    Kubernetes学习总结(13)—— Kubernetes 各个组件的概念 2023-01-29
    Kubernetes学习总结(14)—— Kubernetes 实用命令总结 2023-01-29
    Kubernetes学习总结(15)—— Kubernetes 实战之部署 Mysql 集群 2023-01-29
    Kubernetes学习总结(16)—— Kubernetes 实战之部署 Redis 集群 2023-01-29
    Kubernetes学习总结(17)—— Kubernetes 快速入门需要掌握的知识点总结 2023-01-29
    Kubernetes学习总结(18)—— Kubernetes 容器网络 2023-01-29
    Kubernetes学习总结(1)——Kubernetes入门简介 2023-01-29
    Kubernetes学习总结(2)——Kubernetes设计架构 2023-01-29
    Kubernetes学习总结(3)——一年时间打造全球最大规模之一的Kubernetes集群,蚂蚁金服怎么做到的? 2023-01-29
    Kubernetes学习总结(4)——Kubernetes v1.20 重磅发布 | 新版本核心主题 & 主要变化解读 2023-01-29
    Kubernetes学习总结(5)——Kubernetes 常见面试题汇总 2023-01-29
    Kubernetes学习总结(6)——Kubernetes 7周年:它为什么如此受欢迎? 2023-01-29
    Kubernetes学习总结(7)——学习 Kubernetes 的 Pod 2023-01-29
    Kubernetes学习总结(8)—— Kubernetes Pod 资源管理 和 Pod 服务质量 2023-01-29