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查看)​:

相关推荐
雷神乐乐13 分钟前
File.separator与File.separatorChar的区别
java·路径分隔符
小刘|17 分钟前
《Java 实现希尔排序:原理剖析与代码详解》
java·算法·排序算法
逊嘘36 分钟前
【Java语言】抽象类与接口
java·开发语言·jvm
morris13143 分钟前
【SpringBoot】Xss的常见攻击方式与防御手段
java·spring boot·xss·csp
七星静香1 小时前
laravel chunkById 分块查询 使用时的问题
java·前端·laravel
Jacob程序员1 小时前
java导出word文件(手绘)
java·开发语言·word
ZHOUPUYU1 小时前
IntelliJ IDEA超详细下载安装教程(附安装包)
java·ide·intellij-idea
stewie61 小时前
在IDEA中使用Git
java·git
Elaine2023911 小时前
06 网络编程基础
java·网络
G丶AEOM1 小时前
分布式——BASE理论
java·分布式·八股