企业运维实战--k8s学习笔记9.k8s调度

企业运维实战--k8s学习笔记9.k8s调度(上)

  • 前言--调度器简介
  • k8s调度
    • NodeName
    • nodeSelector 亲和
      • 节点亲和
      • pod亲和
      • Taints污点与容忍


前言–调度器简介

调度器通过 kubernetes 的 watch 机制来发现集群中新创建且尚未被调度到 Node 上的 Pod。调度器会将发现的每一个未调度的 Pod 调度到一个合适的 Node 上来运行。

kube-scheduler 是 Kubernetes 集群的默认调度器,并且是集群控制面的一部分。如果你真的希望或者有这方面的需求,kube-scheduler 在设计上是允许你自己写一个调度组件并替换原有的 kube-scheduler。

在做调度决定时需要考虑的因素包括:单独和整体的资源请求、硬件/软件/策略限制、亲和以及反亲和要求、数据局域性、负载间的干扰等等。

k8s调度

NodeName

NodeName 是节点选择约束的最简单方法,它优先于其他的节点选择方法。换言之,NodeName都无法解决的调度需求,则其他调度方法也无法做到。

缺点与限制:

  • 如果指定的节点不存在。
  • 如果指定的节点没有资源来容纳 pod,则pod 调度失败。
  • 云环境中的节点名称并非总是可预测或稳定的。

稍后实验会对边演示。

nodeSelector 亲和

nodeSelector 是节点选择约束的最简单推荐形式。给选择的节点添加标签,通过标签来进行调度。

亲和与反亲和

  • nodeSelector 提供了一种非常简单的方法来将 pod
    约束到具有特定标签的节点上。亲和/反亲和功能极大地扩展了你可以表达约束的类型。
  • 你可以发现规则是“软”/“偏好”,而不是硬性要求,因此,如果调度器无法满足该要求,仍然调度该 pod。
  • 你可以使用节点上的 pod 的标签来约束,而不是使用节点本身的标签,来允许哪些 pod 可以或者不可以被放置在一起。

节点亲和

包含两部分:
requiredDuringSchedulingIgnoredDuringExecution 必须满足
preferredDuringSchedulingIgnoredDuringExecution 倾向满足

示例:

创建工作目录并进入,编写资源清单

mkdir schedu
cd schedu/
vim pod.yaml
cat pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    env: test
spec:
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent
  nodeSelector:
    disktype: ssd

企业运维实战--k8s学习笔记9.k8s调度_第1张图片

拉起容器并查看

kubectl apply -f pod.yaml
kubectl get pod

企业运维实战--k8s学习笔记9.k8s调度_第2张图片

此时未给任何node节点添加标签,pod节点处于Pending状态,
稍后添加标签后,pod将在被添加的node拉起

添加标签后,查看pod节点状态

kubectl label nodes server3 disktype=ssd
kubectl get pod -o wide

企业运维实战--k8s学习笔记9.k8s调度_第3张图片

删除标签后不会消失,因为容器已经运行

kubectl label nodes server3 disktype-
kubectl get node --show-labels

企业运维实战--k8s学习笔记9.k8s调度_第4张图片

kubectl get pod

企业运维实战--k8s学习笔记9.k8s调度_第5张图片

测试结束后删除节点pod

kubectl delete -f pod.yaml

节点亲和性pod示例

vim pod1.yaml

apiVersion: v1
kind: Pod
metadata:
  name: node

你可能感兴趣的:(运维,kubernetes,k8s,调度)