kubernetes-Pod基于污点、容忍度、亲和性的多种调度策略(二)

Pod调度策略

  • 一.污点-Taint
  • 二.容忍度-Tolerations
  • 三.Pod常见状态和重启策略
    • 1.Pod常见状态
    • 2.Pod的重启策略
      • 2.1测试Always重启策略
      • 2.2测试Never重启策略
      • 2.3测试OnFailure重启策略(生产环境中常用)

一.污点-Taint

在 Kubernetes 中,污点(Taint)是一种标记,用于标识一个Node节点上的某些资源或条件不可用或不可接受。当一个节点被标记了污点后,只有那些能够容忍该污点的 Pod 才能被调度到该节点上。

污点常用与以下场景:

  • 将某些节点标记为“故障”,以防止新的 Pod 被调度到这些节点上;
  • 将某些节点标记为“高负载”,以防止过多的 Pod 被调度到这些节点上,导致节点过载;
  • 将某些节点标记为“专用”,以保证只有特定的 Pod 能够被调度到这些节点上。

pod亲和性是pod属性;但是污点是节点的属性,污点定义在k8s集群的节点上的一个字段。

# 查看控住节点定义的污点
[root@master1]# kubectl describe nodes master1 | grep Taints
Taints:             node-role.kubernetes.io/control-plane:NoSchedule
 
# 两个工作节点是没有定义污点
[root@node1]# kubectl describe nodes node1 | grep Taints
Taints:             <none>
 
[root@node2]# kubectl describe nodes node2 | grep Taints
Taints:             <none>

1.查看定义taint的信息

# 查看帮助命令
[root@master1]# kubectl explain node.spec
······
   taints	<[]Object>
     If specified, the node's taints.
[root@master1]# kubectl explain node.spec.taints
KIND:     Node
VERSION:  v1
RESOURCE: taints <[]Object>
DESCRIPTION:
     If specified, the node's taints.
 
     The node this Taint is attached to has the "effect" on any pod that does
     not tolerate the Taint.
 
FIELDS:
   effect	<string> -required-
     Required. The effect of the taint on pods that do not tolerate the taint.
     Valid effects are NoSchedule, PreferNoSchedule and NoExecute.
 
     Possible enum values:
     - `"NoExecute"` Evict any already-running pods that do not tolerate the
     taint. Currently enforced by NodeController.
     - `"NoSchedule"` Do not allow new pods to schedule onto the node unless
     they tolerate the taint, but allow all pods submitted to Kubelet without
     going through the scheduler to start, and allow all already-running pods to
     continue running. Enforced by the scheduler.
     - `"PreferNoSchedule"` Like TaintEffectNoSchedule, but the scheduler tries
     not to schedule new pods onto the node, rather than prohibiting new pods
     from scheduling onto the node entirely. Enforced by the scheduler.
 
   key	<string> -required-
     Required. The taint key to be applied to a node.
 
   timeAdded	<string>
     TimeAdded represents the time at which the taint was added. It is only
     written for NoExecute taints.
 
   value	<string>
     The taint value corresponding to the taint key.

污点排斥等级:

  • NoSchedule:表示Pod不会被调度到具有该污点的节点上,不影响已经存在的Pod
  • PreferNoSchedule:表示调度器会尽量避免将Pod调度到具有该污点的节点上。(但是Pod没有定义容忍度,依然会被调度到这两个节点上)
  • NoExecute:既影响Pod调度过程,又影响现存Pod对象,如果现存Pod不能容忍节点加的污点,那么这个Pod就会被驱逐

2.定义污点

kubectl taint nodes node1 node-type=dev:NoSchedule

3.查看污点

kubectl describe nodes node1 | grep Taint

4.删除污点

kubectl taint nodes node1 node-type=dev:NoSchedule-

二.容忍度-Tolerations

当我们节点定义污点后,如果我们不定义对应的容忍度,那么Pod将不会调度到此Node节点。

方便下面实验,我把所有node节点全部定义上污点

kubectl taint nodes node1 node-type=dev:NoSchedule
kubectl taint nodes node2 node-type=dev:NoSchedule

查看容忍度的帮助:

kubectl explain pod.spec.tolerations

1.定义Pod容忍度,容忍node-type=dev,且排斥等级等于NoExecute,使用了operator=Equal这三点必须同时能满足。

