百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 博客教程 > 正文

Kubernetes工作负载管理

connygpt 2024-08-22 12:49 10 浏览


01

Kubernetes 工作负载(Workload)介绍


工作负载是在 Kubernetes 上运行的应用程序。无论你的负载是单一组件还是由多个一同工作的组件构成,在 Kubernetes 中你 可以在一组 Pods 中运行它。 在 Kubernetes 中,Pod 代表的是集群上处于运行状态的一组容器。Pod 有确定的生命周期,如果该Pod所在的节点出现了致命的错误时,所有该节点的Pod都会失败。Kubernetes提供一些负载资源来替你管理一组Pod,让用户没有必要管理每个Pod。


Kubernetes提供以下几类工作负载:

1)无状态工作负载: 管理的Pod集合是相互等价的,需要的时候可以被替换。

  • Deployment
  • ReplicaSet
  • ReplicationController

Deployment/RS/RC的区别,RS/RC能保证指定数量的pod在集群中运行,Deployment提供的升级,回滚,暂停恢复等功能。

2)有状态工作负载: 为每个 Pod 维护了一个唯一的ID, 能够保证 Pod 的顺序性和唯一性,每个Pod是不可替代的。可使用持久存储来保存服务产生的状态。

  • StatefulSet:StatefulSet 为它们的每个 Pod 维护了一个唯一的ID,该序列号会在 StatefulSet 存在的时间内保持不变,哪怕 Pod 被重启或者重新调度,也不会出现任何的改变。StatefulSet 引入了 PV 和 PVC 对象来持久存储服务产生的状态,Zookeeper、Kafka,etcd等。

3)守护进程工作负载: 保证每个节点上运行着这样一个守护进程

  • DaemonSet

4)批处理工作负载: 一次性的任务

  • Job
  • CronJob

02

工作负载类型1-Deployment


Deployment 概述

Deployment是一组不具有唯一标识的多个Pod的集合:

  • 确保集群中有期望数量的Pod运行
  • 提供多种升级策略以及一键回滚能力。
  • 提供暂停/恢复的能力

典型使用场景:Web Server等无状态应用

Deployment 语法

Deployment 升级策略:

RollingUpdate: 滚动升级策略中可以配置以下两个参数

  • maxUnavailable 表示在更新过程中能够进入不可用状态的 Pod 的最大值;
  • maxSurge 表示能够额外创建的 Pod 个数

滚动更新的过程中是启动一个新的ReplicaSet,创建一部分新Pod,并缩减历史的ReplicaSet的数量,一直循环往复,以达到期望状态,步长由以上两个参数控制。

Recreate: 先将老的ReplicaSet期望实例数改成0,等所有Pod终止以后,再创建新的ReplicaSet

RevisonHistoryLimit: 指定保留的历史ReplicaSet数量。

Pause: 当Deployment暂停后,Deployment发生了改动,也不会被Controller同步,触发更新。

apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
strategy:
rollingUpdate:
maxSurge: 0
maxUnavailable: 1
type: RollingUpdate
selector:
matchLabels:
app: nginx
replicas: 2 # tells deployment to run 2 pods matching the template
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80

Deployment 常用操作

创建Deployement

# kubectl create deploy nginx-test --image nginx --replicas=3
# kubectl create –f nginx.yaml

查询Deployement

# kubectl get deploy
NAME    READY      UP-TO-DATE         AVAILABLE        AGE
nginx           1/1               1                          1               17d

READY: 对应status.readyReplicas/spec.replicas

UP-TO-DATE:对应status.updatedReplicas, 表示根据新模板创建的pod数量

AVAILABLE: 对应status.availableReplicas, 表示在minReadySeconds Pod的Container没有重启的Running Pod数量。

更新Deployement

# kubectl edit deploy/nginx


# kubectl set image deploy/nginx nginx=nginx:1.9.1
# kubectl apply -f nginx.yaml

监视Deployment滚动更新情况

# kubectl rollout status deploy/nginx

查询升级历史

# kubectl rollout history deploy/nginx

回滚

