k8s pod调度基础

目录

一:replication controller和replicaset

1:replication controller

replication controller的使用示例。

2:标签与标签选择器

(1)标签

(2)标签选择器

(3)标签与标签选择器举例

3:replicaset

replicaset的使用示例。

二:无状态应用管理Deployment

1:什么是无状态

2:无状态服务特点

3:无状态服务的应用场景

4:Deployment的使用示例。

(1)创建Deployment

(2)更新Deployment

(3)回滚Deployment

(4)扩容Deployment

(5)删除Deployment

三:有状态应用管理statefulset

1:什么是有状态

2:有状态服务特点

3:有状态服务的应用场景

4:statefulset的使用示例。

(1)创建statefulset

(2)扩容statefulset

(3)缩容statefulset

(4)非级联删除statefulset

(5)级联删除statefulset

四:守护进程集DaemonSet

1:什么是DaemonSet

2:DaemonSet的使用示例。

五:CronJob

1:CronJob的使用示例。


一:replication controller和replicaset

1:replication controller

RC(replication controller,复制控制器)
数量维持在指定数值上

RC用来确保Pod副本数达到期望值,这样可以确保一个或多个同类Pod总是可用的。

replication controller的使用示例。

#编写RC文件
vim replicationcontroller-nginx.yaml
apiVersion: v1
kind: ReplicationController
metadata:name: nginx
spec:replicas: 3selector:app: nginxtemplate:metadata:name: nginxlabels:app: nginxspec:containers:- name: nginximage: nginx:1.7.9ports:- containerPort: 80
#创建RC
kubectl apply -f replicationcontroller-nginx.yaml
#查看节点运行状态
kubectl get pod
kubectl get rc
#删除一个pod并立即查看pod状态
kubectl delete -f replicationcontroller-nginx.yaml

2:标签与标签选择器

(1)标签

在 Kubernetes 中,标签(Labels)是附加到资源(如 Pod、Node、Service 等)上的键值对,用于组织、标识和选择资源。标签不提供唯一性,同一标签可以被添加到多个资源上。

示例标签:

app: web-server
env: production
tier: frontend

(2)标签选择器

标签选择器(Label Selectors)是 Kubernetes 中用于过滤和选择资源的表达式。通过标签选择器,可以基于标签的键值对来筛选符合条件的资源。

标签选择器类型:

  • 等式 - based 选择器:使用===(相等)或!=(不相等)。

    app=web-server
    env!=development
    

  • 集合 - based 选择器:使用innotinexists

    tier in (frontend, backend)
    env notin (test, staging)

(3)标签与标签选择器举例

  • 基于等式的标签选择器

    selector:
      app: nginx

  • 基于集合的标签选择器

    matchExpressions:
      - {key: tier, operator: In, values: [frontend]}
 

3:replicaset

ReplicaSet(复制集,RS)是支持基于集合的标签选择器的下一代Replication Controller,它主要用于Deployment协调创建、删除和更新Pod,和Replication Controller唯一的区别是,ReplicaSet支持基于集合的标签选择器。

replicaset的使用示例。

#编写RS文件
vim replicaset-example.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:name: frontendlabels:app: guestbooktier: frontend
spec:# modify replicas according to your casereplicas: 3selector:matchLabels:tier: frontendmatchExpressions:- {key: tier, operator: In, values: [frontend]}template:metadata:labels:app: guestbooktier: frontendspec:containers:- name: php-redisimage: nginx:1.7.9resources:requests:cpu: 100mmemory: 100Mienv:- name: GET_HOSTS_FROMvalue: dns# If your cluster config does not include a dns service, then to# instead access environment variables to find service host# info, comment out the 'value: dns' line above, and uncomment the# line below.# value: envports:- containerPort: 80#创建RS
kubectl apply -f replicaset-example.yaml
#查看节点运行状态
kubectl get pod
#删除一个pod并立即查看pod状态
kubectl delete -f replicaset-example.yaml

二:无状态应用管理Deployment

1:什么是无状态

在云计算和微服务架构中,"无状态" 指应用不保存客户端会话数据或请求间的上下文信息。每次请求都被视为独立事件,服务器不会记录之前的交互状态。无状态应用的实例可以独立运行,无需共享状态信息。

