云端技术驾驭DAY12——Pod调度策略、Pod标签管理、Pod资源配额与限额、全局资源配额与限额策略

本文详细介绍了云端技术中的Kubernetes(k8s)调度策略,包括Pod调度原理、标签管理、资源配额(如LimitRange和ResourceQuota)以及如何基于节点名和标签进行Pod定向调度。文章还展示了如何设置和管理Pod资源,确保在集群中的合理分布和资源使用。
摘要由CSDN通过智能技术生成

往期回顾:
云端技术驾驭DAY01——云计算底层技术奥秘、云服务器磁盘技术、虚拟化管理、公有云概述
云端技术驾驭DAY02——华为云管理、云主机管理、跳板机配置、制作私有镜像模板
云端技术驾驭DAY03——云主机网站部署、web集群部署、Elasticsearch安装
云端技术驾驭DAY04——Logstash安装部署及插件模块
云端技术驾驭DAY06——容器技术概述、镜像与容器管理、定制简单镜像、容器内安装部署服务
云端技术驾驭DAY07——Dockerfile详解、容器镜像制作、私有仓库
云端技术驾驭DAY08——部署容器服务、Compose微服务管理、harbor仓库部署及管理
云端技术驾驭DAY09——k8s集群安装部署、calico插件部署、计算节点配置管理
云端技术驾驭DAY10——kubectl命令详解、Pod创建过程、Pod的生命周期、定制Pod、资源对象文件
云端技术驾驭DAY11——资源对象文件、Pod自定义命令、多容器Pod、资源监控工具

Pod调度策略管理

Pod调度策略

调度策略概述
  • 什么是调度分配?
    • 在k8s中,调度是将Pod分配到合适的计算节点上,然后对应节点上的Kubelet运行这些Pod
    • kube-scheduler是默认调度器,是集群的核心组建
  • 调度器是如何工作的?
    • 调度器通过k8s的监测机制来发现集群中尚未被调度到节点上的Pod。调度器依据调度原则将Pod分配到一个合适的节点上运行
  • 调度流程
    • 调度器给一个Pod做调度选择包含两个步骤:过滤和打分
  • 第一步:过滤
    • 首先要筛选出满足Pod所有的资源请求的节点,这里包含计算资源、内存、存储、网络、端口号等等,如果没有节点能满足Pod的需求,Pod将一直停留在Pending状态,直到调度器能够找到合适的节点运行它
  • 第二部:打分
    • 在打分阶段,调度器会根据打分规则,为每一个可调度节点进行打分。选出其中打分最高的节点来运行Pod。如果存在多个得分最高的节点,调度器会从中随机选取一个。
  • 绑定
    • 在确定了某个节点运行Pod之后,调度器将这个调度决定通知给kube-apiserver,这个过程叫做绑定
Pod定向调度
  • 基于节点名称的调度
    • 在创建Pod过程中,我们可以配置相关的调度规则,从而让Pod运行在制定的节点上
    • nodeName标签,让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

标签与Pod调度

标签管理
  • 标签是什么?
    • 标签(Labels)是附加到Kubernetes对象上的键值对
  • 标签的用途
    • k8s在创建、删除、修改资源对象的时候可以使用标签来确定要修改的资源对象。在Pod调度的任务中,使用标签可以更加灵活地完成调度人物
    • 标签可以在创建时附加到对象,也可以在创建之后随时添加和修改。标签可以用于组织和选择对象的子集
  • 查看筛选标签
    • 使用--show-labels查询标签
[root@master ~]# kubectl -n kube-system get pods --show-labels
NAME                                      READY   STATUS    RESTARTS      AGE     LABELS
calico-kube-controllers-fc945b5f7-kv9gc   1/1     Running   3 (17m ago)   4d19h   k8s-app=calico-kube-controllers,pod-template-hash=fc945b5f7
calico-node-2wz65                         1/1     Running   3 (17m ago)   4d17h   controller-revision-hash=766786f67c,k8s-app=calico-node,pod-template-generation=1
calico-node-6jp85                         1/1     Running   3 (17m ago)   4d17h   controller-revision-hash=766786f67c,k8s-app=calico-node,pod-template-generation=1
... ...
  • 管理标签语法格式
