一、什么是资源配额

Kubernetes(简称k8s)资源配额是一种用于限制和管理集群中各个命名空间内资源使用的机制。它可以帮助确保在不同团队或用户之间公平地分配有限的集群资源,从而提高系统的稳定性和性能。

资源配额通过ResourceQuota对象定义,可以限定单个命名空间中可使用的计算资源的总量。限制的方式有:

  • 按对象类型限定命名空间中可创建的对象的总数。

  • 按对象类型限定命名空间中可消耗的计算资源。

资源配额的工作方式如下:

  • 不同的用户(团队)使用不同的命名空间。

  • 用户在命名空间中创建对象(如Pod、Service等),跟踪对象的资源使用情况,并确保不会超过定义的配额。

在使用资源配额时,需要注意以下几点:

  • 资源配额适用于命名空间级别,可以针对不同的命名空间设置不同的资源配额限制。

  • 资源配额可以限制CPU、内存等计算资源的使用,有助于避免资源过度消耗导致系统不稳定。

  • 可以通过LimitRange为没有定义requests、limits的对象强制添加默认值。

Kubernetes资源配额是一种有效的方法,用于管理和控制集群中的资源使用,确保资源在各个团队和用户之间得到合理分配。这有助于维护集群的稳定性和性能,同时有利于预测和规划资源需求。

二、CPU资源限制

如何实现

主要通过containter容器维度的resources选项实现,有两个子选项:

  • limits:用于限制运行时容器的最大占用资源,当容器占用资源超过limits时会被终止,并进行重启

  • requests :用于设置容器需要的最小资源,如果环境资源不够,容器将无法启动

接下来,编写一个测试案例,创建deploy-cpuresources.yaml

apiVersion: apps/v1 
kind: Deployment 
metadata:
  name: deploy-nginx
  namespace: test 
spec: # 详情描述
  replicas: 1
  selector: 
    matchLabels:      
      app: nginx-pod
  template: 
    metadata:
      labels:
        app: nginx-pod
    spec:
      containers:
      - name: nginx
        image: nginx:1.18
        ports:
        - containerPort: 80
#        resources: # 资源配额
#          limits:  # 限制资源(上限)
#            cpu: "2" # CPU限制,单位是core数
#          requests: # 请求资源(下限)
#            cpu: "1"  # CPU限制,单位是core数

在这对cpu和memory的单位做一个说明:

  • cpu:core数,可以为整数或小数

CPU 以核心为单位进行限制,单位可以是整核、浮点核心数或毫核(m/milli),简单来说加个后缀m代表千分之一:
2=2核心=200% 0.5=500m=50% 1.2=1200m=120%
​
整核:cpu: 2 表示2核,但是它不是说pod直接占用固定的2个核心,而是由系统从多个cpu核心间分配总数在200%左右的时间片(cpu通过时间片做上下文切换)给pod使用。
​
毫核:1000m = 1 100m = 0.1  10m = 0.01  15m = 0.015 

接下来,创建一个NodePort类型的service,以便暴露端口

kubectl expose deployment deploy-nginx -n test --port=80 --type=NodePort

定期查看cpu资源使用情况

# 查看k8s中test名称空间下的pod资源使用情况
kubectl top pod -n test
​
# 查看k8s中所有node的资源使用情况
kubectl top node 

使用postman进行http://masterip:暴露端口/的持续10000次访问,nginx模拟压测,继续观察上述cpu资源使用情况

根据压测情况,修改deploy-cpuresources.yaml的cpu限额,再重新运行一次postman一万次压测,看是否生效

三、内存资源限制

如何实现

主要通过容器维度的resources选项实现,有两个子选项:

  • limits:用于限制运行时容器的最大占用资源,当容器占用资源超过limits时会被终止,并进行重启

  • requests :用于设置容器需要的最小资源,如果环境资源不够,容器将无法启动

接下来,编写一个测试案例,创建deploy-memresources.yaml

apiVersion: apps/v1 
kind: Deployment 
metadata:
  name: deploy-nginx
  namespace: test 
spec: # 详情描述
  replicas: 1
  selector: 
    matchLabels:      
      app: nginx-pod
  template: 
    metadata:
      labels:
        app: nginx-pod
    spec:
      containers:
      - name: nginx
        image: nginx:1.18
        ports:
        - containerPort: 80
#        resources: # 资源配额
#          limits:  # 限制资源(上限)
#            memory: "10Gi" # 内存限制
#          requests: # 请求资源(下限)
#            memory: "10Gi" # 内存限制

在这对memory的单位做一个说明:

  • memory: 内存大小,可以使用Gi、Mi、G、M等形式

# 查看所在的工作节点node的内存消耗情况
kubectl top node
​
# 查看pod的内存消耗情况
kubectl top pod -n test
​
因为nginx的访问比较难消耗到内存资源,压测1w次时几乎占用内存资源无变化
因此通过修改memory的参数为"1Mi"
​
内存资源的基本单位是字节(byte)。k8s中可以使用这些后缀之一,将内存表示为 纯整数或定点整数:E、P、T、G、M、K、Ei、Pi、Ti、Gi、Mi、Ki。
1536Mi=1.5Gi 
​
在k8s中,"Mi"和"M"都是表示计算资源的单位。
"Mi"表示的是Mebibyte,是一种二进制单位,等于1024 * 1024字节,也就是1,048,576字节。Mi通常用于表示内存大小。
​
"M"表示的是Megabyte,是一种十进制单位,等于1,000,000字节。M通常用于表示存储大小。
​
简单来说:Mi表示(1Mi=1024x1024),M表示(1M=1000x1000)(其它单位类推, 如Ki/K Gi/G)
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