2:无状态服务特点

  • 独立性:每个请求都能被任意实例处理,无需依赖其他实例
  • 可扩展性:易于水平扩展,通过增加实例数量提升处理能力
  • 高可用性:单个实例故障不影响整体服务,可快速替换
  • 简化部署:无需考虑状态同步,部署和管理更简单

3:无状态服务的应用场景

  • Web 前端服务:如静态网站、API 网关
  • 批处理作业:数据处理任务,无需保存中间状态
  • 微服务架构:多数微服务设计为无状态,便于独立扩展
  • 负载均衡场景:请求可随机分发到任意实例

4:Deployment的使用示例。

(1)创建Deployment

下面是一个部署 Nginx 的示例:

apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-deploymentlabels:app: nginx
spec:replicas: 3selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:1.14.2ports:- containerPort: 80

执行命令创建:

kubectl apply -f nginx-deployment.yaml

(2)更新Deployment

将 Nginx 版本更新到 1.16.1:

kubectl set image deployment/nginx-deployment nginx=nginx:1.16.1

或直接编辑配置文件后重新应用:

kubectl edit deployment/nginx-deployment

(3)回滚Deployment

#查看更新历史:
kubectl rollout history deployment/nginx-deployment
#回滚到上一个版本:
kubectl rollout undo deployment/nginx-deployment
#回滚到指定版本:
kubectl rollout undo deployment/nginx-deployment --to-revision=2

(4)扩容Deployment

#将副本数增加到 5:
kubectl scale deployment/nginx-deployment --replicas=5
#通过编辑配置文件:
spec:replicas: 5

(5)删除Deployment

kubectl delete deployment nginx-deployment

三:有状态应用管理statefulset

1:什么是有状态

在容器编排领域,"有状态" 指应用需要维护特定的状态信息,这些状态信息与其生命周期密切相关,例如:

  • 唯一的网络标识(如固定的主机名或 IP 地址)
  • 持久化存储(如数据库文件、配置数据)
  • 有序的启动 / 停止顺序
  • 与其他组件的特定关联关系

与无状态应用(如 Web 服务器集群)不同,有状态应用的每个实例都是不可互换的,需要单独管理其状态。

2:有状态服务特点

  • 稳定的网络标识:每个 Pod 都有固定的标识符(如 web-0web-1),不受重启或迁移影响。
  • 持久化存储:通过 PersistentVolumeClaim (PVC) 绑定持久卷,确保数据不随 Pod 销毁而丢失。
  • 有序部署与扩展:Pod 按顺序创建(从 0 开始递增),且前一个 Pod 就绪后才创建下一个。
  • 有序收缩与删除:Pod 按逆序终止(从最大序号开始),确保数据一致性。
  • 滚动更新:支持按序更新 Pod,可配置更新策略(如并行或顺序)。

3:有状态服务的应用场景

  • 数据库集群:如 MySQL、MongoDB、Elasticsearch,需要固定网络标识和持久化存储。
  • 消息队列:如 Kafka、RabbitMQ,依赖有序节点和数据持久化。
  • 分布式系统:如 ZooKeeper、etcd,需要稳定的成员关系和状态存储。
  • 文件系统:如 NFS、Ceph,需要固定的存储提供者。
  • 任何需要保持会话状态的应用:如用户会话管理、购物车系统等。

4:statefulset的使用示例。

(1)创建statefulset

以下是一个简单的 Nginx StatefulSet 示例,包含固定域名和持久化存储:

apiVersion: v1
kind: Service
metadata:name: nginxlabels:app: nginx
spec:ports:- port: 80name: webclusterIP: None  # Headless Service,用于稳定的网络标识selector:app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:name: web
spec:serviceName: "nginx"  # 指定关联的 Headless Servicereplicas: 3selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:1.14.2ports:- containerPort: 80name: webvolumeMounts:- name: wwwmountPath: /usr/share/nginx/htmlvolumeClaimTemplates:  # 持久化存储声明模板- metadata:name: wwwspec:accessModes: [ "ReadWriteOnce" ]resources:requests:storage: 1Gi

创建命令:

kubectl apply -f statefulset.yaml

(2)扩容statefulset

