K8s学习四(资源调度_1)

news2024/11/23 22:52:40

资源调度

  • 发现对Pod操作不方便,不能直接操作,而且不能直接编辑,需要对原来的配置文件进行操作,而且需要删除之后再创建Pod,不方便,更多是通过控制器来操作。

Label和Selector

  • 通过设置标签和选择器来确定需要的资源,如果是kubectl get po,就是Pod,这里的po可以替换成其他资源,如deploy。
Label
  • label,标签可以在配置文件或者命令行kubectl中设置
  • 命令行中,有下面的命令:
# 创建临时label
kubectl label po <资源名称> app=hello

# 修改已经存在的标签
kubectl label po <资源名称> app=hello2 --overwrite

# 查看label

# selector 按照 label 单值查找节点
kubectl get po -A -l app=hello

# selector 按照 label 多值查找节点,也可以不等查找
kubectl get po -A -l test=1.0.0,type=app
kubectl get po -A -l test=1.0.0,app!=hello

# selector 按照 label 选择多值查找节点,引号必须有,避免歧义
kubectl get po -A -l 'test in (1.0.0,1.0.1),type=app'


# 查看所有节点的 labels
kubectl get po --show-labels

# selector 按照 label 综合查找节点
kubectl get po -A -l app=hello --show-labels

# - 是 -- 命令的缩写,例如,-l 是 --label 的缩写,-A 是 --all-namespaces 的缩写。
Selector
  • 进行选择对应的资源
  • 可以在配置文件中配置,在各对象的配置 spec.selector 或其他可以写 selector 的属性中编写
  • 也可以在kubectl命令中:
# 匹配单个值,查找 app=hello 的 pod
kubectl get po -A -l app=hello

# 匹配多个值
kubectl get po -A -l 'k8s-app in (metrics-server, kubernetes-dashboard)'


# 查找 version!=1 and app=nginx 的 pod 信息
kubectl get po -l version!=1,app=nginx

# 不等值 + 语句
kubectl get po -A -l version!=1,'app in (busybox, nginx)'

  • 一些命令演示如下:
    在这里插入图片描述

Deployment(无状态)

  • deployment的嵌套关系如下:
    在这里插入图片描述

  • 这里replicationcontroller已经逐步被替代,因为replicaset可以用selector来选择。

功能
创建
  • 先用命令行创建一个nginx的deployment,运行kubectl create deploy nginx-deploy --image=nginx:1.7.9

  • 然后查看deploy,replicaset和Pod,会发现像上面介绍的是一层一层嵌套关系,如下:-
    在这里插入图片描述

  • 执行kubectl get po,rs,deploy --show-labels得到:
    在这里插入图片描述

  • 创建的yaml文件:

apiVersion: apps/v1 # deployment api版本
  kind: Deployment # 资源类型为deployment
  metadata: # 元信息
    labels: # deploy标签
      app: nginx-deploy
    name: nginx-deploy # deploy的名字
    namespace: default # 所在的命名空间
  spec:
    replicas: 1 # 期望的副本数
    revisionHistoryLimit: 10 # 进行滚动更新后,保留的历史版本数
    selector: # 选择器,用于找到匹配的RS
      matchLabels: # 按照标签匹配
        app: nginx-deploy # 匹配的标签
    strategy: # 更新策略
      rollingUpdate: # 滚动更新配置
        maxSurge: 25% # 进行滚动更新时,最多可以启动25%的新实例
        maxUnavailable: 25% # 进行滚动更新时,最多可以同时停止25%的旧实例
      type: RollingUpdate # 更新类型,采用滚动更新
    template: # Pod模板
      metadata: # Pod的元信息
        labels: # Pod标签
          app: nginx-deploy
      spec: # Pod期望信息
        containers: # Pod容器
        - image: nginx:1.7.9 # 镜像
          imagePullPolicy: IfNotPresent # 拉取策略
          name: nginx # 容器名称
        restartPolicy: Always # 重启策略
        terminationGracePeriodSeconds: 30 # 删除操作最多宽限多长时间

  • deploy和statefulset可能用到matchLabels
滚动更新
  • 只有修改了 deployment 配置文件中的 template 中的属性后,才会触发更新操作

  • 通过 kubectl edit deployment nginx-deploy 进行修改

  • 下面先修改非template,看看是否更新

  • 进入修改之后,在label中新加入标签:
    在这里插入图片描述

  • 查看是否更新,发现确实没有更新
    在这里插入图片描述

