date: 2020-07-24title: k8s之pod调度 #标题
tags: k8s #标签
categories: k8s # 分类

整理下k8s中pod调度到指定节点的四种方式。

pod调度方式

k8s一共提供了四种方法,可以将 Pod 调度到指定的节点上,这些方法从简便到复杂的顺序如下:

  • 指定节点 nodeName。
  • 节点选择器 nodeSelector (推荐)
  • Node isolation/restriction
  • Affinity and anti-affinity

这篇博文将只记录前两种调度的配置。

指定节点 nodeName

nodeName 是四种方法中最简单的一个,但是因为它的局限性,也是使用最少的。nodeName 是 Pod.Spec当中的一个字段。如果该字段非空,调度程序直接将其指派到 nodeName 对应的节点上运行。

通过 nodeName 限定 Pod 所运行的节点有如下局限性:

  • 如果 nodeName 对应的节点不存在,Pod 将不能运行;
  • 如果 nodeName 对应的节点没有足够的资源,Pod 将运行失败,可能的原因有:OutOfmemory /OutOfcpu;

yaml文件中部分示例如下

  1. spec:
  2. progressDeadlineSeconds: 600
  3. replicas: 3
  4. revisionHistoryLimit: 10
  5. selector:
  6. matchLabels:
  7. k8s.kuboard.cn/layer: web
  8. k8s.kuboard.cn/name: web-nginx
  9. strategy:
  10. rollingUpdate:
  11. maxSurge: 25%
  12. maxUnavailable: 25%
  13. type: RollingUpdate
  14. template:
  15. metadata:
  16. labels:
  17. k8s.kuboard.cn/layer: web
  18. k8s.kuboard.cn/name: web-nginx
  19. spec:
  20. containers:
  21. - image: 'nginx:latest'
  22. imagePullPolicy: IfNotPresent
  23. name: web
  24. terminationMessagePath: /dev/termination-log
  25. terminationMessagePolicy: File
  26. dnsPolicy: ClusterFirst
  27. nodeName: node02 # 这里指定nodeName即可
  28. restartPolicy: Always
  29. schedulerName: default-scheduler
  30. terminationGracePeriodSeconds: 30

节点选择器 nodeSelector

nodeSelector 是 Pod.Spec 中的一个字段。指定了一组键值对。节点的 labels 中必须包含 Pod 的 nodeSelector 中所有的名值对,该节点才可以运行此 Pod。最普遍的用法中, nodeSelector 只包含一个名值对。

标签相关操作

  1. # 查看节点所有标签
  2. kubectl get node --show-labels
  3. # 给node02节点添加label memory=big
  4. kubectl label nodes node02 memory=big
  5. # 更新label需增加 --overwrite
  6. kubectl label nodes node02 memory=min --overwrite
  7. # 删除标签需指定标签键名及 - 号
  8. kubectl label nodes node02 memory-

通过标签选择器将容器调度到指定节点

  1. # 给节点打标签
  2. kubectl label nodes node01 name=lvjianzhao

部分yaml文件如下

  1. spec:
  2. progressDeadlineSeconds: 600
  3. replicas: 6
  4. revisionHistoryLimit: 10
  5. selector:
  6. matchLabels:
  7. k8s.kuboard.cn/layer: web
  8. k8s.kuboard.cn/name: web-nginx
  9. strategy:
  10. rollingUpdate:
  11. maxSurge: 25%
  12. maxUnavailable: 25%
  13. type: RollingUpdate
  14. template:
  15. metadata:
  16. labels:
  17. k8s.kuboard.cn/layer: web
  18. k8s.kuboard.cn/name: web-nginx
  19. spec:
  20. containers:
  21. - image: 'nginx:latest'
  22. imagePullPolicy: IfNotPresent
  23. name: nginx
  24. terminationMessagePath: /dev/termination-log
  25. terminationMessagePolicy: File
  26. dnsPolicy: ClusterFirst
  27. nodeSelector: # 添加此字段即可
  28. name: lvjianzhao
  29. restartPolicy: Always
  30. schedulerName: default-scheduler
  31. terminationGracePeriodSeconds: 30

查看调度情况如下:

k8s之pod调度 - 图1