k8s调度策略管理

Pod调度策略

调度策略概述

● 什么是调度分配

  • 在k8s中,调度是将Pod分配到合适的计算节点上,然后对应节点上的Kubelet运行这些pod

  • kube-scheduler是默认调度器,是集群的核心组件

● 调度器是如何工作的

  • 调度器通过k8s的监测(Watch)机制来发现集群中尚未被调度到节点上的Pod。调度器依据调度原则将Pod分配到一个合适的节点上运行

● 调度流程

  • 调度器给一个pod做调度选择包含两个步骤:过滤和打分

● 第一步过滤(筛选):

  • 首先要筛选除满足Pod所有的资源请求的节点,这里包含计算资源、内存、存储、网络、端口号等等,如果没有节点能满足Pod的需求,Pod将一直停留在Pending状态,直到调度器能够找到合适的节点运行它

● 第二步打分(优选):

  • 在打分阶段,调度器会根据打分规则,为每一个调度节点进行打分。选出其中得分最高的节点来运行Pod。如果存在多个得分最高的节点,调度器会从中随机选取一个。

● 绑定

  • 在确定了某个节点运行Pod之后,调度器将这个调度决定通知给kube-apiserver,这个过程叫做绑定。

Pod定向调度

● 基于节点名称的调度

  • 在创建Pod的过程中,我们可以配置相关的调度规则,从而让Pod运行在制定的节点上

  • nodeName标签,让Pod运行在指定的节点上

注意:如果标签指定的节点无法运行Pod,它不会迁移到其他节点,将一直等待下去
登录后复制

plain 复制代码
---
kind: Pod
apiVersion: v1
metadata:
  name: myhttp
spec:
  nodeName: node-0001     # 基于节点名称进行调度
  containers:
  - name: apache
    image: myos:httpd

标签与Pod调度

标签管理

● 标签是什么

  • 标签(Labels)是附加到Kubernetes对象上的键值对(在yaml中需要写在元数据下面)

● 标签的用途

  • k8s在创建、删除、修改资源对象的时候可以使用标签来确定要修改的资源对象。在Pod调度的任务中,使用标签可以更加灵活的完成调度任务。

  • 标签可以在创建时附加到对象,也可以在创建之后随时添加和修改。标签可以用于组织和选择对象的子集。

● 查看筛选标签

  • 使用 --show-labels查询标签

注意:资源配置标签不能随意修改
登录后复制

plain 复制代码
[root@master ~]# kubectl get pods --show-labels 
NAME      READY   STATUS    RESTARTS   AGE     LABELS
myhttp    1/1     Running   0          2m34s   <none>

[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    <none>           v1.26.0   kubernetes.io/hostname=node-0001
node-0002   Ready    <none>           v1.26.0   kubernetes.io/hostname=node-0002
node-0003   Ready    <none>          v1.26.0   kubernetes.io/hostname=node-0003
node-0004   Ready    <none>           v1.26.0   kubernetes.io/hostname=node-0004
node-0005   Ready    <none>           v1.26.0   kubernetes.io/hostname=node-0005

● 管理标签语法格式

  • 设置标签

kubectl label 资源类型 [资源名称] <key>=<value>

  • 删除标签

kubectl label 资源类型 [资源名称] <key>-

  • 查看标签

kubectl get 资源类型 [资源名称] --show-labels

  • 使用标签选择

kubectl get 资源类型 [资源名称] -l <key>=<value>
登录后复制

plain 复制代码
使用标签过滤
# 使用标签过滤资源对象
[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   <none>

● 资源文件设置标签
登录后复制

plain 复制代码
---
kind: Pod
apiVersion: v1
metadata:
  name: myhttp
  labels:               # 声明标签
    app: apache         # 标签键值对
spec:
  containers:
  - name: apache
    image: myos:httpd

Pod 资源配额

资源管理概述

● 为什么要资源配额

  • 当多个应用共享固定节点数目的集群是,人们担心某些应用无法获取足够的资源,从而影响到其他正常运行,我们需要设定一些规则,用来保证应用能获取其运行所需资源

● CPU资源类型

  • CPU资源的约束和请求以耗核(m)为单位。在k8s中1m是最小的调度单元,CPU的一个核心可以看作1000m

  • 如果你有2颗CPU,且每CPU为4核心,那么你的CPU资源总量就是8000m

● 内存资源类型

  • memory的约束和请求以字节为单位

  • 可以使用以下单位来表示内存:E、P、T、G、M、k

  • 对应的2的幂数:Ei、Pi、Ti、G、Mi、Ki、 1k==1000 1Ki==1024
    登录后复制

plain 复制代码
内存资源配额
[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

Pod 资源配额

● 为什么要使用资源限额

  • 限额策略是为了防止某些应用节点对节点资源过度使用,而配置的限制性策略,限额与配额相反,它不检查节点资源的剩余情况,只限制应用对资源的最大使用量

  • 资源限额使用limits进行配置

● 限额内存、CPU

注意:如果不写配额会自动添加与限额相等的配额,想要设置区间需要在配置文件中自己手动添加
登录后复制

plain 复制代码
# 创建限额资源对象文件
[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
相关推荐
JZC_xiaozhong10 分钟前
物料编码在ERP与其他系统中的冲突与解决
运维·自动化·mdm·流程自动化·主数据管理·数据孤岛解决方案·数据集成与应用集成
阿方索26 分钟前
Kubernetes Pod 管理
云原生·容器·kubernetes
宇钶宇夕36 分钟前
ATV900系列变频器起重提升抱闸逻辑设置及源型接线指南
运维·自动化
哪里不会点哪里.42 分钟前
Docker
运维·docker·容器
Learn Forever1 小时前
【Linux】iptables常用指令
linux·运维·服务器
汪碧康1 小时前
一文掌握k8s的健康检查探针
云原生·容器·kubernetes·k8s·xkube·k8s管理平台
危笑ioi1 小时前
k8s创建pv和pvc部署jenkins
kubernetes·jenkins
Saniffer_SH1 小时前
【高清视频】笔记本电脑出现蓝屏、死机、慢、不稳定是这样连接分析M.2 SSD的
运维·服务器·网络·人工智能·驱动开发·嵌入式硬件·fpga开发
宴之敖者、1 小时前
Linux——编译器-gcc/g++
linux·运维·服务器
七七powerful1 小时前
docker 搭建wtsap代理
运维·docker·容器