• kubernetes资源调度


    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
  • 相关阅读:
    twitter api的使用获取关注者的时间线
    使用CloudSight API进行图像识别的Python脚本
    发送请求工具—Advanced REST Client
    windows使用celery遇到的错误
    Pythonic
    celery学习之入门
    windows中安装redis
    pandas 读写sql数据库
    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near
    MySQL 存储引擎
  • 原文地址:https://www.cnblogs.com/zhouzhifei/p/12023459.html
Copyright © 2020-2023  润新知