k8s如何快速的查看deployment资源限制requests/limits

1.常用查看方式

1.1describe(最直接)

1
kubectl describe deployment <deployment-name>

输出中定位:

Containers:
  <container-name>:
    Limits:
      cpu:     500m
      memory:  256Mi

特点:

  • 人类可读性强
  • 适合排查
  • 不适合批量处理

1.2 jsonpath(推荐,结构化)

1
2
kubectl get deployment <deployment-name> \
-o jsonpath='{range .spec.template.spec.containers[*]}{.name}{"\t"}{.resources.limits.cpu}{"\t"}{.resources.limits.memory}{"\n"}{end}'

示例输出:

nginx   500m   256Mi

特点:

  • 精准提取
  • 适合脚本/SRE自动化

1.3 wide + custom-columns(批量友好)

1
2
3
4
kubectl get deployment \
-o custom-columns=NAME:.metadata.name,\
CPU_LIMIT:.spec.template.spec.containers[*].resources.limits.cpu,\
MEM_LIMIT:.spec.template.spec.containers[*].resources.limits.memory

输出:

NAME     CPU_LIMIT   MEM_LIMIT
nginx    500m        256Mi

特点:

  • 类似 get 体验
  • 适合巡检

1.4 查看所有 namespace

1
2
3
4
5
kubectl get deployment -A \
-o custom-columns=NS:.metadata.namespace,\
NAME:.metadata.name,\
CPU:.spec.template.spec.containers[*].resources.limits.cpu,\
MEM:.spec.template.spec.containers[*].resources.limits.memory

2.底层结构理解(关键)

Deployment → Pod → Container 关系:

graph TD
    A[Deployment] --> B[ReplicaSet]
    B --> C[Pod Template]
    C --> D[Pod]
    D --> E[Container]
    E --> F[Resources Limits/Requests]

核心点:

  • Deployment 本身没有资源限制
  • 资源限制属于 Pod Template → Container
  • kubectl get deployment 默认不会展开这一层

3.同时查看 requests + limits

1
2
3
4
5
6
kubectl get deployment \
-o custom-columns=NAME:.metadata.name,\
CPU_REQ:.spec.template.spec.containers[*].resources.requests.cpu,\
CPU_LIMIT:.spec.template.spec.containers[*].resources.limits.cpu,\
MEM_REQ:.spec.template.spec.containers[*].resources.requests.memory,\
MEM_LIMIT:.spec.template.spec.containers[*].resources.limits.memory

4.为什么要关注 limits

  • 防止 Node OOM
  • 控制资源隔离(QoS Class)
  • 避免 noisy neighbor

4.1快速审计未设置 limits 的 Deployment

1
2
3
4
kubectl get deployment -A -o json | jq -r '
.items[] |
select(.spec.template.spec.containers[].resources.limits == null) |
.metadata.namespace + "/" + .metadata.name'