在这里插入图片描述

  • 然后修改副本数为3,方便后面看滚动更新进行查看
    在这里插入图片描述

  • 也不是更新,发现deploy,rs都是一个,然后管理着3个Pod

  • 注:这是因为create的模板edit后直接生效了,要是自己定义的yaml文件,记得重新apply
    在这里插入图片描述

  • 下面将template里面的nginx镜像版本号修改之后保存退出,发现在滚动更新
    在这里插入图片描述

  • 具体查看信息用kubectl rollout status deploy nginx-deploy

  • 这次用命令行的方式进行设置,执行kkubectl set image deployment/nginx-deploy nginx=nginx:1.7.9

  • 进入deploy查看信息kubectl describe deploy nginx-deploy
    在这里插入图片描述

  • 可以看出是replicaset是不断变化的,大概意思是创建一个新的replicaset,然后更新一个Pod,更新好后,停止原来rs的旧Pod,然后再更新另一个新Pod,然后再停掉原来rs的旧Pod,直至完成。如下图:
    在这里插入图片描述

  • 再次看信息会发现,新的Pod已经和新的RS关联,如下图:
    在这里插入图片描述

  • 注:可能会出现并行的状态,就是修改之后,生成一个新的RS来更新,还没完成的时候,又进行了修改,然后就会停止之前的更新,创建新的RS来进行这次更新

回滚
  • 有时候你可能想回退一个Deployment,例如,当Deployment不稳定时,比如一直crash looping。

  • 默认情况下,kubernetes会在系统中保存前两次的Deploymentrollout历史记录,以便你可以随时会退(你可以修改revision history limit来更改保存的revision数)。

  • 假如更新 deployment 时参数不小心写错,如 nginx:1.9.1 写成了 nginx:1.91
    kubectl set image deployment/nginx-deploy nginx=nginx:1.91

  • 监控滚动升级状态,由于镜像名称错误,下载镜像失败,因此更新过程会卡住
    kubectl rollout status deployments nginx-deploy

  • 结束监听后,获取 rs 信息,我们可以看到新增的 rs 副本数是 2 个
    kubectl get rs

  • 通过 kubectl get pods 获取 pods 信息,我们可以看到关联到新的 rs 的 pod,状态处于 ImagePullBackOff 状态

  • 为了修复这个问题,我们需要找到需要回退的 revision 进行回退 通过 kubectl rollout history deployment/nginx-deploy 可以获取 revison 的列表

  • 通过 kubectl rollout history deployment/nginx-deploy --revision=2 可以查看详细信息

  • 确认要回退的版本后,可以通过 kubectl rollout undo deployment/nginx-deploy可以回退到上一个版本

  • 也可以回退到指定的 revision
    kubectl rollout undo deployment/nginx-deploy --to-revision=2

  • 再次通过 kubectl get deploymentkubectl describe deployment可以看到,我们的版本已经回退到对应的 revison 上了

  • 注:可以通过设置 .spec.revisonHistoryLimit 来指定 deployment 保留多少 revison,如果设置为 0,则不允许 deployment 回退了。

  • 命令结果如下:
    在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  • 下面这个是旧rs里面之前创建Pod和删除Pod
    在这里插入图片描述
扩容缩容
  • 扩容与缩容只是直接创建副本数,没有更新 pod template 因此不会创建新的 rs
  • 通过 kube scale 命令可以进行自动扩容/缩容,以及通过 kube edit 编辑 replicas 也可以实现扩容/缩容
# 通过 kube edit 编辑,就是通过kubectl edit deploy nginx-deploy命令进去之后修改replicas


#通过 kube scale 命令可以进行自动扩容/缩容
kubectl scale --replicas=6 deploy nginx-deploy

在这里插入图片描述

  • 缩容同理,只不过把数字变小就行
暂停与恢复
  • 由于每次对 pod template 中的信息发生修改后,都会触发更新 deployment 操作,那么此时如果频繁修改信息,就会产生多次更新,而实际上只需要执行最后一次更新即可,当出现此类情况时我们就可以暂停 deployment 的 rollout

  • 通过kubectl rollout pause deployment <name>就可以实现暂停,直到你下次恢复后才会继续进行滚动更新

  • 尝试对容器进行修改,然后查看是否发生更新操作了

kubectl set image deploy <name> nginx=nginx:1.17.9
kubectl get po 
  • 通过以上操作可以看到实际并没有发生修改,此时我们再次进行修改一些属性,如限制 nginx 容器的最大cpu为 0.2 核,最大内存为 128M,最小内存为 64M,最小 cpu 为 0.1 核