#将 replicas 从 3 增加到 5:
kubectl scale statefulset web --replicas=5
#直接编辑 StatefulSet:
kubectl edit statefulset web

(3)缩容statefulset

#将 replicas 从 5 减少到 2:
kubectl scale statefulset web --replicas=2

(4)非级联删除statefulset

#仅删除 StatefulSet 控制器,保留 Pod 和 PVC:
kubectl delete statefulset web --cascade=orphan#此时:Pods 不会被删除,继续运行
PVC 和 PV 保持不变,数据不会丢失
重新创建同名 StatefulSet 时,会接管现有 Pod

(5)级联删除statefulset

#删除 StatefulSet 及其管理的 Pods,但保留 PVC:
kubectl delete statefulset web
#彻底删除 StatefulSet、Pods 和 PVC:
kubectl delete statefulset web --cascade=foreground
kubectl delete pvc -l app=nginx  # 删除关联的 PVC

四:守护进程集DaemonSet

1:什么是DaemonSet

DaemonSet 是 Kubernetes 中的一种控制器,其核心功能是确保集群中每个(或指定)节点上都运行一个 Pod 副本。当节点加入集群时,DaemonSet 会自动在该节点上部署 Pod;当节点从集群中移除时,Pod 也会被相应删除。这种特性使其适用于需要在每个节点上运行系统级服务的场景,例如:

  • 节点监控代理(如 Prometheus Node Exporter)
  • 日志收集代理(如 Fluentd)
  • 网络插件(如 Calico Node)
  • 存储驱动程序(如 Ceph 客户端)

DaemonSet 的典型特点包括:

  • 节点一致性:确保 Pod 在节点上均匀分布,无需手动管理每个节点的部署。
  • 自动适配节点变化:动态响应集群节点的添加或删除。
  • 无副本数量控制:副本数由节点数量决定,而非手动指定。

2:DaemonSet的使用示例。

apiVersion: apps/v1
kind: DaemonSet
metadata:name: node-exporternamespace: monitoring
spec:selector:matchLabels:app: node-exportertemplate:metadata:labels:app: node-exporterspec:containers:- name: node-exporterimage: prom/node-exporter:v1.6.1ports:- containerPort: 9100securityContext:privileged: true  # 允许访问节点硬件信息volumeMounts:- name: procmountPath: /host/proc- name: sysmountPath: /host/sysvolumes:- name: prochostPath:path: /proc- name: syshostPath:path: /systolerations:- key: node-role.kubernetes.io/masteroperator: Existseffect: NoSchedulenodeSelector:kubernetes.io/os: linux  # 仅在Linux节点部署

关键配置说明

  • selector:定义 Pod 的标签选择器,用于匹配模板中的标签。
  • volumes/volumeMounts:通过hostPath挂载节点的/proc/sys目录,使 Pod 能访问节点硬件信息。
  • tolerations:设置容忍度以允许在 Master 节点部署(默认情况下 DaemonSet 不会在 Master 节点运行)。
  • nodeSelector:指定仅在 Linux 节点上部署 Pod。

五:CronJob

CronJob 是 Kubernetes 中用于管理周期性任务的控制器,类似 Linux 系统中的 crontab,支持按时间计划创建 Job(一次性任务)。典型应用场景包括:

  • 定时备份数据库
  • 周期性数据统计与报表生成
  • 定时清理临时文件
  • 批量任务调度(如每日凌晨同步数据)

1:CronJob的使用示例。

apiVersion: batch/v1
kind: CronJob
metadata:name: mysql-backupnamespace: default
spec:schedule: "0 2 * * *"  # 每天凌晨2点执行jobTemplate:spec:template:spec:containers:- name: mysql-backupimage: mysql:8.0env:- name: MYSQL_HOSTvalue: "mysql-service"- name: MYSQL_USERvalue: "backup-user"- name: MYSQL_PASSWORDvalueFrom:secretKeyRef:name: mysql-secretskey: password- name: BACKUP_DIRvalue: "/backups"command: ["/bin/sh", "-c"]args:- |mkdir -p $(BACKUP_DIR)mysqldump -h $(MYSQL_HOST) -u $(MYSQL_USER) -p$(MYSQL_PASSWORD) mydatabase > $(BACKUP_DIR)/db_backup_$(date +\%Y\%m\%d).sqltar -czf $(BACKUP_DIR)/backup_$(date +\%Y\%m\%d).tar.gz $(BACKUP_DIR)/db_backup_$(date +\%Y\%m\%d).sql# 此处可添加上传备份到云存储的命令volumes:- name: backup-volumepersistentVolumeClaim:claimName: backup-pvcrestartPolicy: OnFailuresuccessfulJobsHistoryLimit: 3  # 保留最近3次成功任务记录failedJobsHistoryLimit: 1     # 保留最近1次失败任务记录

