2022-03-17 day104 kubernets pod调度

Node亲和性:POD调度到哪个Node上
软策略 尽量满足,如果不满足也行
硬策略 必须满足,不满足就调度不了

pod亲和性:pod和pod亲密性
软策略 尽量满足,如果不满足也行
硬策略 必须满足,不满足就调度不了

pod反亲和:
软策略 尽量满足,如果不满足也行
硬策略 必须满足,不满足就调度不了

image.png

查看文档


image.png
image.png
image.png

查看node标签
kubectl get node --show-labels


image.png

创建一个 Deployment资源类型的pod

cat >node-affinity.yml << 'EOF'
apiVersion: apps/v1                           #接口版本号
kind: Deployment                              #资源类型为 Deployment
metadata:                                         # Deployment类型的元数据
  name: node-affinity                        # Deployment类型元数据名称
  labels:                                            # Deployment类型元数据的标签
    app: node-affinity                         # Deployment类型元数据标签为 app: node-affinity
spec:                                                #定义pod的具体运行配置
  replicas: 4                                       #pod的副本数为4个
  selector:                                         #pod选择器
    matchLabels:                                #pod匹配的标签
      app: node-affinity                        #匹配pod具体标签app: node-affinity
  template:                                        #创建pod具体的配置模板
    metadata:                                     #创建pod的元数据
      labels:                                         #创建pod的标签
        app: node-affinity                     #创建pod的具体标签app: node-affinity
    spec:                                           #定义容器运行的配置
      containers:                                #容器参数
      - name: nginx                           #容器名称为nginx
        image: nginx:1.14.0                 #容器下载镜像
        ports:                                      #容器暴露的端口
        - containerPort: 80                  #容器暴露的具体端口
          name: nginx-dp                    #暴露端口定义一个名称
      affinity:                                      #定义亲和性
        nodeAffinity:               #node亲和性            
          requiredDuringSchedulingIgnoredDuringExecution:  #硬策略
            nodeSelectorTerms:                                                  #node选择器
            - matchExpressions:                          #匹配规则
              - key: kubernetes.io/hostname       #node节点标签
                operator: NotIn                         #匹配操作符notin即label不在里面
                values:                                 #标签值
                - master
          preferredDuringSchedulingIgnoredDuringExecution:   #软策略
          - weight: 1                                                                    #增加权重
            preference:                             #偏好
              matchExpressions:                #匹配表达
              - key: disktype                         #值为disktype
                operator: In                           #匹配操作符在里面
                values:                                  #标签值
                - SSD                                  #SSD
EOF
image.png
image.png

给node2添加标签
kubectl label nodes node2 disktype=ssd


image.png
image.png

清除node2标签
kubectl label nodes node2 disktype-


image.png

pod亲和性实验

cat >nginx-pod-affinity.yaml <<'EOF'
apiVersion: apps/v1                                        #接口版本
kind: Deployment                                #资源类型为depolyment
metadata:                                             #dp资源类型的元数据
  name: nginx-dp                                  #dp资源类型的名字
  labels:                                                #dp资源的标签
    app: nginx-dp                                  #dp资源的具体标签
spec:                                                  #定义pod具体运行的配置
  replicas: 5                                        #定义pod运行的具体副本数为5
  selector:                                           #定义pod运行选择器
    matchLabels:                                 #pod运行匹配标签
      app: nginx-dp                              #pod具体标签为app:nginx-dp
  template:                                        #创建pod具体运行模板
    metadata:                                   #创建的pod元数据
      labels:                                      #创建的pod的标签
        app: nginx-dp                      #创建pod的具体标签为app:nginx-dp
    spec:                                      #定义容器运行的具体配置
      containers:                            #定义容器
      - name: nginx-dp                 #定义容器名为nginx-dp
        imagePullPolicy: IfNotPresent          #容器镜像下载方式
        image: nginx                                   #下载镜像的名称nginx
        ports:                                               #定义pod暴露的端口
        - name: http                                   #定义暴露的端口的名字为http
          containerPort: 80                        #定义容器暴露的端口为80
      affinity:                                          #亲和性
        podAffinity:                                 #pod亲和
          requiredDuringSchedulingIgnoredDuringExecution:   #亲和硬策略
          - labelSelector:                                                       #标签选择
              matchExpressions:                                         #匹配方式
              - key: app                                                    #值为app
                operator: In                                             #操作方式in要存在
                values:                                            #值
                - redis                                              #值为redis
            topologyKey: kubernetes.io/hostname    #拓扑域值