cat pod1.yml 
---
apiVersion: v1
kind: Pod
metadata:
  name: pod1
  namespace: default
  labels:
    app: nginx
    env: dev

spec:
  tolerations:
  - effect: "NoExecute"   # 指定排斥等级
    key: "node-type"      # 污点key
    operator: "Equal"     # Equal表示等于
    value: "dev"          # 污点value
    tolerationSeconds: 3600 # 删除Pod前等待时间,默认30s

  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent
    ports:
    - containerPort: 80

执行文件

kubectl  apply  -f pod1.yaml

查看状态,因为没有任何节点满足该Pod容忍,所以该Pod处于Pending状态

kubectl get pods pod1

NAME    READY   STATUS    RESTARTS   AGE
pod1    0/1     Pending   0          10m

2.定义Pod容忍度,将排斥等级改为 NoSchedule,这样我们污点key,value,排斥等级都满足了,Pod才会调度 Pod资源清单文件如下:

cat pod2.yml 
---
apiVersion: v1
kind: Pod
metadata:
  name: pod2
  namespace: default
  labels:
    app: nginx
    env: dev

spec:
  tolerations:
  - effect: "NoSchedule"  # 指定排斥等级
    key: "node-type"      # 污点key
    operator: "Equal"     # Equal表示等于
    value: "dev"          # 污点value

  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent
    ports:
    - containerPort: 80

执行文件

kubectl apply -f pod2.yaml

查看状态,Pod成功调度,且状态为 Running

kubectl get pods pod2

NAME    READY   STATUS    RESTARTS   AGE
pod2    1/1     Running   0          5m32s

3.定义Pod容忍度,将 operator=Exists表示满足其中一项即可容忍,下面Pod没有定义key,value,表示没有key,value方面限制,容忍排斥等级=NoSchedule的节点。

cat pod3.yml 
---
apiVersion: v1
kind: Pod
metadata:
  name: pod3
  namespace: default
  labels:
    app: nginx
    env: dev

spec:
  tolerations:
  - effect: "NoSchedule"  # 指定排斥等级 
    operator: "Exists"    # Exists表示满足一项即可

  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent
    ports:
    - containerPort: 80

执行文件

kubectl  apply -f pod3.yaml

查看状态,Pod调度成功,且状态为Running

kubectl get pods pod-3

NAME    READY   STATUS    RESTARTS   AGE
pod3   1/1     Running   0          5m16s

三.Pod常见状态和重启策略

1.Pod常见状态

在这里插入图片描述
第一阶段:

  • 挂起(Pending):
    • 正在创建Pod,但是Pod中的容器还没有全部被创建完成,处于此状态的Pod应该检查Pod依赖的存储是否有权限挂载、镜像是否可以下载、调度是否正常等;
    • 我们在请求创建pod时,条件不满足,调度没有完成,没有任何一个节点能满足调度条件,已经创建了pod但是没有适合它运行的节点叫做挂起,调度没有完成。
  • 失败(Failed):Pod 中的所有容器都已终止了,并且至少有一个容器是因为失败终止。也就是说,容器以非0状态退出或者被系统终止。
  • 未知(Unknown):未知状态,所谓pod是什么状态是apiserver和运行在pod节点的kubelet进行通信获取状态信息的,如果节点之上的kubelet本身出故障,那么apiserver就连不上kubelet,得不到信息了,就会看Unknown,通常是由于与pod所在的node节点通信错误。
  • Error 状态:Pod 启动过程中发生了错误
  • 成功(Succeeded):Pod中的所有容器都被成功终止,即pod里所有的containers均已terminated。

第二阶段:

  • Unschedulable:Pod不能被调度, scheduler没有匹配到合适的node节点PodScheduled:pod正处于调度中,在scheduler刚开始调度的时候,还没有将pod分配到指定的node,在筛选出合适的节点后就会更新etcd数据,将pod分配到指定的node
  • Initialized:所有pod中的初始化容器已经完成了
  • ImagePullBackOff:Pod所在的node节点下载镜像失败
  • Running:Pod内部的容器已经被创建并且启动。

