K8S之POD调度

本文深入探讨了Kubernetes中的Pod调度,包括Deployment/RC的全自动调度,NodeSelector的定向调度,NodeAffinity的亲和性调度,PodAffinity的亲和与互斥调度,Taints和Tolerations的污点与容忍机制,Pod Priority Preemption的优先级抢占,DaemonSet在每个Node上的调度,Job的批处理调度,CronJob的定时任务,以及自定义调度器的实现。此外,还介绍了Pod容灾调度的Even Pod Spreading特性。
摘要由CSDN通过智能技术生成

K8S-Pod调度

1、Deployment/RC:全自动调度

  1. 简述

Deployment或RC的主要功能就是自动部署一个容器应用的多份副本,及持续监控副本的数量并维持该值。

  1. 创建Deployment

    kubectl create -f nginx-deployment.yaml

# nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 2
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80
  1. 查看Deployment的状态

    kubectl get deployments

  2. 查看ReplicaSet(RS)和Pod的信息

    kubectl get rs,pods

    [root@k8s-master k8s]# kubectl get rs,pods
    NAME                                          DESIRED   CURRENT   READY   AGE
    replicaset.apps/nginx-deployment-5d59d67564   2         2         2       22h
    
    NAME                                    READY   STATUS    RESTARTS   AGE
    pod/nginx-deployment-5d59d67564-ccxv7   1/1     Running   0          22h
    pod/nginx-deployment-5d59d67564-sfqjc   1/1     Running   0          22h
    

2、NodeSelector:定向调度

  1. 概述

K8S的调度是通过master上的Scheduler进行调度,通过执行一系列的复杂算法计算出最佳的目标节点,自动完成但无法预知。可通过Node的Label与Pod的nodeSelector属性相匹配来实现定向调度

  1. 给指定node打上标签/或者新增标签

kubectl label nodes k8s-node2 key1=value1

  1. 查看标签

kubectl get nodes --show-labels

  1. 创建pod

kubectl create -f redis-master-nodeselector.yaml

apiVersion: V1
kind: ReplicationController
metadata:
  name: redis-master
  labels:
    name: redis-master
spec:
  replicas: 1
  selector:
    name: redis-master
  template:
    metadata:
      labels:
        name: redis-master
    spec:
      containers:
      - name: master
        image: kubeguide/redis-master
        ports:
        - containerPort: 6379
      nodeSelector:
        key1: value1
  1. 查看replicationcontroller(RC)信息
[root@k8s-master k8s]# kubectl get replicationcontroller
NAME           DESIRED   CURRENT   READY   AGE
redis-master   1         1         1       22h
[root@k8s-master k8s]# kubectl get rc
NAME           DESIRED   CURRENT   READY   AGE
redis-master   1         1         1       23h
  1. 查看pod是否部署到标签node上
[root@k8s-master k8s]# kubectl get pod -o wide
NAME                                READY   STATUS    RESTARTS   AGE   IP            NODE        NOMINATED NODE   READINESS GATES
nginx-deployment-5d59d67564-ccxv7   1/1     Running   0          37h   10.244.2.10   k8s-node2   <none>           <none>
nginx-deployment-5d59d67564-sfqjc   1/1     Running   0          37h   10.244.2.11   k8s-node2   <none>           <none>
redis-master-5fwmk                  1/1     Running   0          36h   10.244.2.12   k8s-node2   <none>           <none>

3、NodeAffinity:Node亲和性调度

  1. 概述,要求服务尽可能起在磁盘为SSD的,且只能运行在amd64的node节点上
  2. 参数:

requiredDuringSchedulingIgnoredDuringExecution表示pod必须部署到满足条件的节点上,如果没有满足条件的节点,就不停重试。其中IgnoreDuringExecution表示pod部署之后运行的时候,如果节点标签发生了变化,不再满足pod指定的条件,pod也会继续运行,直到停止此pod生命周期。

requiredDuringSchedulingRequiredDuringExecution表示pod必须部署到满足条件的节点上,如果没有满足条件的节点,就不停重试。其中RequiredDuringExecution表示pod部署之后运行的时候,如果节点标签发生了变化,不再满足pod指定的条件,停止此pod生命周期,重新选择符合要求的节点。

preferredDuringSchedulingIgnoredDuringExecution表示优先部署到满足条件的节点上,如果没有满足条件的节点,就忽略这些条件,按照正常逻辑部署。其中IgnoreDuringExecution表示pod部署之后运行的时候,如果节点标签发生了变化,不再满足pod指定的条件,pod也会继续运行,直到停止此pod生命周期。

preferredDuringSchedulingRequiredDuringExecution表示优先部署到满足条件的节点上,如果没有满足条件的节点,就忽略这些条件,按照正常逻辑部署。其中RequiredDuringExecution表示如果后面节点标签发生了变化,满足了条件,停止此pod生命周期,重新调度到满足条件的节点。

requiredDuringScheduling pod资源在配置中声明一种标签,只有node节点跟我声明的标签一致,pod才能被调度到此节点,如果没有匹配上,那我就一直等有匹配上的节点。

preferredDuringScheduling pod资源在配置中声明一种标签,只有node节点跟我声明的标签一致,pod才能被调度到此节点,但如果没有匹配上,那我就不等了,随机找节点。

IgnoredDuringExecution如果pod已经部署到此节点,但如果此节点labels发生变化,已经运行的pod会怎么办?pod也会继续运行,直到停止此pod生命周期。

RequiredDuringExecution 如果pod已经部署到此节点,但如果此节点labels发生变化,已经运行的pod会怎么办?立刻停止生命周期,pod会重新调度到满足条件的节点。

如果同时定义了nodeSelector和nodeAffinity,那必须两个条件都满足,pod才能正常运行到指定Node上。

  1. 编辑yaml文件
apiVersion: v1
kind: Pod
metadata:
  name: with-node-affinity
spec:
  affinity:
    nodeAffinity:
	  requiredDuringSchedulingIgnoredDuringException:
		nodeSelectorTerms:
		- matchExpressions:
		  - key: beta.kubernetes.io/arch
			operator: In #NotIn、Exists、DoesNotExist、Gt、Lt
			values:
			- amd64
	  preferredDuringSchedulingIgnoredDuringException:
	  - weight: 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值