# kubectl rollout undo deployment/nginx  --to-revision=2 #不指定的话默认回滚到上一个版本

暂停/恢复

# kubectl rollout pause deployment/nginx
# kubectl rollout resume deploy/nginx

Deployment 使用小结

  • 选择所需的升级策略,合理配置升级参数,例如maxUnavailable以及maxSurge
  • 合理设置历史版本数量,系统默认情况下会保留10个历史版本。
  • 回滚时,只有Deployment 模板部分会被回滚,手动/自动扩缩Deployment数量是不会被回滚的。
  • 暂停过程中,模板更新不会触发Deployment滚动更新。

03

工作负载类型2-Job/CronJob

Job/CronJob 概述

Job 主要处理一些短暂的一次性任务:

  • 保证指定数量Pod成功运行结束
  • 支持并发执行
  • 支持错误自动重试
  • 支持暂停/恢复Job

典型使用场景:

  • 计算以及训练任务, 如批量计算,AI训练任务等

CronJob 主要处理周期性或者重复性的任务:

  • 基于Crontab格式的时间调度
  • 可以暂停/恢复CronJob

典型的使用场景:

  • 周期性的数据分析服务
  • 周期性的资源回收服务

Job/CronJob 语法

Job关键字段:

  • Parallelism: 在同一时间运行的最大的Pod的数量
  • Completions: 指定Job成功需要运行成功的Pod的数量
  • BackoffLimit: 重试次数,当超过该重试次数时,该Job标记为Failed
  • CompletionMode: 1.21引入,如果设置为Indexed,创建的Pod annotation会带上batch.kubernetes.io/job-completion-index,index值为0~spec.completions-1,并且仅当每个index的pod都有一个成功的时候,这时Job才会被认为是成功的。controller会给pod中注入JOB_COMPLETION_INDEX的环境变量
  • Suspend: 1.21引入,等于true时,用户暂停了Job,controller会删除所有正在运行的Pod。
apiVersion: batch/v1
kind: Job
metadata:
name: pi
spec:
template:
spec:
containers:
- name: pi
image: perl
command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
restartPolicy: Never
backoffLimit: 4
completions: 1
parallelism: 1

CronJob关键字段:

  • Schedule: 设置Job的周期策略
  • ConcurrencyPolicy: 指定 CronJob 创建的任务执行时发生重叠如何处理, Allow是允许并发执行任务, Forbid是不允许并发执行,Replace是会用新任务替换正在运行的任务。
  • startingDeadlineSeconds: 表示统计错过调度次数开始的时间,默认从上一次调度时间开始统计。
  • successfulJobsHistoryLimit,failedJobsHistoryLimit: 可以指定保留的成功和失败的任务个数。
  • Suspend: 是否暂停
apiVersion: batch/v1
kind: CronJob
metadata:
name: hello
spec:
schedule: "*/1 * * * *“
successfulJobsHistoryLimit: 3
failedJobsHistoryLimit: 1
concurrencyPolicy: Allow
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: busybox
imagePullPolicy: IfNotPresent
command:
- /bin/sh
- -c
- date; echo Hello from the Kubernetes cluster
restartPolicy: OnFailure

Job/CronJob 常用操作

创建Job

# kubectl create job  pi --from=cronjob/a-cronjob # 从cronjob获取模板创建Job
# kubectl create –f job.yaml

查询Job

# kubectl get job
NAME   COMPLETIONS   DURATION   AGE
pi                1/1                     43s         123m

COMPLETIONS: 显示已经完成的Pod数量,显示的字段为.status.succeeded

DURATION: Job实际也运行时长,已完成Job使用status.completionTime – status.startTime

创建CronJob

# kubectl create cronjob hello --image=busybox --schedule="*/1 * * * *"
# kubectl create –f cronjob.yaml

查询CronJob

# kubectl get cronjob
NAME    SCHEDULE      SUSPEND   ACTIVE   LAST SCHEDULE   AGE
hello        */1 * * * *           False            1                57s                 73s

SUSPEND : 显示已经该Cronjob是否暂停

ACTIVE : 显示的是正在执行的Job的数量

