Pod调度策略、Pod标签管理、Pod资源配额与限额、全局资源配额与限额策略

Pod 调度策略

基于节点的调度

[root@master ~]# vim myhttp.yaml 

---

kind: Pod

apiVersion: v1

metadata:

  name: myhttp

spec:

  nodeName: node-0001     # 基于节点名称进行调度

  containers:

  - name: apache

    image: myos:httpd


[root@master ~]# kubectl apply -f myhttp.yaml  

pod/myhttp created

[root@master ~]# kubectl get pods -o wide

NAME      READY   STATUS    RESTARTS   AGE   IP           NODE

myhttp    1/1     Running   0          3s    10.244.1.6   node-0001

标签管理

查询标签
[root@master ~]# kubectl get pods --show-labels 

NAME      READY   STATUS    RESTARTS   AGE     LABELS

myhttp    1/1     Running   0          2m34s   


[root@master ~]# kubectl get namespaces --show-labels 

NAME              STATUS   AGE     LABELS

default           Active   3h44m   kubernetes.io/metadata.name=default

kube-node-lease   Active   3h44m   kubernetes.io/metadata.name=kube-node-lease

kube-public       Active   3h44m   kubernetes.io/metadata.name=kube-public

kube-system       Active   3h44m   kubernetes.io/metadata.name=kube-system


[root@master ~]# kubectl get nodes --show-labels 

NAME        STATUS   ROLES            VERSION   LABELS

master      Ready    control-plane    v1.26.0   kubernetes.io/hostname=master

node-0001   Ready               v1.26.0   kubernetes.io/hostname=node-0001

node-0002   Ready               v1.26.0   kubernetes.io/hostname=node-0002

node-0003   Ready               v1.26.0   kubernetes.io/hostname=node-0003

node-0004   Ready               v1.26.0   kubernetes.io/hostname=node-0004

node-0005   Ready               v1.26.0   kubernetes.io/hostname=node-0005
使用标签过滤
# 使用标签过滤资源对象

[root@master ~]# kubectl get nodes -l kubernetes.io/hostname=master

NAME     STATUS   ROLES              AGE     VERSION

master   Ready    control-plane      3h38m   v1.26.0
添加标签
[root@master ~]# kubectl label pod myhttp app=apache

pod/myhttp labeled

[root@master ~]# kubectl get pods --show-labels 

NAME      READY   STATUS    RESTARTS   AGE   LABELS

myhttp    1/1     Running   0          14m   app=apache
删除标签
[root@master ~]# kubectl label pod myhttp app-

pod/myhttp labeled

[root@master ~]# kubectl get pods --show-labels 

NAME      READY   STATUS    RESTARTS   AGE   LABELS

myhttp    1/1     Running   0          14m   
资源文件标签
[root@master ~]# vim myhttp.yaml 

---

kind: Pod

apiVersion: v1

metadata:

  name: myhttp

  labels:               # 声明标签

    app: apache         # 标签键值对

spec:

  containers:

  - name: apache

    image: myos:httpd


[root@master ~]# kubectl delete pods myhttp

pod "myhttp" deleted

[root@master ~]# kubectl apply -f myhttp.yaml  

pod/myhttp created

[root@master ~]# kubectl get pods --show-labels 

NAME      READY   STATUS    RESTARTS   AGE   LABELS

myhttp    1/1     Running   0          14m   app=apache

基于标签的调度

[root@master ~]# kubectl get nodes node-0002 --show-labels 

NAME        STATUS   ROLES     VERSION   LABELS

node-0002   Ready        v1.26.0   kubernetes.io/hostname=node-0002   ...


[root@master ~]# vim myhttp.yaml 

---

kind: Pod

apiVersion: v1

metadata:

  name: myhttp

  labels:

    app: apache

spec:

  nodeSelector:                        # 基于节点标签进行调度

    kubernetes.io/hostname: node-0002  # 标签

  containers:

  - name: apache

    image: myos:httpd


[root@master ~]# kubectl delete pods myhttp 

pod "myhttp" deleted

[root@master ~]# kubectl apply -f myhttp.yaml  

pod/myhttp created

[root@master ~]# kubectl get pods -l app=apache -o wide

NAME      READY   STATUS    RESTARTS   AGE   IP            NODE

myhttp    1/1     Running   0          9s    10.244.2.11   node-0002

容器调度(案例2)

[root@master ~]# kubectl label nodes node-0002 node-0003 disktype=ssd

node/node-0002 labeled

node/node-0003 labeled

[root@master ~]# vim myhttp.yaml 

---

kind: Pod

apiVersion: v1

metadata:

  name: myhttp

  labels:

    app: apache

spec:

  nodeSelector:

    disktype: ssd

  containers:

  - name: apache

    image: myos:httpd