扩展:还有其他状态,如下:

  • Evicted状态:出现这种情况,多见于系统内存或硬盘资源不足,可df-h查看docker存储所在目录的资源使用情况,如果百分比大于85%,就要及时清理下资源,尤其是一些大文件、docker镜像。
  • CrashLoopBackOff:容器曾经启动了,但可能又异常退出了。如pod一直在重启

2.Pod的重启策略

Pod的重启策略(RestartPolicy)应用于Pod内的所有容器,当某个容器异常退出或者健康检查失败时,kubelet将根据 重启策略来进行相应的操作。

    Pod 的 spec 中包含一个 restartPolicy 字段,其可能取值包括 Always、OnFailure 和 Never。默认值是 Always。
  • Always:只要容器异常退出,kubelet就会自动重启该容器。(这个是默认的重启策略)
  • OnFailure:当容器终止运行且退出码不为0时,由kubelet自动重启该容器。(生产环境中常用)
  • Never:不论容器运行状态如何,kubelet都不会重启该容器。

2.1测试Always重启策略

[root@master1]# vim pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: demo-pod
  namespace: default
  labels:
    app: myapp
spec:
  restartPolicy: Always
  containers:
  - name:  tomcat
    ports:
    - containerPort: 8080
    image: tomcat:latest
    imagePullPolicy: IfNotPresent
 
[root@master1]# kubectl apply -f pod.yaml 
pod/demo-pod created
[root@master1]# kubectl get pods -o wide 
NAME       READY   STATUS    RESTARTS   AGE   IP               NODE        NOMINATED NODE   READINESS GATES
demo-pod   1/1     Running   0          10s   10.244.169.153     node2      <none>           <none>
 
# 动态显示pod状态信息
[root@master1]# kubectl get pods -o wide -w
NAME       READY   STATUS    RESTARTS   AGE   IP               NODE        NOMINATED NODE   READINESS GATES
demo-pod   1/1     Running   0          22s   10.244.169.153   node2       <none>           <none>
 
# 另起一个终端会话,进入pod内部容器,正常停止 tomcat 容器服务。-c 指定容器名称。
[root@master1]# kubectl exec -it demo-pod -c tomcat -- bash
root@demo-pod:/usr/local/tomcat# ls
root@demo-pod:/usr/local/tomcat# bin/shutdown.sh 

可以看到容器服务停止后被重启了一次,Pod又恢复正常

# 非正常停止容器里的tomcat服务
[root@master1]# kubectl exec -it demo-pod -c tomcat -- bash
root@demo-pod:/usr/local/tomcat# ps -ef | grep tomcat
root@demo-pod:/usr/local/tomcat# kill 1

容器被终止,再一次重启,重启次数加一

2.2测试Never重启策略

# 修改 pod.yaml,把 Always 改为 Never
[root@master1]# kubectl delete pods demo-pod 
pod "demo-pod" deleted
[root@master1]# kubectl apply -f pod.yaml 
pod/demo-pod created
[root@master1]# kubectl get pods -o wide -w
 
# 在另一个终端进入容器,正常停止服务
[root@master1]# kubectl exec -it demo-pod -c tomcat-pod-java -- bash
root@demo-pod:/usr/local/tomcat# bin/shutdown.sh 

查看Pod状态,发现正常停止tomcat服务,Pod正常运行,但是容器没有重启

# 非正常停止容器里的tomcat服务
[root@master1]# kubectl delete pods demo-pod 
pod "demo-pod" deleted
[root@master1]# kubectl apply -f pod.yaml 
pod/demo-pod created
[root@master1]# kubectl get pods -o wide -w
 
# 在另一终端进入容器内容
[root@master1]# kubectl exec -it demo-pod -c tomcat-pod-java -- bash
root@demo-pod:/usr/local/tomcat# kill 1

看到容器的状态时Pod的状态是Error,并且没有重启,说明重启策略是Never,那么Pod里容器服务无论如何终止,都不会重启

2.3测试OnFailure重启策略(生产环境中常用)

# 修改 pod.yaml 文件,把 Never 改为 OnFailure
[root@master1]# kubectl delete pods demo-pod 
pod "demo-pod" deleted
[root@-master1]# kubectl apply -f pod.yaml 
pod/demo-pod created
[root@master1]# kubectl get pods -o wide -w
 
# 在另一终端进入容器内部,正常停止服务
[root@master1]# kubectl exec -it demo-pod -c tomcat-pod-java -- bash
root@demo-pod:/usr/local/tomcat# bin/shutdown.sh