关键配置说明

  • schedule:使用 crontab 格式定义执行时间,"0 2 * * *"表示每天凌晨 2 点。
  • env:通过环境变量传递数据库连接信息,密码从 Secret 中获取以保证安全。
  • command/args:定义备份脚本,使用mysqldump导出数据库并打包压缩。
  • volumes:通过 PersistentVolumeClaim 持久化存储备份文件,避免 Pod 重启后数据丢失。
  • restartPolicy:设置为OnFailure,仅在任务失败时重启容器。
  • historyLimit:控制历史任务记录数量,避免占用过多资源。

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

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

相关文章

学习者的Python项目灵感

一、实用工具类 - 文件批量重命名工具 用 os 模块实现按规则(如添加日期、序号、替换关键词)批量重命名文件,适合处理大量图片/文档。 - 简易待办事项管理器(To-Do List) 用 tkinter 或 PyQt 做GUI界面,…

gRPC服务发现

基于 etcd 实现的服务发现,按照非规范化的 etcd key 实现,详细见代码注释。 package discoveryimport ("context""encoding/json""fmt""go.etcd.io/etcd/api/v3/mvccpb"clientv3 "go.etcd.io/etcd/client/…

基于Linux的Spark本地模式环境搭建实验指南

一、实验目的 掌握Spark本地模式的安装与配置方法验证Spark本地环境是否搭建成功了解Spark基本操作和运行原理 二、实验环境准备 操作系统:Linux(推荐ubuntu)Java环境:JDK 1.8或以上版本内存:至少4GB(推…

数学建模_时间序列

什么是时间序列时间序列预测方法/模型条件:非白噪音平稳平稳性评估不平稳变成平稳然后用ARIMA模型确定p,qAR模型(ARMA特例)MA模型(ARMA特例)ARMA模型(普适)灰色模型神经网络/LSTM组合预测模型向量数据预测结果和为1的情况什么是时间序列 省略具体图形例子 时间序列…

linux用rpm包升级sudo包为sudo-1.9.17-2版本

rpm下载地址: https://www.sudo.ws/dist/packages/1.9.17p1/ 备注:其他压缩包下载地址:https://www.sudo.ws/download.html sudo-1.9.17-2.el7.x86_64.rpm 检查一下,本地sudo版本,执行:sudo -V 或者sudo -…

【开源项目】一款真正可修改视频MD5工具视频质量不损失

文章目录 视频MD5修改工具 🎬📋 目录✨ 功能特点💻 系统要求🏗️ 设计架构🔬 技术原理💻 核心代码1. 视频MD5修改核心逻辑2. 前端异步处理代码3. 错误处理与日志记录📥 安装方法方法一:直接下载方法二:使用本地服务器📚 使用教程基本使用步骤高级使用技巧📁…

Day05: Python 中的并发和并行(1)

理解 Python 中的线程和进程 理解线程和进程是实现在 Python 中并发和并行的基础。这种知识使你能够编写能够看似同时执行多个任务的程序,从而提高性能和响应能力。本课程将深入探讨线程和进程的核心概念、它们的区别,以及它们如何为更高级的并发技术奠…

Spring Boot 集成 MinIO 实现分布式文件存储与管理

Spring Boot 集成 MinIO 实现分布式文件存储与管理 一、MinIO 简介 MinIO 是一个高性能的分布式对象存储服务器,兼容 Amazon S3 API。它具有以下特点: 轻量级且易于部署高性能(读写速度可达每秒数GB)支持数据加密和访问控制提供…

从小白入门,基于Cursor开发一个前端小程序之Cursor 编程实践与案例分析

Cursor 编程实践与案例分析 Cursor 编程实践与案例分析 1. 什么是 Cursor? Cursor 是一款面向开发者的 AI 编程助手,集成于本地 IDE,支持自然语言与代码的无缝协作。它不仅能自动补全、重构、查找代码,还能理解业务上下文&#…

一、如何用MATLAB画一个三角形 代码

一、如何用MATLAB画一个三角形 代码在MATLAB中绘制三角形可以通过指定三个顶点的坐标并使用 fill 或 patch 函数实现。以下是详细代码示例:方法1:使用 fill 函数(简单填充)% 定义三角形的三个顶点坐标 (x, y) x [0, 1, 0.5]; % …

Postman自动化测试提取相应body体中的参数

文章目录Postman自动化测试提取相应body体中的参数1. 示例响应 Body 参数2. 提取响应 Body 参数Postman自动化测试提取相应body体中的参数 上一篇的文中介绍了使用postman自动化测试时从响应的header中提取token参数,很多同学私信问如何从响应体body中提取参数。 有…

vue-39(为复杂 Vue 组件编写单元测试)

实际练习:为复杂 Vue 组件编写单元测试 单元测试对于确保复杂 Vue 组件的可靠性和可维护性至关重要。通过隔离和测试代码的各个单元,您可以在开发过程的早期发现并修复错误,从而构建更健壮和可预测的应用程序。本课程重点介绍为复杂 Vue 组件编写单元测试的实用方面,建立在…

c语言中的函数IV

函数的先后关系 直接把函数放在程序上方是可以的 在实际开发中,我们更希望把main函数放在前面 这样子直接把自己定义的函数放在main函数下方,编译会出现warning和error正确的解决方案是:把函数的头放到main函数上方,这样就能正常…

大模型Decoder-Only深入解析

Decoder-Only整体结构 我们以模型Llama-3.1-8B-Instruct为例,打印其结构如下(后面会慢慢解析每一部分,莫慌): LlamaForCausalLM((model): LlamaModel((embed_tokens): VocabParallelEmbedding(num_embeddings128256,…

web网页,在线%电商,茶叶,商城,网上商城系统%分析系统demo,于vscode,vue,java,jdk,springboot,mysql数据库

经验心得 这也是帮之前一客户加了几个功能,需要掌握crud,前后端开发,前后端怎么对接,前后端通讯是以那种格式,把这些掌握后咱们就可以进行网站开发了。后端记好一定要分层开发,不要像老早一起所有代码写到一…

MybatisPlus-05.核心功能-条件构造器

一.条件构造器 我们前面使用的MP功能主要是根据id进行操作的,并未涉及到复杂查询。而根据id所进行的增删改查操作在MP中都有直接的封装。但是遇到复杂的查询条件时,如何使用MP进行操作是我们要考虑的问题。因此MP为我们提供了条件构造器。 在BaseMapper…

ES6从入门到精通:常用知识点

变量声明ES6引入了let和const替代var。let用于声明可变的块级作用域变量,const用于声明不可变的常量。块级作用域有效避免了变量提升和污染全局的问题。let name Alice; const PI 3.1415;箭头函数箭头函数简化了函数写法,且自动绑定当前上下文的this值…

51单片机教程(十一)- 单片机定时器

11、单片机定时器 项目目标 通过定时器/计数器实现流水灯控制。知识要点 定时器的结构。TMOD和TCON;定时/计数器工作方式;定时/计数器编程步骤;1、项目分析 前面的流水灯的时间控制通过空循环语句来实现,定时不是很精确。本章通过用定时器来控制流水灯任务可以实现精确的时…

基于opencv的疲劳驾驶监测系统

博主介绍:java高级开发,从事互联网行业多年,熟悉各种主流语言,精通java、python、php、爬虫、web开发,已经做了多年的毕业设计程序开发,开发过上千套毕业设计程序,没有什么华丽的语言&#xff0…

Vue 2 和 Vue 3 区别

1. 响应式系统原理 Vue 2:利用Object.defineProperty()实现属性拦截。存在局限性,无法自动监测对象属性增减,需用Vue.set/delete;数组变异方法要重写;深层对象递归转换性能差。Vue 3:采用 ES6 Proxy代理对…