k8s污点及容忍度+实践

news2024/11/15 21:04:31

前言


因为实际工作种可能存在的需求:
1、同一功能的pod,需要调度到同一节点
2、一个pod需要部署n个副本,且同一节点上只能存在一个副本。
3、k8s避免不了设置节点不可调度,或清空一个node的所有pod
。。。。
根据具体需求,整理下k8s容器的污点及容忍度
环境准备:共三个node节点,master节点设置不可调度
192.168.220.110 master1
192.168.220.120 master2
192.168.220.130 master3
192.168.220.140 node1
192.168.220.150 node2
192.168.220.160 node3


一、标签、注解和污点

Kubernetes 将所有标签和注解保留在 kubernetes.io 和 k8s.io 名字空间中。

1、如何查询污点及一个容器或者工作负载的标签注解

a、通过describe命令查看一个节点的详细信息
kubectl describe node master1

在这里插入图片描述

kubectl get nodes -o yaml | grep taint -A 7  ## sts\deploy

在这里插入图片描述

2、标签查询修改

##获取pod
root@master1:/u01/yaml# kubectl get pod
NAME                       READY   STATUS    RESTARTS         AGE
busybox-86c9f49fdd-mf2tx   1/1     Running   48 (3m9s ago)    2d
busybox-86c9f49fdd-pthlg   1/1     Running   48 (3m12s ago)   2d
busybox-86c9f49fdd-sk9hk   1/1     Running   48 (3m9s ago)    2d

##显示容器的标签
root@master1:/u01/yaml# kubectl get pods busybox-86c9f49fdd-mf2tx  --show-labels 
NAME                       READY   STATUS    RESTARTS         AGE   LABELS
busybox-86c9f49fdd-mf2tx   1/1     Running   48 (3m24s ago)   2d    app=busybox,pod-template-hash=86c9f49fdd

##显示节点的标签
root@master1:/u01/yaml# kubectl get node node2 --show-labels 
NAME    STATUS   ROLES    AGE    VERSION    LABELS
node2   Ready    <none>   3d2h   v1.28.10   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node2,kubernetes.io/os=linux

##添加或修改标签
kubectl label pods <pod-name> <label-key>=<label-value>

kubectl label deployments mssh env=production
deployment.apps/mssh labeled

kubectl get deploy mssh -o yaml | grep -C 2 labels

  generation: 1
  labels:
    env: production
  name: mssh
--
    metadata:
      creationTimestamp: null
      labels:
        app: mssh



##删除标签
kubectl label pods <pod-name> <label-key>-

kubectl label deployments mssh env-
deployment.apps/mssh unlabeled
    metadata:
      creationTimestamp: null
      labels:
        app: mssh

二、污点和容忍度

容忍度(Tolerations)

— Node对Pod对象的排斥(effect)等级有3种:

  • NoSchedule:没有配置此污点容忍度的新Pod不能调度到此节点,节点上现存的Pod不受影响。(不允许调度)
  • PreferNoSchedule:没有配置此污点容忍度的新Pod尽量不要调度到此节点,如果找不到合适的节点,依然会调度到此节点。(优先不调度)
  • NoExecute:没有配置此污点容忍度的新Pod对象不能调度到此节点,节点上现存的Pod会被驱逐。(不允许运行)

— 容忍度操作符(operator)
在Pod上定义容忍度时,它支持两种操作符:Equal和Exists。

  • Equal:容忍度与污点必须在key、value和effect三者完全匹配。
  • Exists:容忍度与污点必须在key和effect二者完全匹配,容忍度中的value字段要使用空值。

##使用Equal的场景:

tolerations:
- key: "key"
  operator: "Equal"
  value: "value"
  effect: "NoExecute"

##使用Exists的场景:

tolerations:
- key: "key"
  operator: "Exists"
  effect: "NoExecute"

2、taint / label命令及解释

kubectl taint nodes <节点> key1=value1:NoSchedule
字段可选值:
    NoSchedule: 一定不能被调度
    PreferNoSchedule: 尽量不要调度
    NoExecute: 不仅不会调度, 还会驱逐Node上已有的Pod
kubectl label nodes node1 diskType=ssd
kubectl label nodes node2 diskType=ssd

