kubernetes默认情况下创建pod调度是由kubernetes scheduler来管理的,但显然有时候还是需要人为介入。根据目前的kubernetes版本来说,有两种自定义资源调度的方式:Node和Pod。

实例label配置:
10-19-53-145 node=node01
10-19-152-121 node=node02
10-19-25-188 node=node03

一.Node资源调度
Node资源调度又分为两种:1.通过NodeSelector选择label指定到相应的node节点。2.Node的亲和性(nodeAffinity)
1.NodeSelector的原理是通过在node节点创建对应的label,然后直接创建分配pod。通过命令赋予node节点lable的key和value,然后kubectl get nodes --show-labels查看具体效果。

kubectl label node nodename key=value

使用创建了goweb-4.yaml文件使用NodeSelector选择到指定的node01。

apiVersion: apps/v1
kind: Deployment
metadata:
name: goweb-4
spec:
selector:
matchLabels:
app: goweb-4
replicas: 1
template:
metadata:
labels:
app: goweb-4
spec:
containers:
- image: harbor.yanjiyou.net/yjy/goweb:v1.1
name: goweb-4
ports:
- containerPort: 8000
nodeSelector:
node: node01

NodeSelector只是最简单的调度使用,显然还不能完全满足额外的需求。
2.Node的亲和性(affinity)可以更加灵活选择的node调度,其中涉及到两个容易混淆的参数requiredDuringSchedulingIgnoredDuringExecution和preferredDuringSchedulingIgnoredDuringExecution,最为简单的理解就是必要硬件条件,非必要软性条件,只要在满足硬性条件下才能执行软性条件。
使用创建了goweb-5.yaml文件选择不在node02调度,尽量在node03上进行资源调度。

apiVersion: apps/v1
kind: Deployment
metadata:
name: goweb-5
spec:
selector:
matchLabels:
app: goweb-5
replicas: 2
template:
metadata:
labels:
app: goweb-5
spec:
containers:
- image: harbor.yanjiyou.net/yjy/goweb:v1.1
name: goweb-5
ports:
- containerPort: 8000
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: node
operator: NotIn
values:
- node02
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
preference:
matchExpressions:
- key: node
operator: In
values:
- node03


①key和values需要提前指定
②operator有In和NotIn参数,指定和非指定到某个节点

二.Pod资源调度
和node节点的资源调度一样pod资源调度也是亲和性(podAffinity)和反亲和性(podAntiAffinity)的管理方式,只是管理的范围不同,一个是面向node资源管理,一个是面向pod资源管理。
使用创建了goweb-6.yaml文件选择和goweb-4容器在同一个节点上。

apiVersion: apps/v1
kind: Deployment
metadata:
name: goweb-6
spec:
selector:
matchLabels:
app: goweb-6
replicas: 2
template:
metadata:
labels:
app: goweb-6
spec:
containers:
- image: harbor.yanjiyou.net/yjy/goweb:v1.1
name: goweb-6
ports:
- containerPort: 8000
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- goweb-4
topologyKey: kubernetes.io/hostname

topologyKey可以设置成如下几种类型
kubernetes.io/hostname#同个Node
failure-domain.beta.kubernetes.io/zone#同个Zone
failure-domain.beta.kubernetes.io/region #同个Region

补充:
1.使用亲和性后可以同理使用反亲和性,结果取相反。
2.Taints和tolerations特殊用法:如果一个节点被标记为taints,除非pod配置了tolerations,否则是不会被允许调度。在生产环境如果master也作为work节点的话,可以把master标记Taints,毕竟master运行kubernetes系统组件,如果运行pod容易把资源耗尽,造成master节点崩溃,当然后期如果要添加额外的系统组件,这时就可以通过给对应的pod配置toleration。

kubectl taint nodes nodename key=value:NoSchedule

value参数可以配置多个值
NoSchedule:不能调度,当之前调度的不管。
PreferNoSchedule:尽量不调度。
NoExecute:不能调度,而且之前已经调度上去的也会自动迁移走。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: goweb-7
spec:
  selector:
    matchLabels:
      app: goweb-7
  replicas: 2
  template:
    metadata:
      labels:
        app: goweb-7
    spec:
      containers:
      - image: harbor.yanjiyou.net/yjy/goweb:v1.1
        name: goweb-7
        ports:
        - containerPort: 8000
      tolerations:
      - key: "key"
        operator: "Equal"
        value: "value"
        effect: "NoSchedule