EOF
image.png

image.png

topology 拓扑拓扑结构意思
pod亲和性调度需要各个相关的pod对象运行于"同一位置", 而反亲和性调度则要求他们不能运行于"同一位置",

这里指定“同一位置” 是通过 topologyKey 来定义的,topologyKey 对应的值是 node 上的一个标签名称,比如各别节点zone=A标签,各别节点有zone=B标签,pod affinity topologyKey定义为zone,那么调度pod的时候就会围绕着A拓扑,B拓扑来调度,而相同拓扑下的node就为“同一位置”。

如果基于各个节点kubernetes.io/hostname标签作为评判标准,那么很明显“同一位置”意味着同一节点,不同节点既为不同位置


image.png

注意:拓扑域就是匹配一个公共的node节点标签,kubernetes.io/hostname在这个范围找,用其他也行

反亲和实验:
反亲和文档


image.png

注意:只有pod反亲和,没有node


image.png

安全删除节点

驱逐节点的流程
1)首先设置新的POD创建任务不可被调度到需要维护的节点
2)给需要维护的节点打上驱逐标签,这个时候维护节点上的POD都会被赶走
3)清空节点
4)k8s安全删除节点

具体操作:
1.设置不可被调度
kubectl cordon node2

2.给node2打驱逐标签
kubectl taint nodes node2 fuckoff=node2:NoExecute

3.清空节点
kubectl drain node2

此时会报错

node/node2 already cordoned
error: unable to drain node "node2", aborting command...

There are pending nodes to be drained:
node2
error: cannot delete DaemonSet-managed Pods (use --ignore-daemonsets to ignore): kube-system/kube-proxy-ggvl4

忽略daemonsets类型的pod

kubectl drain node2 --ignore-daemonsets

4.k8s安全删除节点
kubectl delete nodes node2

节点被删除后重新添加到集群的步骤

已经被删除的节点想重新加回来咋办?

需要清理的地方:kubeadm安装的情况
1)kubeadm重置
kubeadm reset

2)清理防火墙规则
iptables -F
iptables -Z
iptables -X
iptables -F -t nat
iptables -Z -t nat
iptables -X -t nat
ipvsadm --clear

3)清理网卡及网络信息
rm -rf /etc/cni/net.d
rm -rf /var/run/flannel/
ifconfig cni0 down
ip link delete cni0

4)重启docker和kubelet
systemctl restart docker

5)master节点重新生成token
kubeadm token create --print-join-command

6)重新加入集群
kubeadm join 10.0.0.10:6443 --token 9qnr65.e6nxrx9z4nahewgp --discovery-token-ca-cert-hash sha256:b53c91fc32f932f01428e6d145f845e2c12ade4f0999df150281ab3e07b94d1a

7)给节点打标签
kubectl label nodes node2 node-role.kubernetes.io/node=

8)创建POD测试

驱逐节点

驱逐节点的流程
1)首先设置新的POD创建任务不可被调度到需要维护的节点
2)给需要维护的节点打上驱逐标签,这个时候维护节点上的POD都会被赶走
3)安全下线节点进行维护
4)维护完成后,将节点的驱逐污点删除
5)恢复可以被调度

具体操作:
1.设置不可被调度
kubectl cordon node2
cordon 警戒的意思

2.给node2打驱逐标签
kubectl taint nodes node2 fuckoff=node2:NoExecute
NoExecute 不执行
node节点上已经有运行pod,就会让pod驱逐掉
而NoSchedule,创建pod的时候,就不会被调度过来


