• 【CKA考试笔记】十六、资源限制


    实验环境

    完成初始化集群的环境:
    (vms21)192.168.26.21——master1
    (vms22)192.168.26.22——worker1
    (vms23)192.168.26.23——worker2

    一、在pod里通过resources来限制

    pod的yaml文件中,spec.containers.resources下
    (1)可以使用requests来配置运行该容器的系统需求(若系统不满足要求,则pod运行不起来,一直处于Pending状态)
    例如:配置内存(memory)至少要10Gi、cpu至少要4000m(四核)

    ...
    spec:
      terminationGracePeriodSeconds: 0
      containers:
      - image: nginx
        imagePullPolicy: IfNotPresent
        name: pod1
        resources:
          requests:
            memory: 10Gi
            cpu: 4000m
      dnsPolicy: ClusterFirst
    ...
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    (2)可以使用limits配置该容器占用系统资源的限制
    例如:配置内存(memory)最多只能消耗500Mi

    ...
    spec:
      terminationGracePeriodSeconds: 0
      containers:
      - image: nginx
        imagePullPolicy: IfNotPresent
        name: pod1
        resources:
          limits:
            memory: 500Mi
      dnsPolicy: ClusterFirst
    ...
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    实验:
    (1)删除环境中之前创建的pod
    (2)使用centos镜像创建一个没有资源限制的pod
    若环境里没有centos镜像,先拉取
    worker1、worker2上拉取centos镜像

    nerdctl pull hub.c.163.com/library/centos
    
    • 1

    master上通过yaml来创建pod,创建一个没有资源限制的pod,yaml如下:

    apiVersion: v1
    kind: Pod
    metadata:
      creationTimestamp: null
      labels:
        run: pod1
      name: pod1
    spec:
      terminationGracePeriodSeconds: 0
      containers:
      - image: hub.c.163.com/library/centos
        command: ["sh","-c","sleep 1d"]
        imagePullPolicy: IfNotPresent
        name: pod1
        resources: {}
      dnsPolicy: ClusterFirst
      restartPolicy: Always
    status: {}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    创建这个pod

    kubectl apply -f pod1.yaml
    
    • 1

    (3)查看这个pod运行在哪个节点上

    kubectl get pods -o wide
    #输出:
    NAME   READY   STATUS    RESTARTS   AGE   IP             NODE            NOMINATED NODE   READINESS GATES
    pod1   1/1     Running   0          20s   10.244.70.67   vms23.rhce.cc   <none>           <none>
    
    • 1
    • 2
    • 3
    • 4

    (4)运行在vms23节点上,来到vms23查看这个pod对内存的消耗

    free -m
    
    #输出:
                  total        used        free      shared  buff/cache   available
    Mem:           3935         454        1882          17        1599        3148
    Swap:             0           0           0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    used=454,消耗了454兆内存
    (4)使用memload内存工具来进行进一步演示
    下载memload-7.0-1.r29766.x86_64.rpm软件包,传输至master上
    在master上,将memload-7.0-1.r29766.x86_64.rpm复制到pod1容器中/opt下

    kubectl cp memload-7.0-1.r29766.x86_64.rpm pod1:/opt/
    
    • 1

    进入容器,安装momload

    kubectl exec -it pod1 -- bash
    rpm -ivh /opt/memload-7.0-1.r29766.x86_64.rpm
    
    • 1
    • 2

    在容器中,使用memload命令

    #使容器增加消耗1Gi的内存
    memload 1000
    
    #vms23上查看内存消耗,此时内存占用增加了1Gi
    free -m
    #输出:
                  total        used        free      shared  buff/cache   available
    Mem:           3935        1440        1363          17        1131        2194
    Swap:             0           0           0
    
    #使容器增加消耗500Mi的内存
    memload 500
    
    #vms23上查看内存消耗,此时内存占用增加了500Mi
    free -m
    #输出:
                  total        used        free      shared  buff/cache   available
    Mem:           3935         935        1868          17        1131        2699
    Swap:             0           0           0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    从演示中证实,对于pod1占有系统资源并没有任何限制
    (5)现在删除pod1

    kubectl delete pods pod1
    
    • 1

    (6)修改pod1的yaml,配置resources.litmit资源限制,内存最多消耗500Mi
    yaml如下:

    apiVersion: v1
    kind: Pod
    metadata:
      creationTimestamp: null
      labels:
        run: pod1
      name: pod1
    spec:
      terminationGracePeriodSeconds: 0
      containers:
      - image: hub.c.163.com/library/centos
        command: ["sh","-c","sleep 1d"]
        imagePullPolicy: IfNotPresent
        name: pod1
        resources:
          limits:
            memory: 500Mi
      dnsPolicy: ClusterFirst
      restartPolicy: Always
    status: {}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    创建pod1

    kubectl apply -f pod1.yaml
    
    • 1

    (7)查看pod运行在哪个节点上

    kubectl get pods -o wide
    
    #输出:
    NAME   READY   STATUS    RESTARTS   AGE   IP           NODE            NOMINATED NODE   READINESS GATES
    pod1   1/1     Running   0          18s   10.244.7.5   vms22.rhce.cc   <none>           <none>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    (8)同样的,使用memload进行测试

    #master上复制momload安装包到容器中
    kubectl cp memload-7.0-1.r29766.x86_64.rpm pod1:/opt/
    
    #进入容器安装
    kubectl exec -it pod1 -- bash
    rpm -ivh /opt/memload-7.0-1.r29766.x86_64.rpm
    
    #使容器增加消耗200Mi的内存
    memload 200
    #vms22上查看内存消耗,此时内存占用增加了200Mi
    free -m
    #输出:
                  total        used        free      shared  buff/cache   available
    Mem:           3935         641        2169          17        1124        2995
    Swap:             0           0           0
    
    #使容器增加消耗500Mi的内存
    memload 500
    #此时就会内存溢出,进程被killed(OOM killed:out of memory killed)
    Attempting to allocate 500 Mebibytes of resident memory...
    Killed
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    二、通过limitrange来限制

    通过yaml创建limitrange
    mylimit.yaml如下:

    apiVersion: v1
    kind: LimitRange
    metadata:
      name: mylimit
    spec:
      limits:
      - max:
          memory: 1Gi
        min:
          memory: 512Mi
        type: Container
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    metadata下也可以配置命名空间namespace,不指定则默认当前命名空间
    (limitrange也是基于命名空间的,只对指定的命名空间有效)
    spec.limits下:
    max——配置最大的资源占用限制
    min——配置最低的系统需求
    type——可以配置基于容器(Container)或基于pod,若基于容器,那么假设一个容器的资源消耗限制是1Gi,那么一个pod中有两个容器(一个主容器、一个sidecar),这个pod的资源限制就是2Gi,若是基于pod,假设资源限制是1Gi,那么pod里所有的容器的资源消耗总和不得超过1Gi

    实验:
    (1)根据上述mylimit.yaml,创建这个limitrange

    kubectl apply -f mylimit.yaml
    
    • 1

    (2)查看limitrange列表,检查是否创建成功

    kubectl get limitrange
    
    #输出:
    NAME      CREATED AT
    mylimit   2022-08-17T04:05:11Z
    
    • 1
    • 2
    • 3
    • 4
    • 5

    (3)查看mylimit属性,可以查看最低资源需求和最高资源限制

    kubectl describe limitranges mylimit
    
    #输出:
    Name:       mylimit
    Namespace:  default
    Type        Resource  Min    Max  Default Request  Default Limit  Max Limit/Request Ratio
    ----        --------  ---    ---  ---------------  -------------  -----------------------
    Container   memory    512Mi  1Gi  1Gi              1Gi            -
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    (4)可以再次利用momload工具进行验证,在pod的yaml中不对resources作资源配置,此时,同一个命名空间下,pod的资源限制会根据mylimit中的设置
    (5)注意:
    若配置了limitrange,同时又在pod的yaml中通过resources配置资源限制,则resources下定义的值必须在limitrange定义的值的范围内,否则pod无法创建成功
    在这里插入图片描述

    三、通过resourcequota来限制

    resourcequota简称为quota——限制某个命名空间里,最多只能创建多少个资源

    通过yaml文件创建resourcequota

    apiVersion: v1
    kind: ResourceQuota
    metadata:
      name: myquota
    spec:
      hard:
        pods: "4"
        services: "3"
        configmaps: 3
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    spec.hard——硬限制,可以配置各种资源最多多少个(数字有没有引号都可),如上配置了pod最多4个、svc最多3个、configmaps最多3个

    实验:
    (1)创建如上yaml这个quota

    kubectl apply -f myquota.yaml
    
    • 1

    (2)查看resourcequota

    kubectl get resourcequota
    
    #输出:
    NAME      AGE   REQUEST                                     LIMIT
    myquota   6s    configmaps: 1/3, pods: 1/4, services: 1/3   
    
    • 1
    • 2
    • 3
    • 4
    • 5
  • 相关阅读:
    ubuntu22.04 配置共享文件夹 找不到/mnt/hgfs
    【无标题】
    Windows应急响应信息采集工具
    GD32_定时器输入捕获波形频率
    五年制专转本备考中如何进行有效的自我管理
    Kubernetes k8s 平台部署常用命令
    玩转Configmap配置应用的各种姿势
    VEX —— Functions|Conversion
    什么是DDoS攻击?怎么防御DDoS攻击?
    面试经典-Spring篇
  • 原文地址:https://blog.csdn.net/weixin_41755556/article/details/126228686