kubectl set resources deploy <deploy_name> -c <container_name> --limits=cpu=200m,memory=128Mi --requests=cpu100m,memory=64Mi
  • 通过格式化输出kubectl get deploy <name> -o yaml,可以看到配置确实发生了修改,再通过 kubectl get po 可以看到 pod 没有被更新

  • 那么此时我们再恢复 rollout,通过命令 kubectl rollout resume deploy <name>

  • 恢复后,我们再次查看 rs 和 po 信息,我们可以看到就开始进行滚动更新操作了

kubectl get rs
kubectl get po
  • 修改内容
    在这里插入图片描述

在这里插入图片描述

  • pause之后,修改不会更新
    在这里插入图片描述

  • resume之后,更新。

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

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

相关文章

Android性能优化RecyclerView预加载LayoutManager的getExtraLayoutSpace,Kotlin

Android性能优化RecyclerView预加载LayoutManager的getExtraLayoutSpace&#xff0c;Kotlin RecyclerView默认只加载当前屏幕肉眼可见区域的有限item数量&#xff0c;有些场景下&#xff0c;需要在屏幕外不可见的区域多加载一批item出来&#xff0c;这有时候被称之为“预加载”…

03—js条件语句和循环语句

什么是语句&#xff1f;为了讲明白这个概念我有幸邀请了一个特殊嘉宾&#xff0c;是谁呢&#xff1f;就是任劳任怨一听就干的三年级二班的小明同学。小明同学的妈妈给小明了张纸条上面写着&#xff0c;买酱油&#xff0c;遛狗&#xff0c;吃饭&#xff0c;刷马桶&#xff0c;那…

装机指导。

everything winrar snipaste cmake git tortoisegit tortoisesvn inno setup vs2022 安装的时候注意sdk路径一定要默认&#xff01;&#xff01; 否则你会发现在你的sdk安装路径的根盘符下会多出一个Windows Kits&#xff0c;强迫症接受不了 默认的会跟已有的装在一起…

YOLO系列小样本数据集进行数据增强

代码参考地址&#xff1a;YoloDatasetsEnhance 处理数据增强需要用到images和labels。我保存的labels是txt文件&#xff0c;但是enhance_engine.py中需要对xml文件进行处理&#xff0c;因此需要TxtTransformXml.py将txt文件进行转换。 转换需要修改的地方如下&#xff1a; 路…

Unity笔记之Android打包、减小包体之类的问题

打包问题 问题1&#xff1a; 一般大部分问题就是JDK、SDK、NDK之类的问题。现在是其他的问题&#xff0c;之前遇到过&#xff0c;好久没玩android了都忘了。 这试了半天&#xff0c;结果是需要有密钥库。那就给他创建一个填一下就行了 &#xff08;在网上看了半天&#xff…

Java常用算法API_Arrays和Lambda表达式——代码演示和小练习

Arrays常用方法代码演示&#xff1a; 方法作用及注意点已在代码中标注 public class ArraysDemo {public static void main(String[] args) {//toString:将数组变成字符串int[] arr {1,2,3,4,5,6,7,8,9};System.out.println(Arrays.toString(arr));System.out.println();//bi…

【话题】AI技术创业有那些机会,简单探讨下

大家好&#xff0c;我是全栈小5&#xff0c;欢迎阅读小5的系列文章&#xff0c;这是《话题》系列文章 目录 背景机会一、引言二、AI技术的创业机遇1.智能服务行业的兴起2.数据驱动的业务模式创新3.AI与产业融合的创新发展 三、AI技术创业的挑战1.技术门槛高2.法规政策的不确定性…

【LeetCode】动态规划类题目详解

所有题目均来自于LeetCode&#xff0c;刷题代码使用的Python3版本 动态规划 问题分类 如果某一个问题有重叠的子问题&#xff0c;则使用动态规划进行求解是最有效的。 动态规划中每一个状态一定是由上一个状态推导出来的&#xff0c;这一点区别于贪心算法 动态规划五部曲 确…

[2024]最新激活Navicat教程附激活码

PS&#xff1a;在开始前&#xff0c;建议先断开本地网络&#xff01;&#xff01;&#xff01;建议先断开本地网络&#xff01;&#xff01;&#xff01;建议先断开本地网络&#xff01;&#xff01;&#xff01; 1 安装 1.1 点击下一步 1.2 许可证选择“我同意”&#xff0c…

