在Kubernetes中分配和管理CPU和内存资源可能很棘手,但也很容易。本文,我将向你展示什么是Kubernetes资源和限制以及如何管理它们。
本文的目标是简单–如何帮助你快速调整项目中的Kubernetes资源信息,主要通过三种方式:
1. 为容器和 Pod 分配CPU和内存资源
2. Resources Quota: 限制namespace的资源消耗
3. Limit Ranges:配置默认的CPU请求和限制
为容器和 Pod 分配CPU和内存资源
下图,解释了Kubernetes资源的度量单位,资源状态工作流以及如何使用资源限制。
CPU和内存单位
Kubernetes 中的一个 cpu 等于:
1 AWS vCPU
1 GCP Core
1 Azure vCore
1 Hyperthread 在带有超线程的裸机 Intel 处理器上
以下,Deployment使用了内存资源和CPU资源的请求和限制
将CPU和内存 请求 (request)和内存 限制 (limit)分配给一个容器。
apiVersion: apps/v1
kind: Deployment
metadata:
name: aks-application
spec:
replicas: 1
selector:
matchLabels:
app: aks-application
template:
metadata:
labels:
app: aks-application
spec:
containers:
- name: aks-application
image: hubname/aks-application-image:1.0.0
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 250m
memory: 256Mi
更详细的信息和代码段:
-
将内存资源分配给容器和Pod
-
将CPU资源分配给容器和Pod
-
Kubernetes最佳实践资源要求和限制
-
应用程序开发人员在Azure Kubernetes Service(AKS)中管理资源的最佳实践
Resources Quota: 限制namespace的资源消耗
资源配额,通过 ResourceQuota 对象来定义,对每个namespace的资源消耗总量提供限制。它可以限制namespace中某种类型的对象的总数目上限,也可以限制命令空间中的 Pod 可以使用的计算资源的总上限。
资源配额的工作方式如下:
不同的团队可以在不同的namespace下工作,目前这是非约束性的,在未来的版本中可能会通过 ACL (Access Control List 访问控制列表) 来实现强制性约束。
集群管理员可以为每个namespace创建一个或多个 ResourceQuota 对象。
当用户在namespace下创建资源(如 Pod、Service 等)时,Kubernetes 的配额系统会 跟踪集群的资源使用情况,以确保使用的资源用量不超过 ResourceQuota 中定义的硬性资源限额。
如果资源创建或者更新请求违反了配额约束,那么该请求会报错(HTTP 403 FORBIDDEN), 并在消息中给出有可能违反的约束。
如果namespace下的计算资源 (如 cpu 和 memory)的配额被启用,则用户必须为 这些资源设定请求值(request)和约束值(limit),否则配额系统将拒绝 Pod 的创建。 提示: 可使用 LimitRanger 准入控制器来为没有设置计算资源需求的 Pod 设置默认值。
以下,是对持久卷声明和namespace资源的配额定义。
apiVersion: v1
kind: ResourceQuota
metadata:
name: backend-storage-quota
spec:
hard:
persistentvolumeclaims: "2"
requests.storage: "1Gi"
--
apiVersion: v1
kind: ResourceQuota
metadata:
name: backend-namespace-quota
spec:
hard:
request.cpu: 400m
request.memory: 9600Mi
limits.cpu: 1200m
limits.memory: 11600Mi
你可以使用该kubectl apply命令来设置namespace的配额限制。
kubectl apply -f resource-quota.yaml — namespace backend
如何使用配额的详细说明,请参考
-
https://kubernetes.io/docs/concepts/policy/resource-quotas/
Limit Ranges:配置默认的CPU请求和限制
如果你的namespace有资源配额,那么默认内存限制是很有帮助的。
将 LimitRange 添加到namespace,不仅会限制cpu和内存,还会为存储请求大小强制设置最小值和最大值。存储是通过 PersistentVolumeClaim 来发起请求的。执行限制范围控制的准入控制器会拒绝任何高于或低于管理员所设阈值的 PVC。
apiVersion: v1
kind: LimitRange
metadata:
name: backend-limit-range
spec:
limits:
- default:
memory: 110Mi
cpu: 500m
defaultRequest:
memory: 20Mi
cpu: 100m
type: Container
--
apiVersion: v1
kind: LimitRange
metadata:
name: backend-storage-limits
spec:
limits:
- type: PersistentVolumeClaim
max:
storage: 5Gi
min:
storage: 2Gi
更详细的信息和代码段。
-
为namespace配置默认的 CPU 请求和限制
-
限制名称空间的存储使用量
-
Kubernetes中的 Limit Range
工具:管理Kubernetes的CPU和内存
-
Popeye 会扫描集群中是否存在与配置,资源和网络漏洞有关的问题,并生成有关所有问题的详细报告。
-
Goldilocks 扫描Pod中的资源限制,并使用建议的资源创建报告。
-
Kube-advisor 来自Azure团队的工具,可扫描容器中缺少的资源并限制请求。
-
K9s+benchmark 提供了一个命令行界面(CLI),使你可以轻松地管理,监视甚至对 你喜欢的终端软件中的集群进行基准测试
你还可以将这些工具与 Datadog, Grafana + Prometeus,Azure Monitor结合使用,以改善资源并限制监视。
总结
-
设置资源请求:获取有关特定应用程序/容器的CPU和内存使用情况的信息。
-
设置资源限制:运行负载测试以检测高负载下容器的CPU和内存。
-
监视容器的CPU和内存使用情况。
-
监视持久卷使用情况。
-
检查是否可以使用Limit Range应用资源限制
-
使用配额(不建议在生产环境中应用配额)