kubernetesのステップアップ--リソースの制限


k 8 s容器資源制限
  • Kubernetesはrequestとlimitの2つの制限タイプを使用してリソースを割り当てます.
  • request(リソース要件):リソースの下限.すなわち、Podを実行するノードは、Podを実行するための最も基本的な要件を満たさなければならない.
  • limit(リソース限度):つまり、Podを実行している間にメモリの使用量が増加する可能性があります.それは、最大どれだけのメモリが使用できるか、これがリソース限度です.

  • リソースタイプ:
  • CPUの単位はコア数、メモリの単位はバイトです.
  • コンテナで0.5個のCPUを申請すると、1個のCPUを申請する半分に相当し、接尾辞mを付けて千分の1の概念を表すこともできます.例えば100 mのCPU、100ミリのCPU、0.1個のCPUは同じです.
  • メモリ単位:
  • K、M、G、T、P、E#は通常1000を換算基準とする.
  • Ki,Mi,Gi,Ti,Pi,Ei#は通常1024を換算基準とする.


  • 例:
    [root@server2 ~]# vim demo.yml
    
    apiVersion: v1
    kind: Pod
    metadata:
      name: memory-demo
    spec:
      containers:
      - name: memory-demo
        image: stress
        args:
        - --vm			
        - "1"		/    worker
        - --vm-bytes
        - 200M			/  3200M  
        resources:
          requests:
            memory: 50Mi		/  50Mi
          limits:
            memory: 100Mi		/  100Mi
    

    このpodは明らかに起きられない.200 Mのメモリを消費するため、最大値は100 Mに設定されている.
    [root@server2 ~]# kubectl apply -f demo.yml 
    kubec	getpod/memory-demo created
    
    [root@server2 ~]# kubectl get pod -w
    NAME          READY   STATUS      RESTARTS   AGE
    memory-demo   0/1     OOMKilled   1          5s
    memory-demo   0/1     CrashLoopBackOff   1          5s
    memory-demo   0/1     OOMKilled          2          19s
    memory-demo   0/1     CrashLoopBackOff   2          20s
    

    起動に失敗しました.
    [root@server2 ~]# kubectl delete pod memory-demo  
    pod "memory-demo" deleted
    [root@server2 ~]# vim demo.yml 
        resources:
          requests:
            memory: 50Mi		/  50Mi
          limits:
            memory: 300Mi		/    300Mi
    [root@server2 ~]# kubectl apply -f demo.yml 
    pod/memory-demo created
    [root@server2 ~]# kubectl get pod
    NAME          READY   STATUS    RESTARTS   AGE
    memory-demo   1/1     Running   0          6s
          
    
    cpu
    [root@server2 ~]# vim demo.yml 
    apiVersion: v1
    kind: Pod
    metadata:
      name: memory-demo
    spec:
      containers:
      - name: memory-demo
        image: stress
        args:
        - -c
        - "2"
        resources:
          requests:
            memory: 50Mi
            cpu: 5
          limits:
            memory: 100Mi
            cpu: 10
    [root@server2 ~]# kubectl apply -f demo.yml 
    kpod/memory-demo created
    [root@server2 ~]# kubectl get pod -w
    NAME          READY   STATUS    RESTARTS   AGE
    memory-demo   0/1     Pending   0          3s
    
    
    [root@server2 ~]# kubectl describe pod memory-demo
    Events:
      Type     Reason            Age        From               Message
      ----     ------            ----       ----               -------
      Warning  FailedScheduling    default-scheduler  0/3 nodes are available: 3 Insufficient cpu.
    

    スケジューリングに失敗するのは、申請するCPUリソースがクラスタノードが提供できるリソースを超えているためであるが、CPUの使用率が高すぎて殺すことはない. namespace :もし私たちがリストを書くたびに制限をしなければならないならば、面倒で、私たちはネーミングスペースで制限をして、私たちの使用を便利にすることができます.
    [root@server2 ~]# vim limit.yml
    apiVersion: v1
    kind: LimitRange
    metadata:
      name: limitrange-memory
    spec:
      limits:
      - default:			/     
          cpu: 0.5
          memory: 512Mi
        defaultRequest:		/       
          cpu: 0.1
          memory: 256Mi
        max:			/  
          cpu: 1
          memory: 1Gi
        min: 			/  
          cpu: 0.1
          memory: 100Mi
        type: Container
    [root@server2 ~]# kubectl apply -f limit.yml 
    limitrange/limitrange-memory created
    [root@server2 ~]# kubectl describe limitranges limitrange-memory 
    Name:       limitrange-memory
    Namespace:  default
    Type        Resource  Min    Max  Default Request  Default Limit  Max Limit/Request Ratio
    ----        --------  ---    ---  ---------------  -------------  -----------------------
    Container   cpu       100m   1    100m             500m           -
    Container   memory    100Mi  1Gi  256Mi            512Mi          -
    
    [root@server2 ~]# vim demo.yml 
    
    apiVersion: v1
    kind: Pod
    metadata:
      name: memory-demo
    spec:
      containers:
      - name: memory-demo
        image: myapp:v1
        resources:
          requests:
            memory: 50Mi		/  min     
            cpu: 1
          limits:
            memory: 300Mi
            cpu: 10			/   max
    [root@server2 ~]# kubectl apply -f  demo.yml 
    Error from server (Forbidden): error when creating "demo.yml": pods "memory-demo" is forbidden: [minimum memory usage per Container is 100Mi, but request is 50Mi, maximum cpu usage per Container is 1, but limit is 10]
        .
    
    [root@server2 ~]# vim demo.yml 
    apiVersion: v1
    kind: Pod
    metadata:
      name: memory-demo
    spec:
      containers:
      - name: memory-demo
        image: myapp:v1
        resources:
          requests:
            memory: 100Mi
            cpu: 0.1
          limits:
            memory: 300Mi
            cpu: 1
    
    [root@server2 ~]# kubectl  get pod
    NAME          READY   STATUS    RESTARTS   AGE
    memory-demo   1/1     Running   0          14s
    

    該当するサイズを設定すれば実行できる.
    定義しない場合は、ネーミングスペースのデフォルトの制限が使用されます.
    [root@server2 ~]# cat demo.yml 
    apiVersion: v1
    kind: Pod
    metadata:
      name: memory-demo
    spec:
      containers:
      - name: memory-demo
        image: myapp:v1
    #    resources:
    #      requests:
    #        memory: 100Mi
    #        cpu: 0.1
    #      limits:
    #        memory: 300Mi
    #        cpu: 1
    [root@server2 ~]# kubectl apply -f demo.yml 
    pod/memory-demo created
    [root@server2 ~]# kubectl get pod
    NAME          READY   STATUS    RESTARTS   AGE
    memory-demo   1/1     Running   0          20s
    [root@server2 ~]# kubectl describe pod memory-demo
    
        Limits:
          cpu:     500m
          memory:  512Mi
        Requests:
          cpu:        100m
          memory:     256Mi
                      .
    

    LimitRangeがnamespaceに適用する最小および最大メモリ制限は、Podの作成および更新時にのみ適用されます.LimitRangeの変更は、以前に作成したPodには影響しません. namespace
    リソース割当はcpuやmemのみでなくpod,secret,rs,pvc,cmなどを制限することもできる.
    [root@server2 ~]# cat quota.yml 
    apiVersion: v1
    kind: ResourceQuota
    metadata:
      name: mem-cpu-demo
    spec:
      hard:
        requests.cpu: "1"
        requests.memory: 1Gi
        limits.cpu: "2"
        limits.memory: 2Gi
    [root@server2 ~]# kubectl apply -f quota.yml 
    resourcequota/mem-cpu-demo created
    [root@server2 ~]# kubectl get resourcequotas 
    NAME           AGE   REQUEST                                            LIMIT
    mem-cpu-demo   7s    requests.cpu: 100m/1, requests.memory: 256Mi/1Gi   limits.cpu: 500m/2, limits.memory: 512Mi/2Gi
    [root@server2 ~]# kubectl describe resourcequotas mem-cpu-demo 
    Name:            mem-cpu-demo
    Namespace:       default
    Resource         Used   Hard
    --------         ----   ----
    limits.cpu       500m   2
    limits.memory    512Mi  2Gi
    requests.cpu     100m   1
    requests.memory  256Mi  1Gi
    
    

    割当の役割:
  • で作成されたResourceQuotaオブジェクトには、defaultネームスペースに次の制限が追加されます.
  • 各コンテナは、メモリ要求(memory request)、メモリ限度額(memorylimit)、cpu要求(cpu request)、およびcpu限度額(cpu limit)を設定する必要があります.
  • 全ての容器のメモリ要求総額は1 GiBを超えてはならない.
  • 全ての容器のメモリ限度額総額は2 GiBを超えてはならない.
  • 全ての容器のCPU要求総額は1 CPUを超えてはならない.
  • 全ての容器のCPU限度額総額は2 CPUを超えてはならない.

  • kubec	[root@server2 ~]# kubectl delete limitranges limitrange-memory 		/       
    limitrange "limitrange-memory" deleted
    [root@server2 ~]# kubectl apply -f demo.yml 
    Error from server (Forbidden): error when creating "demo.yml": pods "memory-demo" is forbidden: failed quota: mem-cpu-demo: must specify limits.cpu,limits.memory,requests.cpu,requests.memory
    

    起きられません.割当額は要求と制限を設定しなければならないので、私のリソースリストに制限がなく、デフォルトのネーミングスペースにデフォルトの制限がないと、実行できません.
    root@server2 ~]# vim demo.yml 
    [root@server2 ~]# cat demo.yml 
    apiVersion: v1
    kind: Pod
    metadata:
      name: memory-demo
    spec:
      containers:
      - name: memory-demo
        image: myapp:v1
        resources:
          requests:
            memory: 100Mi
            cpu: 0.1
          limits:
            memory: 300Mi
            cpu: 1
    [root@server2 ~]# kubectl apply -f demo.yml 
    pod/memory-demo created
    [root@server2 ~]# kubectl describe resourcequotas 
    Name:            mem-cpu-demo
    Namespace:       default
    Resource         Used   Hard
    --------         ----   ----
    limits.cpu       1      2
    limits.memory    300Mi  2Gi
    requests.cpu     100m   1
    requests.memory  100Mi  1Gi
    
    
    Namespace Pod :
    [root@server2 ~]# vim quota.yml 
    [root@server2 ~]# cat quota.yml 
    apiVersion: v1
    kind: ResourceQuota
    metadata:
      name: mem-cpu-demo
    spec:
      hard:
        requests.cpu: "1"
        requests.memory: 1Gi
        limits.cpu: "2"
        limits.memory: 2Gi
        pods: "2"		/   pod     
    [root@server2 ~]# kubectl apply -f quota.yml 
    resourcequota/mem-cpu-demo configured
    [root@server2 ~]# kubectl describe resourcequotas 
    Name:            mem-cpu-demo
    Namespace:       default
    Resource         Used   Hard
    --------         ----   ----
    limits.cpu       1      2
    limits.memory    300Mi  2Gi
    pods             1      2		   
    requests.cpu     100m   1
    requests.memory  100Mi  1Gi
    
    [root@server2 ~]# kubectl apply -f limit.yml 
    limitrange/limitrange-memory created
    [root@server2 ~]# kubectl run demo --image=myapop:v1
    pod/demo created
    [root@server2 ~]# kubectl run demo-2 --image=myapop:v1
    Error from server (Forbidden): pods "demo-2" is forbidden: exceeded quota: mem-cpu-demo, requested: pods=1, used: pods=2, limited: pods=2
    

    podの数を制限するため、3番目のpodを実行する際に失敗し、拒否されました.