Kubernetes 中的资源(Resource)配置是管理容器资源分配的核心机制,主要用于控制 CPU 和内存的使用。合理配置资源可以优化集群性能、避免资源争抢,并确保应用稳定性。以下是详细的介绍:
1. 资源类型
Kubernetes 支持两种核心资源类型:
- CPU
单位为毫核(millicores),例如100m表示 0.1 个 CPU 核心,1表示 1 个完整的 CPU 核心。 - 内存
单位可以是字节(B)、千字节(Ki)、兆字节(Mi)、吉字节(Gi)等,例如256Mi表示 256 MiB。
2. 资源声明字段
在 Pod 的容器配置中,通过 resources 字段定义资源请求和限制:
apiVersion: v1
kind: Pod
metadata:
name: example-pod
spec:
containers:
- name: app-container
image: nginx
resources:
requests: # 资源请求(最低保障)
cpu: "100m"
memory: "128Mi"
limits: # 资源上限(不可超额使用)
cpu: "200m"
memory: "256Mi"
2.1 requests(资源请求)
- 定义容器启动时所需的最小资源。
- Kubernetes 调度器根据
requests选择满足条件的节点。 - 若节点资源不足,Pod 会处于
Pending状态。 - 用途:确保容器有基本资源保障。
2.2 limits(资源限制)
- 定义容器最大可用的资源。
- 超过
limits的 CPU 会被限流(Throttled),内存超限则容器可能被终止(OOMKilled)。 - 用途:防止单个容器耗尽节点资源。
3. 资源服务质量(QoS Classes)
根据资源配置,Kubernetes 为 Pod 分配不同的 QoS 等级,影响资源不足时的驱逐优先级:
| QoS 等级 | 条件 | 驱逐优先级 |
|---|---|---|
| Guaranteed | 所有容器的 requests 和 limits 相等(且显式设置 CPU 和内存)。 | 最低 |
| Burstable | 至少一个容器的 requests < limits(或仅设置 requests)。 | 中等 |
| BestEffort | 未设置任何 requests 或 limits。 | 最高 |
4. 资源配额(ResourceQuota)
在命名空间级别限制资源总量,防止资源滥用:
apiVersion: v1
kind: ResourceQuota
metadata:
name: example-quota
namespace: dev
spec:
hard:
requests.cpu: "1" # 所有 Pod 的 CPU 请求总和不超过 1 核
requests.memory: 1Gi # 内存请求总和不超过 1 GiB
limits.cpu: "2" # CPU 限制总和不超过 2 核
limits.memory: 2Gi # 内存限制总和不超过 2 GiB
pods: "10" # 命名空间最多 10 个 Pod
5. 限制范围(LimitRange)
为命名空间中的容器设置默认资源限制和合法范围:
apiVersion: v1
kind: LimitRange
metadata:
name: example-limitrange
namespace: dev
spec:
limits:
- type: Container
default: # 默认的 limits(若未显式设置)
cpu: "100m"
memory: "256Mi"
defaultRequest: # 默认的 requests(若未显式设置)
cpu: "50m"
memory: "128Mi"
max: # 最大值
cpu: "500m"
memory: "1Gi"
min: # 最小值
cpu: "10m"
memory: "64Mi"
6. 监控与调优
- 查看资源使用情况
kubectl top pods # 查看 Pod 资源使用 kubectl top nodes # 查看节点资源使用 - Horizontal Pod Autoscaler (HPA)
根据 CPU/内存使用率自动扩缩 Pod 数量: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
7. 最佳实践
- 合理设置
requests和limitsrequests应接近容器的平均使用量。limits可根据峰值负载设置,但避免过高。
- 优先使用
GuaranteedQoS
确保关键服务的稳定性。 - 监控资源使用
使用 Prometheus + Grafana 或 Kubernetes Dashboard 持续观察。 - 避免内存超限
内存无弹性,超限会导致容器重启。
通过合理配置资源,可以显著提高 Kubernetes 集群的稳定性和资源利用率。建议结合应用实际负载进行压测,逐步优化参数。