[root@master ~]# sed "s,myhttp,web1," myhttp.yaml |kubectl apply -f -

[root@master ~]# sed "s,myhttp,web2," myhttp.yaml |kubectl apply -f -

[root@master ~]# sed "s,myhttp,web3," myhttp.yaml |kubectl apply -f -

[root@master ~]# sed "s,myhttp,web4," myhttp.yaml |kubectl apply -f -

[root@master ~]# sed "s,myhttp,web5," myhttp.yaml |kubectl apply -f -


[root@master ~]# kubectl get pods -o wide

NAME      READY   STATUS    RESTARTS   AGE   IP            NODE

myhttp    1/1     Running   0          29m   10.244.2.30   node-0002

web1      1/1     Running   0          10s   10.244.2.31   node-0002

web2      1/1     Running   0          10s   10.244.2.32   node-0002

web3      1/1     Running   0          10s   10.244.3.45   node-0003

web4      1/1     Running   0          10s   10.244.3.46   node-0003

web5      1/1     Running   0          10s   10.244.3.47   node-0003

清理实验配置

[root@master ~]# kubectl delete pod -l app=apache

pod "myhttp" deleted

pod "web1" deleted

pod "web2" deleted

pod "web3" deleted

pod "web4" deleted

pod "web5" deleted

[root@master ~]# kubectl label nodes node-0002 node-0003 disktype-

node/node-0002 labeled

node/node-0003 labeled

Pod 资源配额

资源对象文件

[root@master ~]# vim minpod.yaml 

---

kind: Pod

apiVersion: v1

metadata:

  name: minpod

spec:

  terminationGracePeriodSeconds: 0

  containers:

  - name: linux

    image: myos:8.5

    command: ["awk", "BEGIN{while(1){}}"]

内存资源配额

[root@master ~]# vim minpod.yaml 

---

kind: Pod

apiVersion: v1

metadata:

  name: minpod

spec:

  terminationGracePeriodSeconds: 0

  nodeSelector:                        # 配置 Pod 调度节点

    kubernetes.io/hostname: node-0003  # 在 node-0003 节点创建

  containers:

  - name: linux

    image: myos:8.5

    command: ["awk", "BEGIN{while(1){}}"]

    resources:               # 资源策略

      requests:              # 配额策略

        memory: 1100Mi       # 内存配额


# 验证配额策略

[root@master ~]# for i in app{1..5};do sed "s,minpod,${i}," minpod.yaml;done |kubectl apply -f -

pod/app1 created

pod/app2 created

pod/app3 created

pod/app4 created

pod/app5 created

[root@master ~]# kubectl get pods

NAME   READY   STATUS    RESTARTS   AGE

app1   1/1     Running   0          4s

app2   1/1     Running   0          4s

app3   1/1     Running   0          4s

app4   0/1     Pending   0          4s

app5   0/1     Pending   0          4s


# 清理实验配置

[root@master ~]# kubectl delete pod --all

计算资源配额

[root@master ~]# vim minpod.yaml 

---

kind: Pod

apiVersion: v1

metadata:

  name: minpod

spec:

  terminationGracePeriodSeconds: 0

  nodeSelector:

    kubernetes.io/hostname: node-0003

  containers:

  - name: linux

    image: myos:8.5

    command: ["awk", "BEGIN{while(1){}}"]

    resources:

      requests:

        cpu: 800m          # 计算资源配额


# 验证配额策略

[root@master ~]# for i in app{1..5};do sed "s,minpod,${i}," minpod.yaml;done |kubectl apply -f -

pod/app1 created

pod/app2 created

pod/app3 created

pod/app4 created

pod/app5 created

[root@master ~]# kubectl get pods

NAME   READY   STATUS    RESTARTS   AGE

app1   1/1     Running   0          8s

app2   1/1     Running   0          8s

app3   0/1     Pending   0          8s

app4   0/1     Pending   0          8s

app5   0/1     Pending   0          8s


# 清理实验配置

[root@master ~]# kubectl delete pod --all

综合资源配额

[root@master ~]# vim minpod.yaml 

---

kind: Pod

apiVersion: v1

metadata:

  name: minpod

spec:

  terminationGracePeriodSeconds: 0

  nodeSelector:

    kubernetes.io/hostname: node-0003

  containers:

  - name: linux

    image: myos:8.5

    command: ["awk", "BEGIN{while(1){}}"]

    resources:

      requests:

        cpu: 800m          # 计算资源配额

        memory: 1100Mi     # 内存资源配额

Pod 资源限额

限额内存 CPU

# 创建限额资源对象文件

[root@master ~]# vim maxpod.yaml 

---

kind: Pod

apiVersion: v1

metadata:

  name: maxpod