手机空号检测API接口怎么对接

我们先说一说什么是手机空号检测接口&#xff0c;手机空号检测接口又叫运营商空号检测接口、手机号码状态检测接口&#xff0c;那么这个接口怎么对接呢? 首先找到一家有这个数据接口的服务商&#xff0c;比如数脉API,然后注册账号购买免费套餐 接下来就需要程序员同学来用自己…

数据结构复习指导之顺序表上基本操作的实现(插入、删除、查找)

文章目录 顺序表基本操作实现 知识总览 1.顺序表的初始化 1.1静态分配顺序表的初始化 1.2动态分配顺序表的初始化 2.插入操作 2.1插入操作流程 2.2插入操作时间复杂度 3.删除操作 3.1删除操作流程 3.2删除操作时间复杂度 4.查找操作 4.1按位查找 4.2按位查找时间…

Spring AMQP消息中间件

SpringAMQP简单说就是一个中间件&#xff0c;提供了模板方便我们操作各种消息模型 上面已经学了RabbitMQ消息队列是有五种消息模型&#xff0c;并且我们演示了其中的基本消息队列(Hello World)。用的是官方API&#xff0c;来实现的基本消息队列(Hello World)。会发现官方提供的…

【ROS2笔记四】ROS2话题通信

4.ROS2话题通信 文章目录 4.ROS2话题通信4.1订阅发布模型4.2ROS2话题工具4.3rclcpp实现话题4.3.1编写发布者4.4编写订阅者 Reference 话题是ROS2中常用的通信方式之一&#xff0c;话题通信采取的是订阅发布模型&#xff0c;一个节点的数据会发布到某个话题之上&#xff0c;然后…

C#基础--之数据类型

C#基础–之数据类型 在第一章我们了解了C#的输入、输出语句后&#xff0c;我这一节主要是介绍C#的基础知识&#xff0c;本节的内容也是后续章节的基础&#xff0c;好的开端等于成功的一半。在你阅读完本章后&#xff0c;你就有足够的C#知识编写简单的程序了。但还不能使用封装、…

一些优雅的算法(c++)

求最大公约数&#xff1a;辗转相除法 int gcd(int a,int b){return b0?a:gcd(b,a%b); }求最小公倍数&#xff1a;两整数之积除以最大公约数 int lcm(int a, int b){return a*b / gcd(a, b); }十进制转n进制&#xff1a; char get(int x){if(x<9){return x0;}else{return…

java 邮件发送表格

邮件发送表格 问题导入效果图 实现方案1. 拼接HTML文件&#xff08;不推荐&#xff09;2. excel 转HTML使用工具类来转化依赖工具类代码示例 使用已工具包 如 aspose-cells依赖代码示例 3.使用模板生成流程准备模板工具类代码示例 问题导入 在一些定时任务中&#xff0c;经常会…

SpringBoot 集成Swagger3

说明&#xff1a; 1&#xff09;、本文使用Spring2 集成Swagger3&#xff0c; 本想使用Springboot3 jdk 17 集成Swagger3, 但是搜了一些资料&#xff0c;Spring 想引用swagger3 需要依赖降级使用Spring2 版本&#xff0c; 或者使用Spring3 springdoc 实现swagger的功能&…

数据结构—顺序表(如果想知道顺序表的全部基础知识点,那么只看这一篇就足够了!)

前言&#xff1a;学习完了C语言的基础知识点之后&#xff0c;我们就需要使用我们所学的知识来进一步对存储在内存中的数据进行操作&#xff0c;这时候我们就需要学习数据结构。而这篇文章为数据结构中顺序表的讲解。 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可以…

JavaEE初阶——多线程(一)

T04BF &#x1f44b;专栏: 算法|JAVA|MySQL|C语言 &#x1faf5; 小比特 大梦想 此篇文章与大家分享多线程的第一部分:引入线程以及创建多线程的几种方式 此文章是建立在前一篇文章进程的基础上的 如果有不足的或者错误的请您指出! 1.认识线程 我们知道现代的cpu大多都是多核心…

Flutter学习13 - Widget

1、Flutter中常用 Widget 2、StatelessWidget 和 StateFulWidget Flutter 中的 widget 有很多&#xff0c;但主要分两种&#xff1a; StatelessWidget无状态的 widget如果一个 widget 是最终的或不可变的&#xff0c;那么它就是无状态的StatefulWidget有状态的 widget如果一个…