kubectl get nodes --show-labels

kubectl get node -o yaml | grep taint -A 7

在这里插入图片描述

apiVersion: v1
kind: Pod
metadata:
  name: mssh
  labels:
    app: mssh
spec:
  nodeSelector:
    # 选择调度到具有这个label的节点
    "disktype": "ssd"
#    kubernetes.io/hostname: node2
  tolerations:
    - key: "disktype"
      operator: "Equal"
      value: "broken-disk"
      effect: "NoSchedule"
  containers:
    - name: mssh
      image: mssh-image

##查询节点的污点(Taints)

root@master1:/u01/yaml# kubectl describe node master1  | grep -i taint
Taints:             node.kubernetes.io/unschedulable:NoSchedule

root@master1:/u01/yaml# kubectl describe node node1  | grep -i taint
Taints:             <none>

三、为应用程序设置干扰预算(Disruption Budget)

— 用于限制在 Kubernetes 中某个应用程序的 Pod 被删除的速率,以确保在维护或节点故障期间不会影响应用程序的可用性。在设置干扰预算时,你可以指定允许同时终止的 Pod 的最大数量。

  • minAvailable: 指定了要保持的最小可用 Pod 数量。这个值可以是一个整数,表示要保持的 Pod 数量,或者是一个百分比字符串,表示要保持的 Pod 数量占总副本数的百分比。
  • maxUnavailable: 指定了在维护期间允许不可用的最大 Pod 数量。与 minAvailable 相反,它可以是整数或百分比字符串。如果设置了 minAvailable,则不应设置 maxUnavailable,反之亦然。
  • selector: 用于选择受影响的 Pod 的标签选择器。只有匹配这些标签的 Pod 才会受到干扰预算的影响。
apiVersion: policy/v1beta1
kind: PodDisruptionBudget
metadata:
  name: mssh-budget
spec:
  minAvailable: 4  # 设置最小可用数量为 4 个 Pod
  selector:
    matchLabels:
      app: mssh

四、实践是检验真理的唯一标准

1、创建busybox容器。

 cat busy-deploy.yaml 
 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: busybox
spec:
  selector:
    matchLabels:
      app: busybox
  replicas: 3
  template:
    metadata:
      labels:
        app: busybox
    spec:
      containers:
      - name: busybox
        image: busybox:1.32
        imagePullPolicy: IfNotPresent
        args:
        - /bin/sh
        - -c
        - sleep 3600
      imagePullSecrets:
      - name: default-secret

3、实例

我k8s中共3个node节点分别为node1、node2、node3,现在有3种pod(mssh,ddp,xxl)每个pod需要有6个副本,但是有以下几个条件:

a、mssh 三个副本必须在某个node节点上,假如被分配到node1
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mssh
spec:
  replicas: 3
  selector:
    matchLabels:
      app: mssh
  template:
    metadata:
      labels:
        app: mssh
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: kubernetes.io/hostname
                operator: In
                values:
                - node1
      containers:
      - name: mssh
        image: busybox:1.32
        imagePullPolicy: IfNotPresent
        args:
        - /bin/sh
        - -c
        - sleep 3600
      imagePullSecrets:
      - name: default-secret

b、ddp 三个副本同一个node节点不能有两个
apiVersion: apps/v1
kind: Deployment
metadata:
  name: ddp
spec:
  replicas: 3
  selector:
    matchLabels:
      app: ddp
  template:
    metadata:
      labels:
        app: ddp
    spec:
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values:
                - ddp
            topologyKey: "kubernetes.io/hostname"
      containers:
      - name: ddp
        image: busybox:1.32
        imagePullPolicy: IfNotPresent
        args:
        - /bin/sh
        - -c
        - sleep 3600
      imagePullSecrets:
      - name: default-secret

c、xxl 三个副本随机分配,但是不能与mssh在同一节点上
apiVersion: apps/v1
kind: Deployment
metadata:
  name: xxl
spec:
  replicas: 3
  selector:
    matchLabels:
      app: xxl
  template:
    metadata:
      labels:
        app: xxl
    spec:
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values:
                - mssh
            topologyKey: "kubernetes.io/hostname"
      containers:
      - name: xxl
        image: busybox:1.32
        imagePullPolicy: IfNotPresent
        args:
        - /bin/sh
        - -c
        - sleep 3600
      imagePullSecrets:
      - name: default-secret

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