LAST SCHEDULE: 显示的是上一次触发任务执行的时间

Job/CronJob 使用小结

  • 合理设置Job 的并发度,和所需的完成数量
  • 合理设置失败重试次数,当前系统默认值为6
  • Job 中的Pod Restart Policy 只能为Never 或者 OnFailure
  • 合理设置历史Job保留时间
  • 合理设置CronJob的周期策略,以及并发策略
  • CronJob 当在一个时间窗内(上一次调度的时间点到现在)所错过的调度次数超过100次以后,那么就不会再启动这个任务了。

04

工作负载类型3-DaemonSet

DaemonSet 概述

DaemonSet(守护进程集)功能:

  • 确保每一个节点或者期望的节点上运行一个Pod
  • 新增节点时自动部署一个Pod
  • 移除节点时自动删除Pod

典型使用场景:

  • 日志监控采集进程,如fluentd, icagent,
  • 节点运维进程,等Node Problem Detector, OS-Operator-Agent
  • Kubernetes 必要运行组件,如Everest Driver, Calico等
  • Device Plugin:GPU Device Plugin,运行在GPU节点上

DaemonSet 语法

DaemonSet 升级策略:

  • RollingUpdate:更新了DaemonSet的配置时,会自动删除老的Pod,删除完成后,创建新的Pods,并发滚动更新的节点数可以通过maxUnavailable控制.
  • OnDelete: 更新了DaemonSet的配置,不会自动删除并重建Pod; 通过删除Pod,触发Pod的更新。

DaemonSet Template中RestartPolicy必须为Always

RevisionHistoryLimit: 指定保留的历史revision数量。

apiVersion: apps/v1
kind: DaemonSet
metadata:
name: fluentd-elasticsearch
namespace: kube-system
labels:
k8s-app: fluentd-logging
spec:
revisionHistoryLimit: 10
updateStrategy:
rollingUpdate:
maxUnavailable: 10
type: RollingUpdate
selector:
matchLabels:
name: fluentd-elasticsearch
template:
metadata:
labels:
name: fluentd-elasticsearch
spec:
containers:
- name: fluentd-elasticsearch
image: quay.io/fluentd_elasticsearch/fluentd:v2.5.2

DaemonSet 常用操作

创建DaemonSet

# kubectl create –f daemonset.yaml

查询DaemonSet

# kubectl get daemonset –nkube-system
NAME                 DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
everest-csi-driver   1                  1                   1               1                         133d

DESIRED: 对应status.desiredNumberScheduled,表示集群中需要部署ds pod的节点数量

CURRENT:对应status.currentNumberScheduled, 表示集群中已经有调度ds pod的节点数量

READY:对应status.NumberReady, 表示集群中已经有Running ds pod的节点数量

UP-TO-DATE:对应status.updatedNumberScheduled, 表示集群中已经启动最新的ds版本pod的节点数量

AVAILABLE: 对应status.numberAvailable, 表示集群中有running ds pod,并且在minReadySeconds容器没有重启的节点数量

更新DaemonSet

# kubectl edit ds/fluentd-elasticsearch -n kube-system
# kubectl set image ds/fluentd-elasticsearch fluentd-elasticsearch=quay.io/fluentd_elasticsearch/fluentd:v2.6.0 -n kube-system
# kubectl apply -f https://k8s.io/examples/controllers/fluentd-daemonset-update.yaml

监视DaemonSet滚动更新情况

# kubectl rollout status ds/fluentd-elasticsearch

查询更新历史

# kubectl rollout history ds/fluentd-elasticsearch

回滚

# kubectl rollout undo ds/fluentd-elasticsearch  --to-revision=2 #不指定的话默认回滚到上一个版本

DaemonSet使用小结

  • 合理设置DaemonSet升级策略
  • 可以通过设置节点亲和性或者节点选择器来选择部分节点部署。
  • 合理设置DaemonSet的RevisionHistoryLimit,默认值为10

相关推荐

3分钟让你的项目支持AI问答模块,完全开源!

