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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,076评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,658评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,732评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,493评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,591评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,598评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,601评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,348评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,797评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,114评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,278评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,953评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,585评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,202评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,442评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,180评论 2 367
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,139评论 2 352

推荐阅读更多精彩内容

  • 污点、容忍度 给了节点选则的主动权,我们给节点打一个污点,不容忍的 pod就运行不上来,污点就是定义在 节点上的键...
    菜头_355f阅读 718评论 0 2
  • 1 Pod - 实例 Pod是一组紧密关联的容器集合,支持多个容器在一个Pod中共享网络和文件系统,可以通过进程间...
    HankerCloud2019阅读 282评论 0 0
  • taint kubectl taint nodes node1 foo=bar:NoSchedule -- 某个节...
    minute_5阅读 1,756评论 0 5
  • K8S一、二进制搭建1.安装要求(1)CentOS 7(2)禁止swap(3)集群间互通 2.操作系统初始化(1)...
    Saka_2859阅读 389评论 0 0
  • 命令汇总查看 命令描述kubectl get svc/services获取 创建的services信息kubect...
    奔跑De猪阅读 609评论 0 0