发现正常通知容器,退出码时0,容器不会重启

# 非正常停止容器里的tomcat服务
[root@master1]# kubectl delete pods demo-pod 
pod "demo-pod" deleted
[root@master1]# kubectl apply -f pod.yaml 
pod/demo-pod created
[root@master1]# kubectl get pods -o wide -w
 
# 在另一终端进入容器内部
[root@master1]# kubectl exec -it demo-pod -c tomcat-pod-java -- bash
root@demo-pod:/usr/local/tomcat# kill 1

看到非正常停止的pod里的容器,容器退出码不是0,容器会被重启。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/495860.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Data-driven ADP schemes for non-zero-sum games of unknown DT nonlinear systems

Data-driven adaptive dynamic programming schemes for non-zero-sum games of unknown discrete-time nonlinear systems&#xff0c;2018&#xff0c; He Jiang, Huaguang Zhang∗, Kun Zhang, Xiaohong Cui 博弈论、最优控制和强化学习解决离散时间 multi-player 非零和博…

【Qt】QDialog对话框

目录 一、概念 二、对话框的分类 2.1 模态对话框 2.2 非模态对话框 2.3 混合属性对话框 三、消息对话框QMessageBox 四、颜色对话框QColorDialog 五、文件对话框QFileDialog 六、字体对话框QFontDialog 七、输入对话框QInputDialog 一、概念 对话框是GUI程序中不可或…

Django 评论楼创建

Django 评论楼创建 【零】最终效果预览 【一】介绍 &#xff08;1&#xff09;情况说明 在Django模型层中有这么个字段 parent models.ForeignKey(toself, on_deletemodels.CASCADE, verbose_name"父评论ID", nullTrue, blankTrue)这个字段是一对多的外键字段 其…

Redis入门到实战-第十九弹

Redis实战热身Count-min-sketch篇 完整命令参考官网 官网地址 声明: 由于操作系统, 版本更新等原因, 文章所列内容不一定100%复现, 还要以官方信息为准 https://redis.io/Redis概述 Redis是一个开源的&#xff08;采用BSD许可证&#xff09;&#xff0c;用作数据库、缓存、…

验证码demo(简单实现)

前言 我们注意到我们登录网站的时候经常会用到网络验证码,今天我们就简单实现一个验证码的前后端交互问题,做一个小demo 准备 我们这里并不需要依靠原生的java来实现,而是只需要引入一个maven依赖,使用现成的封装好的即可,这是我使用的是hutool工具包 网址:Hutool&#x1f36c;…

MySQL 8:GROUP BY 问题解决 —— 怎么关闭ONLY_FULL_GROUP_BY (详细教程)

在使用 GROUP BY 时&#xff0c;我们可能会遇到以下报错&#xff1a; Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column …… 这是因为我们在select语句中所查询的列并不被group by后面接的列所包含。 对于GROUP BY聚合操作&#xf…

油缸位置传感器871D-DW2NP524-N4

概述 油缸位置传感器是一种使用电感原理来检测物体接近的开关装置。它通过感应物体的电磁场来判断物体的位置&#xff0c;并将信号转化为电信号输出。当物体靠近或远离电感式接近开关时&#xff0c;物体的电磁场会改变&#xff0c;从而使接近开关产生不同的信号输出。电感式接…

Go —— defer

defer defer 语句用于延迟函数的调用&#xff0c;常用于关闭文件描述符、释放锁等资源释放场景。但 defer 关键字只能作用于函数或函数调用。 defer func(){ // 函数fmt.Print("Hello&#xff0c;World!") }()defer fmt.Print("Hello&#xff0c;World!&…

如何在CentOS安装可视化Docker容器管理工具Portainer并无公网IP远程管理

文章目录 前言1. 部署Portainer2. 本地访问Portainer3. Linux 安装cpolar4. 配置Portainer 公网访问地址5. 公网远程访问Portainer6. 固定Portainer公网地址 前言 Portainer 是一个轻量级的容器管理工具&#xff0c;可以通过 Web 界面对 Docker 容器进行管理和监控。它提供了可…

智慧公厕,为智慧城市建设注入了新的活力

