K8s的资源限制


1 https://kubernetes.io/zh/docs/tasks/configure-pod-container/assign-cpu-resource/
2 https://kubernetes.io/zh/docs/tasks/configure-pod-container/assign-memory-resource/

### 名称空间的限制管理
https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/manage-resources/

k8s采用request和limit两种限制类型来对资源进行分配

  • request(资源需求):即运行pod的节点必须满足运行pod的最基本需求才能运行pod。
  • limit(资源限制):即运行pod期间,可能内存使用量会增加,那最多能使用多少内存,这就是资源限额。

资源类型:

  • CPU的单位是核心数,内存的单位是字节。
  • 一个容器申请0.5各CPU,就相当于申请1个CPU的一半,可以加个后缀m表示千分之一的概念。比如说100m的CPU,100豪的CPU和0.1个CPU都是一样的。

内存单位:

  • K,M,G,T,P,E #通常是以1000为换算标准的。
  • Ki,Mi,Gi,Ti,Pi,Ei #通常是以1024为换算标准的。

内存资源限制实例

resources:  
  requests :节点所需的最小计算资源量,k8s调度的时候的依据值
  limits :限制允许的最大计算资源量,真正的资源限制参数
apiVersion: v1                     # 指定Pod资源使用的API版本
kind: Pod                          # 定义资源类型,这里是Pod
metadata:                           # 包含Pod的元数据
  name: memory-demo                # Pod的名称
spec:                               # Pod的规格定义
  containers:                       # 容器部分
    - name: memory-demo            # 容器的名称
      image: polinux/stress        # 使用的容器镜像,这里是stress工具
      args:                        # 传递给容器的命令行参数
      - --vm                       # 启用虚拟内存
      - "1"                        # 启动一个虚拟内存实例
      - --vm-bytes                 # 指定虚拟内存的大小
      - 200M                       # 设置虚拟内存为200MB
      resources:                   # 定义资源请求和限制
        requests:                  # 请求的资源量
          memory: 50Mi            # 请求50Mi的内存
        limits:                    # 资源限制
          memory: 100Mi           # 限制最大使用100Mi的内存

----------------------------------------------------------------------------------------
 apiVersion: v1
 kind: Pod
 metadata:
   name: memory-demo
 spec:
   containers:
   - name: memory-demo-ctr
     image: polinux/stress
     resources:
       limits:
         memory: "100Mi"
       requests:
         memory: "50Mi"
     command: ["stress"]
     args: ["--vm", "1", "--vm-bytes", "150M", "--vm-hang", "1"]
#### 内存做了限制 无法启动 被oomkilled
[root@master resou]# kubectl get pod 
NAME          READY   STATUS              RESTARTS   AGE
memory-demo   0/1     ContainerCreating   0          4s
[root@master resou]# kubectl get pod 
NAME          READY   STATUS      RESTARTS   AGE
memory-demo   0/1     OOMKilled   0          6s

### ############ 修改
     resources:
       limits:
         memory: "80M"
       requests:
         memory: "50M"
     command: ["stress"]
     args: ["--vm", "1", "--vm-bytes", "70M", "--vm-hang", "1"]
-- # 正常运行     
[root@master resou]# kubectl get pod 
NAME          READY   STATUS              RESTARTS   AGE
memory-demo   0/1     ContainerCreating   0          4s
[root@master resou]# kubectl get pod 
NAME          READY   STATUS    RESTARTS   AGE
memory-demo   1/1     Running   0          5s
 

CPU资源限制

node01 物理机双核
 apiVersion: v1
 kind: Pod
 metadata:
   name: cpu-demo
 spec:
   containers:
   - name: cpu-demo-ctr
     image: vish/stress
     resources:
       limits:
         cpu: "1"
       requests:
         cpu: "0.5"
     args:
     - -cpus
     - "2"
     
## 配置文件的 args 部分提供了容器启动时的参数。-cpus “2”参数告诉容器尝试使用 2 个 CPU。
[root@master resou]# kubectl top node
NAME     CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%   
master   137m         6%     1163Mi          61%       
node01   1031m        51%    861Mi           45%      ### 使用了一个cpu 
node02   31m          1%     691Mi           36%       
node03   40m          2%     1264Mi          33%       

[root@master resou]# kubectl get pod -owide
NAME       READY   STATUS    RESTARTS   AGE   IP          NODE     NOMINATED NODE   READINESS GATES
cpu-demo   1/1     Running   0          66s   10.2.1.23   node01   <none>           <none>

### 将cpu 限制在1核心 
[root@master resou]# kubectl top pod
NAME       CPU(cores)   MEMORY(bytes)   
cpu-demo   1000m        0Mi