NameSilo + Cloudflare 给网站加个域名(附 NameSilo 购买域名优惠码)

网站做好了之后,下一步就是买域名 在国内买域名的话,还需要备案,个人名下备案好像是还有限制,我就去 NameSilo 上面买的 在买之前,对比过几家 比如: godaddy/namecheap/cloudflare 本来是倾向于在 godaddy 上面买的,因为它支持支付宝支付,但是在详细看的时候,发现如果购买一年…

腾讯云COS上传文件出现的问题

1、没有配置 ObjectMetadata 的文件长度 腾讯云COS上传文件出现数据损坏问题_no content length specified for stream data. strea-CSDN博客 2、 使用 FileInputStream使用完没有及时关闭导致报错 ClientAbortException: java.nio.channels.ClosedChannelException 添加…

AI Agent:自主性、反应性与交互性的融合,将颠覆软件行业

Agent来袭&#xff1a;AI如何变身软件界的超级英雄&#xff1f; ©作者|Zhongmei 来源|神州问学 前言 “AI Agent不仅会彻底改变计算机的使用方式&#xff0c;它还将颠覆软件行业&#xff0c;是一个对科技行业的冲击波&#xff0c;是一场自‘输入命令到点击图标’变革之后…

266 基于matlab的FCM+KFCM模糊C均值聚类分析算法

基于matlab的FCMKFCM模糊C均值聚类分析算法&#xff0c;输入分割对象&#xff0c;对分割对象进行参数设置&#xff0c;包括分割类别数&#xff0c;核参数。输出分割结果。具有GUI操作界面。程序已调通&#xff0c;可直接运行。 266 FCM KFCM 模糊C均值聚类 GUI - 小红书 (xiaoh…

站内信设计

参考文章&#xff1a;https://cloud.tencent.com/developer/article/1684449 b站站内信业务设计&#xff1a; 消息的类型分为&#xff1a; 1、系统消息 2、、点赞、回复等用户行为之间的消息(事件提醒) 3、用户之间的消息 系统消息 用一个用户消息表可以吗&#xff1f; 可…

主副坐标轴作图(即双坐标轴)

主副坐标轴显示&#xff1a; import numpy as np from matplotlib import pyplot as plt plt.rcParams[font.sans-serif][SimHei] plt.rcParams[axes.unicode_minus] False xnp.arange(0.1,10,0.01) data1np.exp(x) data2np.log(x) fig,ax1plt.subplots() #subplots一定要带s…

室内也可以用北斗定位?还能用RTK?

室内卫星顾名思义&#xff0c;就是在室内有遮挡环境中的卫星定位技术&#xff0c;众所周知&#xff0c;目前全球几大GNSS定位系统已经很完善&#xff0c;但是GNSS有个致命的弱点&#xff0c;就是地面如果有遮挡就没有信号&#xff0c;在这样的条件下&#xff0c;在室内定位场景…

YOLOv8+PyQt5农作物杂草检测系统完整资源集合(yolov8模型,从图像、视频和摄像头三种路径识别检测,包含登陆页面、注册页面和检测页面)