hello,大家好,我是徐小夕。之前和大家分享了很多可视化,零代码和前端工程化的最佳实践,今天继续分享一下最近开源的Next-Admin的最新更新。最近对这个项目做了一些优化,并集成了大家比较关注...

干货|程序员的副业挂,12个平台分享

1、D2adminD2Admin是一个完全开源免费的企业中后台产品前端集成方案,使用最新的前端技术栈,小于60kb的本地首屏js加载,已经做好大部分项目前期准备工作,并且带有大量示例代码,助...

Github标星超200K,这10个可视化面板你知道几个

在Github上有很多开源免费的后台控制面板可以选择,但是哪些才是最好、最受欢迎的可视化控制面板呢?今天就和大家推荐Github上10个好看又流行的可视化面板:1.AdminLTEAdminLTE是...

开箱即用的炫酷中后台前端开源框架第二篇

#头条创作挑战赛#1、SoybeanAdmin(1)介绍:SoybeanAdmin是一个基于Vue3、Vite3、TypeScript、NaiveUI、Pinia和UnoCSS的清新优...

搭建React+AntDeign的开发环境和框架

搭建React+AntDeign的开发环境和框架随着前端技术的不断发展,React和AntDesign已经成为越来越多Web应用程序的首选开发框架。React是一个用于构建用户界面的JavaScrip...

基于.NET 5实现的开源通用权限管理平台

??大家好,我是为广大程序员兄弟操碎了心的小编,每天推荐一个小工具/源码,装满你的收藏夹,每天分享一个小技巧,让你轻松节省开发效率,实现不加班不熬夜不掉头发,是我的目标!??今天小编推荐一款基于.NE...

StreamPark - 大数据流计算引擎

使用Docker完成StreamPark的部署??1.基于h2和docker-compose进行StreamPark部署wgethttps://raw.githubusercontent.com/a...

教你使用UmiJS框架开发React

1、什么是Umi.js?umi,中文可发音为乌米,是一个可插拔的企业级react应用框架。你可以将它简单地理解为一个专注性能的类next.js前端框架,并通过约定、自动生成和解析代码等方式来辅助...

简单在线流程图工具在用例设计中的运用

敏捷模式下,测试团队的用例逐渐简化以适应快速的发版节奏,大家很早就开始运用思维导图工具比如xmind来编写测试方法、测试点。如今不少已经不少利用开源的思维导图组件(如百度脑图...)来构建测试测试...

【开源分享】神奇的大数据实时平台框架,让Flink&Spark开发更简单

这是一个神奇的框架,让Flink|Spark开发更简单,一站式大数据实时平台!他就是StreamX!什么是StreamX大数据技术如今发展的如火如荼,已经呈现百花齐放欣欣向荣的景象,实时处理流域...

聊聊规则引擎的调研及实现全过程

摘要本期主要以规则引擎业务实现为例,陈述在陌生业务前如何进行业务深入、调研、技术选型、设计及实现全过程分析,如果你对规则引擎不感冒、也可以从中了解一些抽象实现过程。诉求从硬件采集到的数据提供的形式多种...

【开源推荐】Diboot 2.0.5 发布,自动化开发助理

一、前言Diboot2.0.5版本已于近日发布,在此次发布中,我们新增了file-starter组件,完善了iam-starter组件,对core核心进行了相关优化,让devtools也支持对IAM...

微软推出Copilot Actions,使用人工智能自动执行重复性任务

IT之家11月19日消息,微软在今天举办的Ignite大会上宣布了一系列新功能,旨在进一步提升Microsoft365Copilot的智能化水平。其中最引人注目的是Copilot...

Electron 使用Selenium和WebDriver

本节我们来学习如何在Electron下使用Selenium和WebDriver。SeleniumSelenium是ThoughtWorks提供的一个强大的基于浏览器的开源自动化测试工具...

Quick 'n Easy Web Builder 11.1.0设计和构建功能齐全的网页的工具

一个实用而有效的应用程序,能够让您轻松构建、创建和设计个人的HTML网站。Quick'nEasyWebBuilder是一款全面且轻巧的软件,为用户提供了一种简单的方式来创建、编辑...