image.png

image.png

3.安全下线节点进行维护

4.维护完成后,将节点的驱逐污点删除
kubectl taint nodes node2 fuckoff-

image.png
image.png

5.恢复可以被调度
kubectl uncordon node2


image.png

污点和容忍

注意:node也有反亲和,但是不能这样叫,只能被称为污点

查看node节点的taints污点信息
查看master污点情况
kubectl describe nodes master


image.png

解释:Taints: node-role.kubernetes.io/master:NoSchedule
拥有这个节点node-role.kubernetes.io/master标签的,不要被调度过来

查看node1污点情况


image.png

node1是没有污点的

1.添加污点写法
kubectl taint nodes 节点名称 污点名字=值:效果

1.给node2打污点
kubectl taint nodes node2 test=node2:NoSchedule

2.查看效果
kubectl describe nodes node2|grep Taints

image.png

清除node2节点上的污点
kubectl taint nodes node2 test-


image.png

3.创建没有容忍的pod

cat >nginx-dp.yml<<'EOF'
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-dp
  labels:
    app: nginx-dp
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx-dp
  template:
    metadata:
      name: nginx-dp
      labels:
        app: nginx-dp
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.0
        imagePullPolicy: IfNotPresent
        ports:
        - name: http
          containerPort: 80
EOF
image.png

4.查看效果
kubectl get pod -o wide

6.创建有容忍的POD
Pod的Toleration⽣命的key和effect需要和Taint的设置保持⼀致,并且满⾜以下条件之⼀。
如果operator的值是Exists,则value的属性可以省略。
如果operator的值是Equal,则表示其key和value之间的关系是等于。
如果不指定operator的属性,则默认为Equal。

cat >nginx-taint-dp.yml<<'EOF'
apiVersion: apps/v1                                          #接口版本
kind: Deployment                               #资源类型为deployment
metadata:                                              #dp资源的元数据
  name: nginx-dp                                     #dp资源名字为nginx-dp
  labels:                                                   #dp资源的标签
    app: nginx-dp                                #dp资源具体标签为app: nginx-dp
spec:                                             #定义pod的运行配置
  replicas: 2                                #pod副本数为2
  selector:                                  #定义pod选择器
    matchLabels:                       #定义pod的匹配标签
      app: nginx-dp                      #定义pod的具体标签为app: nginx-dp
  template:                            #创建pod的运行配置
    metadata:                  #创建pod运行配置的模板
      name: nginx-dp        #创建pod的名称
      labels:                          #创建pod的标签
        app: nginx-dp          #创建pod 的具体标签
    spec:                           #创建容器的具体配置
      containers:            #创建容器
      - name: nginx        #创建容器名
        image: nginx:1.14.0  #创建容器下载镜像
        imagePullPolicy: IfNotPresent #下载镜像方式
        ports:                              #容器暴露的端口
        - name: http                   #给暴露端口起一个名字
          containerPort: 80      #暴露容器具体的端口为80
      #tolerations:                    #容忍度
      #- key: "test"                     #键值为test,kubectl taint nodes node2 test=node2:NoSchedule
      #  operator: "Equal"           #操作员其key和value之间的关系是等于
      #  value: "node2"             #值为node2
      #  effect: "NoSchedule"   #effect就是容忍的意思,容忍NoSchedule这个操作
      tolerations:
      - key: "test"
        operator: "Exists"
        effect: "NoSchedule"
EOF

toleration 容忍度
effect 效果影响

image.png

5.查看效果
kubectl get pod -o wide

6.容忍字段解释
第一种写法:精确匹配到污点的键值,再容忍
tolerations:

  • key: "test"
    operator: "Equal"
    value: "node2"
    effect: "NoSchedule"

第二种写法:只要存在这个污点,无论value是什么,都容忍
tolerations:

  • key: "test"
    operator: "Exists"
    effect: "NoSchedule"

注意:打污点可以驱逐节点上面的pod

你可能感兴趣的:(2022-03-17 day104 kubernets pod调度)