农作物杂草检测YOLOV8(https://mbd.pub/o/bread/mbd-ZpaTl5tv)_哔哩哔哩_bilibili 资源包含可视化的农作物杂草检测系统&#xff0c;基于最新的YOLOv8训练的农作物杂草检测模型&#xff0c;和基于PyQt5制作的可视化农作物杂草检测系统&#xff0c;包含登陆页面、注册页面和检测…

免费,Python蓝桥杯等级考试真题--第15级(含答案解析和代码)

Python蓝桥杯等级考试真题–第15级 一、 选择题 答案&#xff1a;B 答案&#xff1a;D 解析&#xff1a;集合的并集运算有两种方式&#xff0c;一种是使用“|”运算符进行操作&#xff0c;另一种是使用union()方法来实现&#xff0c;故答案为D。 答案&#xff1a;A 解析&…

STM32启动过程分析

Keil堆栈设置注意事项 一、启动模式 复位方式&#xff1a;上电复位、硬件复位、软件复位 从地址0x0000 0000处取出堆栈指针MSP的初始值&#xff0c;该值就是栈顶地址。从地址0x0000 0004处取出程序计数器指针PC的初始值&#xff0c;该值指向复位后执行的第一条指令。 说白了就…

2024年【危险化学品经营单位安全管理人员】考试报名及危险化学品经营单位安全管理人员找解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 危险化学品经营单位安全管理人员考试报名考前必练&#xff01;安全生产模拟考试一点通每个月更新危险化学品经营单位安全管理人员找解析题目及答案&#xff01;多做几遍&#xff0c;其实通过危险化学品经营单位安全管…

ArcGIS基本操作-常用的空间分析工具梳理

ArcGIS空间分析工具使用 如果我们在进行科研时需要将研究区地形地貌作为一项指标的话&#xff0c;将可能遇到坡度、坡向、地形起伏度、地表切割深度等因子计算&#xff0c;下面我向大家介绍如何利于ArcGIS软件的空间分析工具&#xff0c;基于高程数据&#xff0c;分析重庆市的…

聊聊如何感知项目引入哪些功能特性

前言 使用过springcloud全家桶朋友&#xff0c;应该知道springcloud涉及的组件很多&#xff0c;为了让开发者快速了解项目引入了springcloud哪些组件&#xff0c;springcloud引入了HasFeatures&#xff0c;配合Actuator&#xff0c;可以让开发者感知到项目引入的组件功能类型、…

深度解析Nginx配置文件:从全局块到upstream块的探索之旅

Nginx配置文件的简介 在浩瀚的互联网世界中&#xff0c;Nginx就如同一座大型交通枢纽&#xff0c;将访问者的请求精准地引导到正确的服务终点。而这一切&#xff0c;都离不开一个神秘而重要的角色——Nginx配置文件。这个文件&#xff0c;就像是一份详尽的路线图&#xff0c;为…

leetCode.84. 柱状图中最大的矩形

leetCode.84. 柱状图中最大的矩形 题目思路 代码 class Solution { public:int largestRectangleArea( vector<int>& h ) {int n h.size();vector<int> left( n ), right( n );stack<int> st;// 求每个矩形的第一个小于左边界的矩形 - 用单调栈for ( …

大小字符判断

//函数int my_isalpha(char c)的功能是返回字符种类 //大写字母返回1&#xff0c;小写字母返回-1.其它字符返回0 //void a 调用my_isalpha()&#xff0c;返回大写&#xff0c;输出*&#xff1b;返回小写&#xff0c;输出#&#xff1b;其它&#xff0c;输出&#xff1f; #inclu…

回归自然:拥抱生态农业

在这个喧嚣的时代&#xff0c;我们渴望回归大自然的怀抱&#xff0c;享受那份纯净与安宁。广西生态农业&#xff0c;正是我们追寻自然、健康生活的理想选择。它摒弃了传统农业的弊端&#xff0c;采用环保、可持续的种植方式&#xff0c;为我们带来了绿色、无污染的农产品。生态…

关于python中屏蔽输出

python中屏蔽输出包含屏蔽标准输出&#xff08;比如打印出来的内容&#xff09;、屏蔽标准错误&#xff08;错误信息&#xff09;还有屏蔽logging信息等。 屏蔽标准输出 import contextlib import oswith open(os.devnull, "w") as devnull:with contextlib.redire…

内网渗透测试笔记

内网渗透流程&#xff1a;打通->拿权限->留后门->放后台->攻击其他人 msf小知识: setg->设置全局变量; 监听模块(必须掌握):exploit/multi/handler; 为什么很多时候优选选择meterpreter的载荷?因为这个是msf的集成工具,使用更快捷,方法和工具更多;例 如:ru…

【XR806开发板试用】基础篇,从零开始搭建一个LCD彩屏时钟(ST7735S驱动)

本文从搭建环境开始&#xff0c;step by step教大家使用XR806实现驱动SPI屏幕&#xff08;ST7735S驱动&#xff09;&#xff0c;并连接WiFi实现ntp对时&#xff0c;最终实现把时间显示到屏幕上。 #1. 搭建开发环境 1. 安装编译环境所需的依赖包 基于ubuntu 20.04&#xff0c;按…