命令解释
kubectl label 资源类型 [资源名称] <key>=<value>设置标签
kubectl label 资源类型 [资源名称] <key>-删除标签
kubectl label 资源类型 [资源名称] --show-labels查看标签
kubectl label 资源类型 [资源名称] -l <key>=<value>筛选标签
  • 设置标签、删除标签
[root@master ~]# kubectl get pods --show-labels
NAME      READY   STATUS    RESTARTS   AGE   LABELS
mylinux   1/1     Running   0          7s    <none>
[root@master ~]# kubectl label pods mylinux app=apache     // 设置标签
pod/mylinux labeled
[root@master ~]# kubectl get pods --show-labels
NAME      READY   STATUS    RESTARTS   AGE   LABELS
mylinux   1/1     Running   0          42s   app=apache
[root@master ~]# kubectl label pods mylinux app-           // 删除标签
pod/mylinux unlabeled
  • 过滤标签
[root@master ~]# kubectl get nodes -l kubernetes.io/hostname=master     // 使用-l筛选标签
NAME     STATUS   ROLES           AGE     VERSION
master   Ready    control-plane   4d19h   v1.26.0
  • 资源文件标签
[root@master ~]# vim myhttp.yaml
---
kind: Pod
apiVersion: v1
metadata:
  name: myhttp
  labels:
    app: httpd
    name: apache
spec:
  containers:
  - name: apache
    image: myos:httpd