spec:

  terminationGracePeriodSeconds: 0

  containers:

  - name: linux

    image: myos:8.5

    command: ["awk", "BEGIN{while(1){}}"]

    resources:

      limits:

        cpu: 800m

        memory: 2000Mi


[root@master ~]# kubectl apply -f maxpod.yaml 

pod/maxpod created

验证内存限额

[root@master ~]# kubectl cp memtest.py maxpod:/usr/bin/

[root@master ~]# kubectl exec -it maxpod -- /bin/bash

[root@maxpod /]# memtest.py 2500

Killed

[root@maxpod /]# memtest.py 1500

use memory success

press any key to exit :

验证 CPU 限额

root@master ~]# kubectl exec -it maxpod -- ps aux

USER     PID %CPU %MEM    VSZ   RSS  STAT START   TIME COMMAND

root       1 79.9  0.0   9924   720  Rs   18:25   1:19 awk BEGIN{while(1){}}

root       8  0.5  0.0  12356  2444  Ss   18:26   0:00 /bin/bash

[root@master ~]# kubectl top pods

NAME     CPU(cores)   MEMORY(bytes)   

maxpod   834m         1Mi   


# 清理实验 Pod

[root@master ~]# kubectl delete pod maxpod

pod "maxpod" deleted

全局资源管理

LimitRange

默认配额策略
# 创建名称空间

[root@master ~]# kubectl create namespace work

namespace/work created

# 设置默认配额

[root@master ~]# vim limit.yaml

---

apiVersion: v1

kind: LimitRange

metadata:

  name: mylimit 

  namespace: work   

spec:

  limits:               

  - type: Container     

    default:            

      cpu: 300m 

      memory: 500Mi     

    defaultRequest:

      cpu: 8m  

      memory: 8Mi 


[root@master ~]# kubectl -n work apply -f limit.yaml

limitrange/mylimit created 

验证配额策略

[root@master ~]# vim maxpod.yaml

---

kind: Pod

apiVersion: v1

metadata:

  name: maxpod

spec:

  terminationGracePeriodSeconds: 0

  containers:

  - name: linux

    image: myos:8.5

    command: ["awk", "BEGIN{while(1){}}"]


[root@master ~]# kubectl -n work apply -f maxpod.yaml

pod/maxpod created

[root@master ~]# kubectl -n work describe pod maxpod

... ...

    Limits:

      cpu:     300m

      memory:  500Mi

    Requests:

      cpu:     10m

      memory:  8Mi

... ...

[root@master ~]# kubectl -n work top pods

NAME     CPU(cores)   MEMORY(bytes)   

maxpod   300m         0Mi   
自定义资源
[root@master ~]# vim maxpod.yaml

---

kind: Pod

apiVersion: v1

metadata:

  name: maxpod

spec:

  terminationGracePeriodSeconds: 0

  containers:

  - name: linux

    image: myos:8.5

    command: ["awk", "BEGIN{while(1){}}"]

    resources:

      requests:

        cpu: 10m

        memory: 10Mi

      limits:

        cpu: 1100m

        memory: 2000Mi


[root@master ~]# kubectl -n work delete -f maxpod.yaml 

pod "maxpod" deleted

[root@master ~]# kubectl -n work apply -f maxpod.yaml

pod/maxpod created

[root@master ~]# kubectl -n work describe pod maxpod

... ...

    Limits:

      cpu:     1100m

      memory:  2000Mi

    Requests:

      cpu:     10m

      memory:  10Mi

... ...

[root@master ~]# kubectl -n work top pods maxpod

NAME     CPU(cores)   MEMORY(bytes)   

maxpod   1000m        0Mi
资源配额范围
[root@master ~]# vim limit.yaml 

---

apiVersion: v1

kind: LimitRange

metadata:

  name: mylimit

  namespace: work

spec:

  limits:               

  - type: Container     

    default:            

      cpu: 300m 

      memory: 500Mi     

    defaultRequest:

      cpu: 8m  

      memory: 8Mi 

    max:

      cpu: 800m

      memory: 1000Mi

    min:

      cpu: 2m

      memory: 8Mi


[root@master ~]# kubectl -n work apply -f limit.yaml 

limitrange/mylimit configured

[root@master ~]# kubectl -n work delete -f maxpod.yaml 

pod "maxpod" deleted

[root@master ~]# kubectl -n work apply -f maxpod.yaml 

Error from server (Forbidden): error when creating "maxpod.yaml": pods "maxpod" is forbidden: [maximum cpu usage per Container is 800m, but limit is 1, maximum memory usage per Container is 1000Mi, but limit is 2000Mi]
多容器资源配额
[root@master ~]# vim maxpod.yaml 

---

kind: Pod

apiVersion: v1

