Kubernetes (十四) 调度策略

一.  调度策略                                                                                                                  Kubernetes (十四) 调度策略_第1张图片

二.  调度方法

        nodeName    Kubernetes (十四) 调度策略_第2张图片

                创建pod配置文件          vim nodename.yaml

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx
  nodeName: k8s4                #找不到节点pod会出现pending

  回收: kubectl delete -f nodename.yaml

        nodeSelector  Kubernetes (十四) 调度策略_第3张图片

                     创建pod配置文件                        vim nodeselector.yaml

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent
  nodeSelector:
    disktype: ssd

   kubectl label  nodes k8s4 disktype=ssd   文件外命令方式打标签

Kubernetes (十四) 调度策略_第4张图片

      #取消标签不会影响已经创建好的pod 

     取消标签命令: kubectl label nodes k8s4 disktype-

    回收: kubectl delete -f nodeselector.yaml

     三.  亲和与反亲和                                                                                             

Kubernetes (十四) 调度策略_第5张图片Kubernetes (十四) 调度策略_第6张图片

      Pod与节点之间的调度      

                        创建pod配置文件       vim nodeaffinity.yaml

apiVersion: v1
kind: Pod
metadata:
  name: node-affinity
spec:
  containers:
  - name: nginx
    image: nginx
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:  #必须满足的
           nodeSelectorTerms:
           - matchExpressions:
             - key: disktype
               operator: In  #以下列表
               values:
                 - ssd
                 - fc

      preferredDuringSchedulingIgnoredDuringExecution:  #倾向满足的
      - weight: 1                                  #权重
        preference:
          matchExpressions:
          - key: kubernetes.io/hostname
            operator: NotIn              #不在列表内
            values:
            - k8s3                       #尽量不去这个节点

     回收: kubectl delete -f nodeaffinity.yaml

    Pod与Pod之间的调度     

                  创建pod亲和性文件    vim podaffinity.yaml

Kubernetes (十四) 调度策略_第7张图片

apiVersion: apps/v1
kind: Deployment           #控制器
metadata:
  name: nginx-deployment    #控制器名字
  labels:                   #标签
    app: nginx              #名字
spec:
  replicas: 3              #副本数量
  selector:
    matchLabels:           #匹配标签
      app: nginx           #有这个标签的
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
      affinity:
        podAffinity:        #pod亲和性
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values:
                - nginx
            topologyKey: "kubernetes.io/hostname"

        此时所有pod都在一个节点上

Kubernetes (十四) 调度策略_第8张图片

       回收:kubectl delete -f podaffinity.yaml

               创建pod反亲和性文件         vim podantiaffinity.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values:
                - nginx
            topologyKey: "kubernetes.io/hostname"

           创建的pod无法在同一个节点

Kubernetes (十四) 调度策略_第9张图片
       回收: kubectl delete -f podantiaffinity.yaml

 四. 污点                                                                                                                            Kubernetes (十四) 调度策略_第10张图片

              1.  创建pod配置文件               vim taint.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: web
  name: web
spec:
  replicas: 3
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
      - image: nginx
        name: nginx

          正常调度到3.4两个没有污点的节点

        2. 开始设置taint污点   NoSchedule 原来运行的pod不受影响Kubernetes (十四) 调度策略_第11张图片

        3.更改taint污点类型    NoExecute  所有pod都会到没有污点的节点

Kubernetes (十四) 调度策略_第12张图片

       回收:kubectl delete  -f taint.yaml

         设置 tolerations容忍 

             创建编辑文件               vim taint.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: web
  name: web
spec:
  replicas: 6
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      tolerations:                   #容忍
      - operator: Exists        #存在的污点
        effect: NoSchedule    #污点类型    注释此选项及容忍所有污点
      containers:
      - image: nginx
        name: nginx

      此时有NoSchedule污点的2节点也参与调度  因为3节点是NoExecute污点不参与

Kubernetes (十四) 调度策略_第13张图片

        注释掉这个即可都参与调度Kubernetes (十四) 调度策略_第14张图片Kubernetes (十四) 调度策略_第15张图片

              回收:   kubectl delete -f taint.yaml

 记得去除污点: kubectl taint  node k8s3 k1-

     

Kubernetes (十四) 调度策略_第16张图片

    cordon停止调度示例   

 kubectl create deployment demo --image nginx --replicas 3

 kubectl cordon k8s3

 kubectl get node

 kubectl scale deployment demo --replicas 6Kubernetes (十四) 调度策略_第17张图片

  恢复: kubectl uncordon k8s3 

   drain驱离节点示例  

  kubectl drain k8s3 --ignore-daemonsetsKubernetes (十四) 调度策略_第18张图片

          delete删除节点     

 kubectl delete nodes k8s3

恢复 :k8s3节点重启kubelet服务重新加入集群

你可能感兴趣的:(kubernetes,容器,云原生,linux,运维)