[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          90s   app=httpd,name=apache
Pod标签调度
  • 通过标签选择算符,客户端/用户可以识别一组对象
  • 标签选择算符可以由多个需求组成。在多个需求的情况下,必须满足所有要求,相当于逻辑与(&&)运算符
    1. 查看node-0002的标签
[root@master ~]# kubectl get nodes --show-labels
NAME        STATUS   ROLES           AGE     VERSION   LABELS
master      Ready    control-plane   4d20h   v1.26.0   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=master,kubernetes.io/os=linux,node-role.kubernetes.io/control-plane=,node.kubernetes.io/exclude-from-external-load-balancers=
node-0001   Ready    <none>          4d18h   v1.26.0   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node-0001,kubernetes.io/os=linux
node-0002   Ready    <none>          4d18h   v1.26.0   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node-0002,kubernetes.io/os=linux
node-0003   Ready    <none>          4d18h   v1.26.0   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node-0003,kubernetes.io/os=linux
node-0004   Ready    <none>          4d18h   v1.26.0   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node-0004,kubernetes.io/os=linux
node-0005   Ready    <none>          4d18h   v1.26.0   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node-0005,kubernetes.io/os=linux
    1. 通过标签调度Pod
[root@master ~]# vim myhttp.yaml
---
kind: Pod
apiVersion: v1
metadata:
  name: myhttp
  labels:
    app: httpd
    name: apache
spec:
  nodeSelector:
    kubernetes.io/hostname: node-0002     // 选择标签
  containers:
  - name: apache
    image: myos:httpd
[root@master ~]# kubectl delete pod myhttp 
pod "myhttp" deleted
[root@master ~]# kubectl apply -f myhttp.yaml 
pod/myhttp created
[root@master ~]# kubectl get pods -o wide
NAME     READY   STATUS    RESTARTS   AGE   IP             NODE        NOMINATED NODE   READINESS GATES
myhttp   1/1     Running   0          23s   10.244.147.5   node-0002   <none>           <none>
  • 实验:完成以下要求
    • 已知节点node-0002和node-0003使用的是ssd硬盘
    • 创建5个Pod:[web1、web2、web3、web4、web5]
    • 这些Pod必须运行在ssd硬盘的节点上
[root@master ~]# kubectl label nodes node-0002 node-0003 disktype=ssd     // 给node-0002和node-0003打标签
node/node-0002 labeled
node/node-0003 labeled
[root@master ~]# vim mywebs.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," mywebs.yaml | kubectl apply -f -
pod/web1 created
[root@master ~]# sed "s,myhttp,web2," mywebs.yaml | kubectl apply -f -
pod/web2 created
[root@master ~]# sed "s,myhttp,web3," mywebs.yaml | kubectl apply -f -
pod/web3 created
[root@master ~]# sed "s,myhttp,web4," mywebs.yaml | kubectl apply -f -
pod/web4 created
[root@master ~]# sed "s,myhttp,web5," mywebs.yaml | kubectl apply -f -
pod/web5 created
[root@master ~]# kubectl get pods -o wide
NAME     READY   STATUS    RESTARTS   AGE   IP               NODE        NOMINATED NODE   READINESS GATES
myhttp   1/1     Running   0          13m   10.244.147.5     node-0002   <none>           <none>
web1     1/1     Running   0          51s   10.244.243.198   node-0003   <none>           <none>
web2     1/1     Running   0          43s   10.244.243.199   node-0003   <none>           <none>
web3     1/1     Running   0          39s   10.244.147.6     node-0002   <none>           <none>
web4     1/1     Running   0          34s   10.244.243.200   node-0003   <none>           <none>
web5     1/1     Running   0          30s   10.244.147.7     node-0002   <none>           <none>

Pod资源管理

Pod资源管理

资源管理概述
  • 为什么要资源配额?
    • 当多个应用共享固定节点数目的集群时,人们担心某些应用无法获得足够的资源,从而影响其正常运行,我们需要设定一些规则,用来保证应用能获得其运行所需资源
  • CPU和内存资源类型
Pod资源配额
  • 创建资源对象文件
[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:                               // 配额策略
        memory: 1100Mi                        // 内存资源配额
        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          4s
app2   1/1     Running   0          4s
app3   0/1     Pending   0          4s
app4   0/1     Pending   0          4s
app5   0/1     Pending   0          4s
Pod资源限额
  • 为什么要使用资源限额
    • 限额策略是为了防止某些应用对节点资源过度使用,而配置的限制性策略,限额与配额相反,它不检查节点资源的剩余情况,只限制应用对资源的最大使用量
    • 资源限额使用limits进行配置
  • 限制内存、CPU
[root@master ~]# vim maxpod.yaml
---
kind: Pod
apiVersion: v1
metadata:
  name: maxpod
... ...
    command: ["awk", "BEGIN{while(1){}}"]
    resources:
      limits:
        cpu: 800m                             // 计算资源限额
        memory: 2000Mi                        // 内存资源限额
[root@master ~]# kubectl apply -f maxpod.yaml 
pod/maxpod created

全局资源管理

全局资源管理概述
  • 全局资源配额
    • 如果有大量的容器需要设置资源配额,为每个Pod设置资源配额策略不方便且不好管理
    • 可以以名称空间为单位,限制其资源的使用与创建。在该名称空间中创建的容器都会受到规则的限制
  • k8s支持的全局资源配额方式有:
    • 对单个Pod内存、CPU进行配额:LimitRange
    • 对资源总量进行配额:ResourceQuota
LimiRange
  • 为名称空间work设置默认资源配额
[root@master ~]# kubectl create namespace work
namespace/work created
[root@master ~]# vim limit.yaml
---
kind: LimitRange
apiVersion: v1
metadata:
  name: mylimit                // 策略名称
  namespace: work              // 规则生效的名称空间
spec:
  limits:                      // 全局规则
  - type: Container            // 资源类型
    default:                   // 对没有限制策略的容器添加规则
      cpu: 300m                // 计算资源限额
      memory: 500Mi            // 内存资源限额
    defaultRequest:
      cpu: 8m                  // 计算资源配额
      memory: 8Mi              // 内存资源配额
[root@master ~]# kubectl apply -f limit.yaml -n work
limitrange/mylimit created
  • 设置资源使用范围
    • 设置名称空间的最大限额和最小配额
[root@master ~]# vim limit.yaml 
---
kind: LimitRange
apiVersion: v1
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 apply -f limit.yaml -n work
limitrange/mylimit configured
  • Pod资源配额
    • 对整个Pod设置总限额
... ...
spec:
  limits:
  - type: Pod             // 限制Pod资源总量
    max:
      cpu: 1200m
      memory: 1200Mi
    min:
      cpu: 2m
      memory: 8Mi
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
[root@master ~]# kubectl describe namespaces work 
Name:         work
Labels:       kubernetes.io/metadata.name=work
Annotations:  <none>
Status:       Active

Resource Quotas
  Name:            myquota
  Resource         Used  Hard
  --------         ---   ---
  limits.cpu       0     5
  limits.memory    0     8Gi
  pods             0     3
  requests.cpu     0     1
  requests.memory  0     2000Mi
  • 28
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值