metadata:

  name: maxpod

spec:

  terminationGracePeriodSeconds: 0

  containers:

  - name: linux

    image: myos:8.5

    command: ["awk", "BEGIN{while(1){}}"]

    resources:

      requests:

        cpu: 10m

        memory: 10Mi

      limits:

        cpu: 800m

        memory: 1000Mi

  - name: linux1

    image: myos:8.5

    command: ["awk", "BEGIN{while(1){}}"]

    resources:

      requests:

        cpu: 10m

        memory: 10Mi

      limits:

        cpu: 800m

        memory: 1000Mi


[root@master ~]# kubectl -n work apply -f maxpod.yaml 

pod/maxpod created

[root@master ~]# kubectl -n work get pods

NAME     READY   STATUS    RESTARTS   AGE

maxpod   2/2     Running   0          50s

[root@master ~]# kubectl -n work top pods maxpod

NAME     CPU(cores)   MEMORY(bytes)   

maxpod   1610m        0Mi  
Pod 资源配额
[root@master ~]# vim limit.yaml 

---

apiVersion: v1

kind: LimitRange

metadata:

  name: mylimit

  namespace: work

spec:

  limits:               

  - type: Container     

    default:            

      cpu: 300m 

      memory: 500Mi     

    defaultRequest:

      cpu: 8m  

      memory: 8Mi 

    max:

      cpu: 800m

      memory: 1000Mi

    min:

      cpu: 2m

      memory: 8Mi

  - type: Pod

    max:

      cpu: 1200m

      memory: 1200Mi

    min:

      cpu: 2m

      memory: 8Mi


[root@master ~]# kubectl -n work apply -f limit.yaml

limitrange/mylimit configured


[root@master ~]# kubectl -n work delete -f maxpod.yaml 

pod "maxpod" deleted

[root@master ~]# kubectl -n work apply -f maxpod.yaml 

Error from server (Forbidden): error when creating "maxpod.yaml": pods "maxpod" is forbidden: [maximum cpu usage per Pod is 1200m, but limit is 1600m, maximum memory usage per Pod is 1200Mi, but limit is 2097152k]

多个 Pod 消耗资源

[root@master ~]# vim maxpod.yaml 

---

kind: Pod

apiVersion: v1

metadata:

  name: maxpod

spec:

  terminationGracePeriodSeconds: 0

  containers:

  - name: linux

    image: myos:8.5

    command: ["awk", "BEGIN{while(1){}}"]

    resources:

      requests:

        cpu: 10m

        memory: 10Mi

      limits:

        cpu: 800m

        memory: 1000Mi


# 创建太多Pod,资源也会耗尽

[root@master ~]# for i in app{1..9};do sed "s,maxpod,${i}," maxpod.yaml ;done |kubectl -n work apply -f -


# Pod 创建成功后,查看节点资源使用情况

[root@master ~]# kubectl top nodes

NAME        CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%   

master      81m          4%     1040Mi          27%       

node-0001   1800m        90%    403Mi           10%       

node-0002   1825m        86%    457Mi           11%       

node-0003   1816m        85%    726Mi           19%

node-0004   1823m        86%    864Mi           21%

node-0005   1876m        88%    858Mi           21%


# 清理实验配置

[root@master ~]# kubectl -n work delete pods --all

ResourceQuota

全局配额策略
[root@master ~]# vim quota.yaml

---

apiVersion: v1

kind: ResourceQuota

metadata:

  name: myquota

  namespace: work

spec:

  hard:

    requests.cpu: 1000m

    requests.memory: 2000Mi

    limits.cpu: 5000m

    limits.memory: 8Gi

    pods: 3


[root@master ~]# kubectl -n work apply -f quota.yaml 

resourcequota/myquota created

验证 quota 配额

[root@master ~]# for i in app{1..5};do sed "s,maxpod,${i}," maxpod.yaml ;done |kubectl -n work apply -f -

pod/app1 created

pod/app2 created

pod/app3 created

Error from server (Forbidden): error when creating "STDIN": pods "app4" is forbidden: exceeded quota: myquota, requested: pods=1, used: pods=3, limited: pods=3

Error from server (Forbidden): error when creating "STDIN": pods "app5" is forbidden: exceeded quota: myquota, requested: pods=1, used: pods=3, limited: pods=3


# 删除实验 Pod 与限额规则

[root@master ~]# kubectl -n work delete pods --all

pod "app1" deleted

pod "app2" deleted

pod "app3" deleted


[root@master ~]# kubectl -n work delete -f limit.yaml -f quota.yaml

limitrange "mylimit" deleted

resourcequota "myquota" deleted


[root@master ~]# kubectl delete namespace work

namespace "work" deleted

你可能感兴趣的:(容器,kubelet,云原生)