【kubernetes笔记】k8s_Pod调度(04)

Page content

这一篇整理了Pod调度相关的内容。

1.Pod 创建流程

在master节点 create Pod

  1. 调用API Server 的create方法,保存到etcd中。
  2. 调用 Scheduler(调度算法),计算存储的node等信息后存到etcd中。
  3. 调用 相应节点的Keublet创建docker(docker run),之后更新pod状态,存到etcd中。

2.影响Pod调度的属性

2.1 Pod资源限制

node的cpu和内存达不到Requests的设定, 将不会选用此节点。

2.2 节点选择器(nodeSelector)

给节点打上标签

$kubectl label node node_name env_role=dev
apiVersion: v1 
kind: Pod  
metadata:  
  name: test
spec: 
  nodeSelector:
    env_role: dev
  containers:
  - name: test1 
  ... ...

3 节点亲和性nodeAffinity

节点亲和性nodeAffinity和之前nodeSelector基本一样,
根据节点上标签约束来决定Pod调度到哪些节点上。

  • 硬亲和性: 约束必须要满足
  • 软亲和性: 尝试满足,不保证

操作符 In NotIn Exists Gt Lt DoseNotExists

apiVersion: v1
kind: Pod
metadata:
  name: with-node-affinity
spec:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: env_role
            operator: In
            values:
            - dev
            - test
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 1
        preference:
          matchExpressions:
          - key: group
            operator: In
            values:
            - other-prod
  containers:
  - name: test1
    image: test1

4.污点Taint

nodeSelector和nodeAffinity是Pod调度到摸个节点操作。
污点Taint是节点不错分配调度,是节点的属性。

4.1 使用场景

  1. 专用节点
  2. 配置特点硬件节点
  3. Taint驱逐

4.2 污点Taint操作

  • NoScheduler: 一定不被调度
  • PerferNoSechduler: 尽量不被调度
  • NoExecuter: 不会调度,并且还会驱逐已有Pod
#创建
$kubectl taint node [node] key=value:污点三个值 
#查看节点
$kubectl describe node k8smaster | grep Taint 
#删除taint
$kubectl taint node k8snode1 env_role:NoScheduler-node/k8snode1 untainted

4.3 污点Taint容忍

apiVersion: v1
kind: Pod
metadata:
  name: with-node-affinity
spec:
  tolerations:
  - key: "key"
    operator: "Equal"
    value: "value"
    effect: "NoSchedule"
  containers:
  - name: test1
    image: test1

欢迎大家的意见和交流

email: li_mingxie@163.com