kubernetes资源调度的更多相关文章

  1. kubernetes资源调度之LimitRange

    系列目录 LimitRange从字面意义上来看就是对范围进行限制,实际上是对cpu和内存资源使用范围的限制 前面我们讲到过资源配额,资源配额是对整个名称空间的资源的总限制,是从整体上来限制的,而Lim ...

  2. 基于jenkins,tekton等工具打造kubernetes devops平台

    本贴为目录贴,将不断更新 目录 1.Docker在centos下安装以及常见错误解决 2.使用kubernetes 官网工具kubeadm部署kubernetes(使用阿里云镜像) 3.无法访问gcr ...

  3. 【有容云干货-容器系列】Kubernetes调度核心解密:从Google Borg说起

    在之前“容器生态圈脑图大放送”文章中我们根据容器生态圈脑图,从下至上从左至右,依次介绍了容器生态圈中8个组件,其中也提到Kubernetes ,是一个以 Google Borg 为原型的开源项目.可实 ...

  4. kubernetes 基础知识

    1. kubernetes 包含几个组件 Kubernetes是什么:针对容器编排的一种分布式架构,是自动化容器操作的开源平台. 服务发现.内建负载均衡.强大的故障发现和自我修复机制.服务滚动升级和在 ...

  5. 1-kubeadm部署1.18.0单master集群

    1.有了docker,为什么还用kubernetes? 访问工具层 帮助用户更高效的完成任务,包括web控制台.RESTfulAPI.CI/CD.监控管理.日志管理 PaaS服务层 为开发.测试和运维 ...

  6. Kubernetes学习之路(二十二)之Pod资源调度

    目录 Pod资源调度 1.常用的预选策略 2.优选函数 3.节点亲和调度 3.1.节点硬亲和性 3.2.节点软亲和性 4.Pod资源亲和调度 4.1.Pod硬亲和度 4.2.Pod软亲和度 4.3.P ...

  7. Kubernetes全栈架构师(资源调度上)--学习笔记

    目录 Replication Controller和ReplicaSet 无状态服务Deployment概念 Deployment的创建 Deployment的更新 Deployment的回滚 Dep ...

  8. Kubernetes全栈架构师(资源调度下)--学习笔记

    目录 StatefulSet扩容缩容 StatefulSet更新策略 StatefulSet灰度发布 StatefulSet级联删除和非级联删除 守护进程服务DaemonSet DaemonSet的使 ...

  9. Kubernetes中的资源调度与资源管理

    一.scheduling:把pod放到node上 1.最小调度单元:pod 2.1.8的版本后,最大支持5000个node 3.scheduling由两个部分组成: 3.1 Predicates:过滤 ...

随机推荐

  1. linux学习-添加多个硬盘和lvm配置

    原文 一般,服务器会有多个硬盘,一块硬盘分区安装操作系统,另外多块硬盘分区做存储使用.现在测试添加多块硬盘分区,使用lvm进行实现动态磁盘分配. 1.新增硬盘查看 fdisk -l 可以看到新增的两块 ...

  2. sql prompt工具

    SQL Prompt是一款拥有SQL智能提示功能和格式化Sql代码插件.可用于的SQL Server和VS. SQL Prompt能根据数据库的对象名称,语法和用户编写的代码片段自动进行检索,智能的为 ...

  3. gRPC 到 JSON 代理生成器 grpc-gateway

    grpc-gateway是protoc的插件,它读取protobuf服务定义并生成反向代理服务器,该服务将RESTful HTTP API转换为gRPC. 这个服务是根据你的服务定义中的google. ...

  4. 将pandas的DataFrame数据写入MySQL数据库 + sqlalchemy

    将pandas的DataFrame数据写入MySQL数据库 + sqlalchemy import pandas as pd from sqlalchemy import create_engine ...

  5. 第二章 C#语法快速热身

    C#语法快速热身 语法 if(条件表达式){ 代码块 } 语法 if(条件表达式){ 代码块 }else{ 代码块2 } 语法 if(条件表达式1){ 代码块1 if(条件表达式1)){ }else{ ...

  6. this绑定问题

    this是属性和方法“当前”(运行时)所在的对象.this是函数调用时发生的绑定,它的值只取决于调用位置(箭头函数除外). 函数调用的时候会产生一个执行上下文,this是对这个执行上下文的记录. ❌误 ...

  7. c实现循环链表

    解决约瑟夫环问题核心步骤: 1.建立具有n个节点.无头的循环链表 2.确定第一个报数人的位置 3.不断从链表中删除链节点,直到链表为空 #include <iostream> #inclu ...

  8. Linux之文件通信

    /* * 后执行,尝试读取另外一个进程写入文件的内容 */ #include <stdio.h> #include <unistd.h> #include <stdlib ...

  9. bit,byte,word,bps,Bps,比特,字节,字, 一图看懂

  10. kubernets安装rabbitmq集群.

    RabbitMQ集群的两种模式 1)普通模式:默认的集群模式,队列消息只存在单个节点上 2)镜像模式:队列为镜像队列,队列消息存在每个节点上 配置同步: 配置同步: 1.Ha mode 同步模式,以下 ...