Linux(企业级)——kubernetes(Schedule)

1. node调度

nodeName指定

nodeName 是节点选择最简单方法,但一般不推荐。如果 nodeName 在 PodSpec 中指定了,则优先于其他的节点选择方法。如果指定的节点没有资源来容纳 pod,则pod 调度失败。

vim node.yaml
apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - name: nginx
    image: myapp:v1
  nodeName: server3 # 指定server3

kubectl apply -f node.yaml

成功调度至server3
在这里插入图片描述

nodeSelector选择

给选择的节点添加标签:

kubectl label nodes server4 disktype=ssd
vim aff-node.yaml
apiVersion: v1
kind: Pod
metadata:
  name: nginx-2
  labels:
    env: test
spec:
  containers:
  - name: nginx
    image: myapp:v1
    imagePullPolicy: IfNotPresent
  nodeSelector:
    disktype: ssd

应用文件,节点被调度到有ssd标签的server4上
在这里插入图片描述而此时去掉server4的ssd标签,已经被调度到节点上的pod不会受到影响。
在这里插入图片描述

node 亲和性与反亲和性

  • nodeaffinity还支持多种规则匹配条件的配置

在这里插入图片描述

  • 亲和性
apiVersion: v1
kind: Pod
metadata:
  name: node-affinity
spec:
  containers:
  - name: nginx
    image: nginx
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
           nodeSelectorTerms:
           - matchExpressions:
             - key: disktype
               operator: In #匹配disktype的值为下列值之一
               values:
                 - ssd

优先调度至disktype=ssd的节点。

  • 反亲和性
vim aff-node.yaml
apiVersion: v1
kind: Pod
metadata:
  name: node-affinity
spec:
  containers:
  - name: nginx
    image: myapp:v1
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
           nodeSelectorTerms:
           - matchExpressions:
             - key: kubernetes.io/hostname
               operator: NotIn #反亲和
               values:
               - server2 #优先不调度至server2
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 1	# 亲和权重为1
        preference:
          matchExpressions:
          - key: disktype	#匹配disktype的值为下列值之一
            operator: In
            values:
            - ssd

优先不调度至server2,优先匹配标签为disktype=ssd的节点。
在这里插入图片描述在这里插入图片描述

2. pod调度

pod 亲和与反亲和

在这里插入图片描述
与node亲和与反亲和类似支持nodeaffinity规则

示例:

apiVersion: v1
kind: Pod
metadata:
  name: busybox-anti
  labels:
    app: busybox
spec:
  containers:
  - name: busybox
    image: busybox
  affinity:
    podAntiAffinity: #反亲和匹配
    #podAntiAffinity: #亲和匹配
      requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchExpressions:	#匹配label为env 值为列出的test
          - key: env
            operator: In
            values:
            - test
        topologyKey: kubernetes.io/hostname

检查符合反亲和条件的pod,以及所在的node
在这里插入图片描述
匹配到pod为nginx-2,位于server4,运行配置文件部署pod,新建pod被部署到了server3

kubectl apply -f pod-af.yaml 

在这里插入图片描述

污点

在这里插入图片描述

kubectl taint nodes node1 key=value:NoSchedule	#创建污点
kubectl describe nodes  server1 |grep Taints #查询server1上的污点
kubectl taint nodes node1 key:NoSchedule-	#删除污点	

其中key=value:后接effect值,有三种选择项

NoSchedule:POD 不会被调度到标记为 taints 节点。
PreferNoSchedule:NoSchedule 的软策略版本。
NoExecute:该选项意味着一旦 Taint 生效,如该节点内正在运行的 POD 没有对应 Tolerate 设置,会直接被逐出。

部署nginx deployment示例:

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

应用deployment文件,查看调度情况
在这里插入图片描述默认全部调度至server3,为server3设置污点

kubectl taint node  server3 key1=v1:NoExecute

server3开始驱逐pod,在server4上重新拉起
在这里插入图片描述
在这里插入图片描述为pod设置容忍标签,部分被驱逐到server4的pod开始回归server3

      tolerations:
      - key: "key1"
        operator: "Equal"
        value: "v1"
        effect: "NoExecute"
kubectl apply -f deploy.yaml 

在这里插入图片描述
toleration示例:

tolerations: #匹配kv都符合并且effect为NoSch的node
- key: "key"
  operator: "Equal"
  value: "value"
  effect: "NoSchedule"
---
tolerations: # 匹配K存在且effect为NoSch的node
- key: "key"
  operator: "Exists"
  effect: "NoSchedule"
// ``如果 operator 为 Exists ,可以略去value。``
//``若operator为 Equal , key与value必须对应相等。``
 //``若不指定operator,则默认值为Equal。``
//``若不指定key,再配合Exists 就能匹配所有的key与value ,可以容忍所有污点。``
//``若不指定effect ,则匹配所有的effect。``

3. 暴力调度

影响Pod调度的指令还有:cordon、drain、delete,应用这些指令之后后续的pod都不会被调度至该节点

cordon

停止调度

影响最小,将节点标记为SchedulingDisabled,新创建的pod不会被调度到该节点,节点原有pod不受影响
kubectl cordon server3
kubectl uncordon server3

在这里插入图片描述

drain

驱逐节点

首先会驱逐该节点上的pod,在其他节点重建,然后将该节点标记为SchedulingDisabled。
kubectl drain server3
kubectl uncordon server3

在这里插入图片描述在这里插入图片描述在这里插入图片描述

delete

删除节点

首先驱逐节点上的pod,在其他节点重新创建,然后,从master节点删除该node 。如要恢复调度,需进入node节点,重启kubelet服务.
 kubectl delete node server3

在server3端

systemctl restart kubelet		#在删掉的节点重新启动kubelet 后可以恢复使用
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值