随着智慧城市的快速发展&#xff0c;公共厕所不再是简单的功能设施&#xff0c;而是成为了提升城市形象、改善民生服务的重要一环。智慧公厕作为新形态的公共厕所&#xff0c;通过精准监测公厕内部的人体活动状态、人体存在状态、空气质量情况、环境变化情况、设施设备运行状态…

Occupancy 后处理

文章目录 bev坐标与自车坐标转换如何创建旋转矩阵 (R_veh) 偏航3D Voxel -> 2D Grid 在进行占据空间&#xff08;occupancy&#xff09;后处理时&#xff0c;需要将不同感知模块的输出进行综合融合&#xff0c;以实现更精确的空间占据和环境感知。以下是针对您提到的几个方面…

Java代码基础算法练习-求一个三位数的各位数字之和-2024.03.27

任务描述&#xff1a; 输入一个正整数n&#xff08;取值范围&#xff1a;100<n<1000&#xff09;&#xff0c;然后输出每位数字之和 任务要求&#xff1a; 代码示例&#xff1a; package M0317_0331;import java.util.Scanner;public class m240327 {public static voi…

LangChain入门:2.OpenAPI调用ChatGPT模型

引言 在本文中&#xff0c;我们将带您深入探索如何通过OpenAPI与ChatGPT模型进行高效交互&#xff0c;实现智能文本问答功能。通过LangChain库的实践&#xff0c;您将学习构建一个能够与用户进行自然语言对话的系统的关键步骤。 准备步骤 在动手编码之前&#xff0c;请确保您…

Linux之进程控制进程终止进程等待进程的程序替换替换函数实现简易shell

文章目录 一、进程创建1.1 fork的使用 二、进程终止2.1 终止是在做什么&#xff1f;2.2 终止的3种情况&&退出码的理解2.3 进程常见退出方法 三、进程等待3.1 为什么要进行进程等待&#xff1f;3.2 取子进程退出信息status3.3 宏WIFEXITED和WEXITSTATUS&#xff08;获取…

从零开始的软件开发实战:互联网医院APP搭建详解

今天&#xff0c;笔者将以“从零开始的软件开发实战&#xff1a;互联网医院APP搭建详解”为主题&#xff0c;深入探讨互联网医院APP的开发过程和关键技术。 第一步&#xff1a;需求分析和规划 互联网医院APP的主要功能包括在线挂号、医生预约、医疗咨询、健康档案管理等。我们…

2024河北煤炭装备展览会|河北采煤装备展会|河北煤博会

2024中国&#xff08;石家庄&#xff09;国际煤炭装备及矿山设备博览会 时间&#xff1a;2024年7月4-6日 地点&#xff1a;石家庄国际会展中心.正定在快速发展的科技时代&#xff0c;能源行业始终是国家发展的重要支柱。作为传统的能源巨头&#xff0c;煤炭产业在面临转型升…

jdk8中的Arrays.sort

jdk8中Arrays.sort 这里可以看到根据传入数组类型的不同&#xff0c;排序的算法是由区别的。 拆分解析 我们在平时引用的时候&#xff0c;一般只会传入一个数组&#xff0c;但是真正调用的时候&#xff0c;参数会进行补全。 public static void sort(int[] a) {DualPivotQui…

获奖喜讯 | 思迈特软件蝉联双奖,品牌及产品实力再获认可

近期&#xff0c;思迈特软件又传来获奖捷报&#xff0c;凭借出色的产品力及品牌实力&#xff0c;思迈特软件Smartbi一站式大数据分析平台荣登2023ToB头条影响力价值榜“创新力产品TOP50”榜单&#xff0c;又获广东省云计算应用协会“2023年度大数据创新企业奖”。 荣登“ToB行业…

贪心算法--最大数

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 本题链接https://leetcode.cn/problems/largest-number/description/ class Solution { public:bool static compare(int a, int b){return (to_string(a) to_string(b)) > (to_string(b) to_string(a));}bool operato…

爱思助手验机不靠谱?

1.骗子只能骗的一种人就是有点懂 因为完全不懂的不会感兴趣 骗不到 太懂的人 基本属于猴精的人 你骗不到 2. 3.基本做的是翻新机 维修过的 4。转载 爱思助手验机不靠谱&#xff1f;“报告全绿”已成奸商的阴谋 - 知乎