k8s 资源管理

文章目录

节点故障大部分都是由于资源分配不合理、超额分配引起的,因此需要用某个技术手段保证节点的资源不会过大地超额分配。Kubernetes为我们提供了开箱即用的资源管理,可以通过ResourceQuota和LimitRange的配合防止节点资源超额分配。

ResourceQuota

首先看一下ResourceQuota(资源配额)的使用,资源配额是限制某个命名空间对资源使用的一个总量限制,比如内存、CPU、Pod数量等。

什么是资源配额

在生产环境中,可能会有多个Kubernetes集群,面向开发环境、测试环境、预生产环境和生产环境等。身为Kubernetes管理员,必然知道每个环境的规模有多大、可调度资源有多少,并且知道如何合理地为容器分配内存和CPU,所以一个管理员去管理整个Kubernetes集群时,很少会有资源分配超出集群可调度范围的情况。

在生产环境中,可能会有多个Kubernetes集群,面向开发环境、测试环境、预生产环境和生产环境等。身为Kubernetes管理员,必然知道每个环境的规模有多大、可调度资源有多少,并且知道如何合理地为容器分配内存和CPU,所以一个管理员去管理整个Kubernetes集群时,很少会有资源分配超出集群可调度范围的情况。

为了解决上述问题,Kubernetes引入了ResourceQuota的概念,以方便Kubernetes管理员方便地进行资源分配,比如给A项目组分配16核64GB的资源,并且最多只能部署20个Pod、30个Service等,这样来对Kubernetes的各类资源进行限制。

定义一个ResourceQuota

和其他资源配置方法一样,资源配额也可以通过一个YAML文件进行创建,比如定义一个比较常用的ResourceQuota如下:

yml 复制代码
apiVersion: v1
kind: ResourceQuota
metadata:
  name: example-quota
  namespace: default
spec:
  hard:
    pods: "10"
    requests.cpu: "4"
    requests.memory: "10Gi"
    limits.cpu: "8"
    limits.memory: "20Gi"

在此配置中:

pods: "10" 限制命名空间中的 Pod 数量最多为 10 个。

requests.cpu: "4" 限制命名空间中所有 Pod 合计的 CPU 请求最多为 4 个 CPU。

requests.memory: "10Gi" 限制命名空间中所有 Pod 合计的内存请求最多为 10 GiB。

limits.cpu: "8" 限制命名空间中所有 Pod 合计的 CPU 使用量上限为 8 个 CPU。

limits.memory: "20Gi" 限制命名空间中所有 Pod 合计的内存使用量上限为 20 GiB。

ResourceQuota的使用

接下来演示ResourceQuota的具体使用方法,首先创建一个用于测试的Namespace:

sh 复制代码
kubectl create ns quota-example

创建一个测试Demo,比如限制该Namespace的PVC不能超过1个:

yml 复制代码
apiVersion: v1
kind: ResourceQuota
metadata:
  name: pvc-quota
  namespace: quota-example
spec:
  hard:
    persistentvolumeclaims: "1"

创建该ResourceQuota:

sh 复制代码
     kubectl create -f quota-objects.yaml

查看创建的资源限制状态:

sh 复制代码
kubectl get quota pvc-quota -n quota-example -o yaml

可以从status字段的used看出当前资源限制的使用量,并且Namespace只有在创建了ResourceQuota才会启用资源使用的配额,没有创建ResourceQuota的Namespace不限制资源使用。

之后创建一个PVC:

**touch pvc.yaml **

yml 复制代码
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc
  namespace: quota-example
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
  storageClassName: standard
sh 复制代码
kubectl create -f pvc.yaml -n quota-example

查看当前资源的使用情况:

sh 复制代码
kubectl get quota pvc-quota -n quota-example -o yaml

再次尝试创建PVC:

touch pvc2.yaml

sh 复制代码
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc2
  namespace: quota-example
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
  storageClassName: standard
sh 复制代码
kubectl create -f pvc2.yaml -n quota-example

可以看到此时无法创建PVC,其他资源的限制类似,在此不再演示。

环境清理:

sh 复制代码

LimitRange

和ResourceQuota不同的是,LimitRange用来配置默认值,也就是一个Pod如果没有配置要用多少内存、CPU,LimitRange会在创建Pod时添加一个默认值。

LimitRange的用途

每个命名空间的最大资源使用量,细心的读者可能会发现,如果创建了一个Pod或Deployment没有指定requests和limits字段,是不是就意味着资源配额对内存和CPU的限制变成了一个摆设?答案是可想而知的,CPU和内存永远不会被限制。还有另一种情况,假如一个Namespace分配了16核、64GB的空间,之后创建一个申请了requests.cpu为16、requests.memory为64GB的容器,那么单个Pod就能把整个Namespace的资源全部占用。

为了防止这类情况发生,Kubernetes又引出了另一个概念:LimitRanger,用于针对没有配置requests和limits的资源设置一个默认值,同时配置单个资源最大的requests和limits,这样就能解决上述问题(注意:LimitRanger不会影响已经创建的资源)​。

示例1:配置默认的requests和limits

可以通过LimitRanger配置默认的requests和limits值,用来解决创建的资源没有配置或配置过小的requests和limits带来的问题,比如创建一个requests.cpu默认为0.5(0.5为半颗CPU,1个CPU等于1000m)​、requests.memory为256MB、limits.cpu为1、limits.memory为512MB的LimitRanger(创建完成后可以通过kubectl get limitrange cpu-mem-limit-range -oyaml查看)​:

相关推荐
chuanauc5 分钟前
Kubernets K8s 学习
java·学习·kubernetes
一头生产的驴21 分钟前
java整合itext pdf实现自定义PDF文件格式导出
java·spring boot·pdf·itextpdf
YuTaoShao28 分钟前
【LeetCode 热题 100】73. 矩阵置零——(解法二)空间复杂度 O(1)
java·算法·leetcode·矩阵
zzywxc78731 分钟前
AI 正在深度重构软件开发的底层逻辑和全生命周期,从技术演进、流程重构和未来趋势三个维度进行系统性分析
java·大数据·开发语言·人工智能·spring
YuTaoShao3 小时前
【LeetCode 热题 100】56. 合并区间——排序+遍历
java·算法·leetcode·职场和发展
程序员张33 小时前
SpringBoot计时一次请求耗时
java·spring boot·后端
llwszx6 小时前
深入理解Java锁原理(一):偏向锁的设计原理与性能优化
java·spring··偏向锁
云泽野6 小时前
【Java|集合类】list遍历的6种方式
java·python·list
二进制person7 小时前
Java SE--方法的使用
java·开发语言·算法
小阳拱白菜8 小时前
java异常学习
java