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

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

云端技术驾驭DAY12

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标签调度

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

相关推荐
咏颜18 分钟前
Ubuntu离线安装Docker容器
linux·运维·服务器·经验分享·ubuntu·docker
DexterLien1 小时前
Debian 12 安装配置 fail2ban 保护 SSH 访问
运维·debian·ssh·fail2ban
爱学习的白杨树1 小时前
什么是MVCC?
java·服务器·数据库
娶不到胡一菲的汪大东1 小时前
Shell脚本
linux·运维·ubuntu
xserver22 小时前
ensp 基于静态NAT发布公司网站服务器,
运维·服务器
QYpiying2 小时前
服务器中了挖矿病毒-应急响应
运维·服务器
liuxuzxx2 小时前
Istio-2:流量治理之简单负载均衡
云原生·kubernetes·istio
上海运维Q先生2 小时前
面试题整理14----kube-proxy有什么作用
运维·面试·kubernetes
RealName-Wang2 小时前
联想 P368-C3 thinkstation服务器介绍
运维·服务器
怡雪~2 小时前
Kubernetes使用Ceph存储
ceph·容器·kubernetes