目录
2.5.2滚动更新------RollingUpdate(默认)
3.2.4StatefulSet结合ConfigMap与Volume
一.工作负载
概述 :在 Kubernetes(k8s)中,工作负载(Workloads) 是用于管理 Pod 生命周期的抽象对象,负责定义 Pod 的创建方式、运行数量、更新策略等,是集群中部署和管理应用的核心概念。
主要包含以下五种:Deployment、StatefulSet、Daemonset、Job和CronJob。
二.无状态部署------Deployment
2.1简单介绍
作用 :管理无状态应用(如 Web 服务、API 接口),确保指定数量的 Pod 副本始终运行,并支持滚动更新、回滚等操作。
无状态应用:该应用中不保存业务状态,重启后,不影响功能使用。
特点:
无状态:Pod 之间完全独立,可随意替换, 重启后数据不保留 (依赖外部存储)。
自动扩缩容 :通过 replicas 指定副本数,支持手动或自动扩缩容(HPA)。滚动更新 :更新时逐步替换旧 Pod,避免服务中断(默认策略)。
版本管理:记录部署历史,支持回滚到之前的版本。
适用场景:
1.前端 Web 应用(Nginx、React 服务)。
2.无状态 API 服务(如微服务中的业务接口)。
3.批处理任务的 worker 节点。
2.2部署Deployment
说明 :一旦你修改 template 模板下的内容,那么Deployment都会触发 Deployment 滚动更新,创建新的 ReplicaSet,并按更新策略替换 Pod ,修改其他部分不会自行触发滚动更新策略。单纯扩缩容,不会触发滚动更新策略(例如:删除旧Pod)。
1.编写yaml文件
bash
vim deploy-web.yml
添加以下内容:部署3个web pod
bash
apiVersion: "apps/v1" # 资源的 API 版本
kind: "Deployment" # 资源的类型
metadata: # 资源的元数据信息
name: "webserver" # 资源的名称
annotations: # 自定义变更信息
kubernetes.io/change-cause: "部署镜像httpd:dns"
spec: # 定义Deployment的详细规格
replicas: 3 # 定义Pod的副本
selector: # 标签选择器
matchLabels: # 只有带有指定标签的Pod才会被这个Deployment管理
app: "web" # 指定需要管理的Pod的标签
template: # 定义 Pod 模板,用于创建 Pod
metadata: # Pod元数据
labels: # 定义Pod的标签,以供deploy的selector选择
app: "web" # Pod的标签
spec: # 定义Pod规格,包括容器配置
containers: # 定义容器列表
- name: "apache-frontend" # Pod名称
image: "reg.westos.org/library/httpd:dns" # 容器镜像
ports: # 指定容器端口
- containerPort: 80 # 容器的端口

2.运行yml文件
bash
kubectl apply -f deploy-web.yml
kubectl get deployments webserver
kubectl get pod -o wide


2.3快速扩缩容
说明 :通过修改副本数,来快速调整部署的Pod个数。
2.3.1使用命令修改
说明:方便快捷,但是没有持久化,重启后,依旧是按文件的副本数部署。
bash
kubectl scale deployment webserver --replicas 5 #修改Pod副本数为5

2.3.2修改yml文件
说明:持久化配置,每次重启部署的都是修改后的Pod
1.编辑yml文件
bash
vim deploy-web.yml
添加以下内容
bash
replicas: 8 #修改副本数

2.运行yml文件
bash
kubectl apply -f deploy-web.yml
kubectl get pod
kubectl describe deployment webserver | grep ReplicaSet #查看当前副本数



2.4搁置Pod
说明 :删除deploymment定义的Pod标签,该Pod不再接受deployment管理。
原理 :ReplicaSet 通过 selector 匹配 Pod 归属;如果你改的是 selector 用到的标签,ReplicaSet 会认为这个 Pod 不属于自己,从而新建一个 Pod 补副本 ,原 Pod 变成孤儿。
1.设置Pod为搁置
bash
kubectl label pod webserver-598d5d6fdc-99cq4 app- #删除Pod匹配标签
kubectl get pod --show-labels #查看Pod

2.将该Pod标注成搁浅
说明:为孤儿Pod添加标签,防止被其他资源对象筛选到
bash
kubectl label pod webserver-598d5d6fdc-99cq4 shelved=true
kubectl get pod webserver-598d5d6fdc-99cq4 --show-labels

2.5Deployment更新策略
说明:我们知道Deployment在更新时是动态更新的,如果在更新Pod时,所有Pod都被下线,会造成业务中断,因此需要我们设置更新策略。
2.5.1重建更新------Recreate
Recreate:创建新Pod前,删除之前的全部Pod。
bash
kubectl describe deployments.apps webserver | grep Recreate
2.5.2滚动更新------RollingUpdate(默认)
说明 :创建Pod时,**有时Pod会处于创建中,deployment会认为他没有创建成功,**会同时创建大于指定副本数的Pod,最终会检测Pod数量,将多余的Pod删除。
bash
kubectl describe deployments.apps webserver | grep RollingUpdateStrategy

1.maxSurge (25% by default): 滚动更新期间,Pod 总数相对期望副本数的"超额"上限 。 例如,你要创建100个Pod,那么deployment在创建Pod时,最多会存在125个副本。
2.maxUnaliviable(25% by default):滚动更新期间,最多允许有多少个Pod不可用。超过这个数量后,暂停继续删除旧 Pod、暂停推进滚动更新、直到Pod变为 Ready / 可用 。
2.6版本升级
查看当前镜像版本
bash
kubectl rollout history deployment webserver
kubectl rollout history deployment webserver --revision=1


2.6.1使用命令方式更新镜像
bash
kubectl set image deployment webserver apache-frontend=reg.westos.org/library/httpd:dnsv2 --record #设置新镜像
kubectl rollout history deployment webserver #查看所有的镜像版本历史

测试访问
bash
kubectl get pod -o wide
curl 10.244.109.122 #使用的Pod IP,必须在k8s集群内访问


2.6.2修改yml文件
说明 :一修改yml文件的template模板内容后,使用apply后,会自动按照滚动更新策略更新Pod。
1.编辑yml文件
bash
vim deploy-web.yml
添加以下内容:
bash
kubernetes.io/change-cause: "部署镜像httpd:dnsv2" #修改镜像版本描述

bash
image: "reg.westos.org/library/httpd:dnsv2" #修改新镜像

2.运行yml文件
bash
kubectl apply -f deploy-web.yml
kubectl rollout history deployment webserver

3.测试
bash
kubectl get pod -o wide
curl 10.244.109.70


2.7版本回退
说明:deploy管理所有历史镜像版本,根据你的需求,返回到指定版本。回退成功后,会将当前版本加入到当前
1.回退到版本1
bash
kubectl rollout history deployment webserver #查看所有的镜像版本历史
kubectl rollout undo deployment webserver --to-revision=1 #回退到版本1
--to-revision:指定你要回退的版本号

2.测试是否成功回退
bash
kubectl rollout history deployment webserver
kubectl get pod -o wide
curl 10.244.219.29



三.有状态部署------StatefulSet
3.1简单介绍
1.说明 :管理有状态应用(如数据库、分布式系统),确保 Pod 具有稳定的网络标识(固定名称、 DNS)和存储。
2.有状态应用 :保存业务状态和状态 (存储,网络),重启Pod后,业务数据状态依然存在。
3.特点:
1.Pod有固定名称 :名称格式为 <statefulset-name>-<序号>,如 mysql-0、mysql-1
2. 稳定存储 :通过Pvc绑定原来存储,Pod重启后依然可以绑定原来的存储。
3.有序操作 :扩缩容或更新时**,pod按序号执行更新顺序**
4.网络标识 :通过headless服务,提供固定的DNS服务记录 (如:mysql-0.mysql-service.default.svc.cluster.local)
4.适用场景:
1.数据库(MySQL 主从、PostgreSQL 集群)。
2.分布式系统(Kafka、ZooKeeper、Elasticsearch)。
3.需要持久化状态的应用(如缓存服务器 Redis Cluster)。
5.与deployment的核心区别 :deployment负责管理无状态数据的Pod部署,StatefulSet负责管理有状态数据的Pod部署。
3.2部署StatefulSet
说明 :运行 3 个 有状态数据的 MySQL 数据库 Pod
3.2.1部署Pod
1.编辑yaml文件
bash
apiVersion: "apps/v1"
kind: "StatefulSet"
metadata:
name: "dbserver"
annotations:
kubernetes.io/change-cause: "Initial data added"
spec:
replicas: 3
selector:
matchLabels: #标签匹配
app: "db"
serviceName: "database" #这个 StatefulSet 关联/引用的 Headless Service
template: #Pod模板,告诉 StatefulSet 控制器"每个 Pod 应该长什么样"
metadata:
labels:
app: "db"
spec:
containers:
- name: "db-backend" #Pod名
image: "reg.westos.org/library/mysql:v2" #镜像
imagePullPolicy: IfNotPresent
env:
- name: MYSQL_ROOT_PASSWORD #数据库密码变量
value: "redhat"
ports:
- containerPort: 3306

2.运行yaml文件
bash
kubectl apply -f sts-db.yml
kubectl get sts #查看sts
kubectl get pod -o wide | grep dbserver #查看Pod

3.2.2部署headless
说明 :headless作为Pod的访问入口,客户端通过它解析到 StatefulSet 的各个 Pod(dbserver-0/1/2),再由客户端自己做访问
1.编写yaml文件
bash
vim service-db-headless.yml
添加以下内容:
bash
apiVersion: "v1"
kind: "Service"
metadata:
name: "database"
spec:
clusterIP: None
ports:
- protocol: "TCP"
port: 3306
name: mysql
selector:
app: "db"

2.运行service
bash
kubectl apply -f service-db-headless.yml
kubectl get service database
kubectl get endpointslices.discovery.k8s.io | grep database

3.测试连接后端数据库
bash
kubectl get svc -o wide | grep web
curl 192.168.7.100/cgi-bin/action


4.测试访问客户端
bash
kubectl get pod #查看webserverPod
kubectl exec -it webserver-5d78984568-44lwl -- bash #进入webPod内部
telnet database 3306 #测试域名访问情况

3.2.3定向访问后端Pod
1.域名如下:
bash
dbserver-0.database.<namespace>.svc.cluster.local #该域名指向dbserver-0
dbserver-1.database.<namespace>.svc.cluster.local #该域名指向dbserver-1
dbserver-2.database.<namespace>.svc.cluster.local #该域名指向dbserver-2
2.测试:
bash
kubectl exec -it webserver-598d5d6fdc-qsx7c -- bash #进入容器内部
vi /etc/yum.repos.d/CentOS-Base.repo #修改软件镜像源

修改以下内容:改成阿里云源
bash
[base]
name=CentOS-$releasever - Base
baseurl=http://mirrors.aliyun.com/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7

下载mysql客户端
bash
yum install mariadb -y
测试连接:
bash
mysql -h dbserver-0.database.default.svc.cluster.local -uroot -predhat
mysql -h dbserver-1.database.default.svc.cluster.local -uroot -predhat
mysql -h dbserver-2.database.default.svc.cluster.local -uroot -predhat

3.2.4StatefulSet结合ConfigMap与Volume
说明:通过ConfigMap配置数据,将数据放到存储卷中,StatefulSet绑定存储卷,确保重启Pod后数据依然存在
1.编写yaml文件
bash
vim sts-db.yml
添加以下内容:
bash
apiVersion: "apps/v1"
kind: "StatefulSet" #资源类型
metadata:
name: "dbserver"
annotations:
kubernetes.io/change-cause: "Initial data added" #版本描述
spec:
replicas: 3 #副本数量
selector:
matchLabels:
app: "db"
serviceName: "database"
template:
metadata:
labels:
app: "db"
spec:
containers:
- name: "db-backend"
image: "reg.westos.org/library/mysql:v2"
imagePullPolicy: IfNotPresent
env:
- name: MYSQL_ROOT_PASSWORD
value: "redhat"
ports:
- containerPort: 3306
volumeMounts: #定义挂载点
- name: configvol
mountPath: /docker-entrypoint-initdb.d/
volumes:
- name: configvol #定义挂载卷
configMap:
name: dbinit

2.创建数据卷
bash
kubectl create configmap dbinit --from-file=init.sql #读取当前目录下的 init.sql 文件,用它创建一个名为 dbinit 的 ConfigMap。
kubectl get cm dbinit
kubectl get configmaps dbinit -o json


3.测试
bash
kubectl rollout restart statefulset dbserver #重启sts的Pod
curl 192.168.7.100/cgi-bin/action

3.3扩缩容
bash
kubectl scale sts dbserver --replicas 5 #修改副本数5
kubectl get pod -l app=db

3.4版本升级与回退
bash
kubectl apply -f sts-db-cm.yml --record #记录当前版本
kubectl rollout history statefulset dbserver

修改模板内容
bash
annotations:
kubernetes.io/change-cause: "mysql v1" #修改版本注释
image: "reg.westos.org/library/mysql:v1" #修改镜像


升级版本:
bash
kubectl apply -f sts-db.yml
kubectl rollout history statefulset dbserver

回退版本:
bash
kubectl rollout undo statefulset dbserver --to-revision=2 #回退之前的版本
kubectl rollout history statefulset dbserver

3.5StatefulSet管理策略
1.说明 :podManagementPolicy: OrderedReady 是 Kubernetes 中 StatefulSet 特有的配置字段,用于定义 Pod****副本的创建、更新和删除顺序,是 StatefulSet 实现有状态应用有序管理的核心机制之一。
2. 核心作用:StatefulSet 管 理 的 Pod 具 有 固 定 序 号 ( 如 web-0 、 web-1 、 web-2 ),podManagementPolicy 控制这些 Pod 的操作顺序:
● 当设置为 OrderedReady(默认值)时,所有操作(创建、更新、删除)会按****Pod 序号从小到大依次执行,前一个 Pod 就绪(Ready )后,才会处理下一个。
● 与之对应的另一个值是 Parallel,表示所有****Pod 并行操作(不按顺序,适合适合无依赖关系的有状态应用)。
3.注意事项
● OrderedReady 会增加操作耗时(需等待等待前一个 Pod 就绪),但能保证集群稳定性。
● 若应用无严格依赖关系,可设置 podManagementPolicy: Parallel 加速快部署/更新速度。
● 该字段仅对 StatefulSet 有效,Deployment、DaemonSet 等工作负载不支持。
四.守护进程集------DaemonSet
4.1简单介绍
1.作用: 确保集群中所有节点上都运行一个相同的 Pod****副本,常用于节点级别的服务
2.特点:
1.节点亲和 :默认在所有节点部署,可通过****nodeSelector 限制在特定节点运行。
2. 自动适配:新节点加入集群时,自动在该节点部署 Pod;节点移除时,自动删除对
应 Pod。
3.无副本数配置 :副本数由节点数量决定(符合条件的节点数 = 副本数)。
3.适用场景:
● 节点监控(如 Prometheus Node Exporter)。
● 网络插件(如 Calico、Flannel 的代理组件)。
● 日志收集(如 Fluentd、Logstash)。
● 存储插件(如 Ceph 客户端)。
4.2创建DaemonSet
1.编写yaml文件
bash
vim ds-fluentd-elasticsearch.yml
添加以下内容:
bash
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: fluentd-elasticsearch
namespace: kube-system
labels:
k8s-app: fluentd-logging #Daemonset标签
spec:
selector:
matchLabels:
name: fluentd-elasticsearch #匹配标签
template:
metadata:
labels:
name: fluentd-elasticsearch #元数据标签,容器标签
spec:
tolerations: #标签容忍
- key: node-role.kubernetes.io/control-plane
operator: Exists
effect: NoSchedule
- key: node-role.kubernetes.io/master
operator: Exists
effect: NoSchedule
containers:
- name: fluentd-elasticsearch
image: quay.io/fluentd_elasticsearch/fluentd:v5.0.1 #修改镜像地址
volumeMounts:
- name: varlog
mountPath: /var/log
terminationGracePeriodSeconds: 30
volumes:
- name: varlog
hostPath:
path: /var/log

2.运行yaml文件
bash
kubectl apply -f ds-fluentd-elasticsearch.yml --record #运行yaml文件
kubectl -n kube-system rollout history daemonset fluentd-elasticsearch #查看daemonset
kubectl get -n kube-system pod | grep fluentd-elasticsearch


4.3DaemonSet更新策略
OnDelete:仅当手动删除旧的 DaemonSet Pod 时才会创建新的 DaemonSet Pod
RollingUpdate (default):DaemonSet 模板更新后,旧的 DaemonSet Pod 将被杀死,新的 DaemonSet
Pod 将自动创建:整个更新过程中,每个节点最多运行一个 DaemonSet 的 Pod
4.4DaemonSet升级和回滚策略
1.编写yaml文件
bash
vim ds-fluentd-elasticsearch-update.yml
添加以下内容:
bash
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: fluentd-elasticsearch
namespace: kube-system
labels:
k8s-app: fluentd-logging
spec:
selector:
matchLabels:
name: fluentd-elasticsearch
template:
metadata:
labels:
name: fluentd-elasticsearch
spec:
tolerations:
- key: node-role.kubernetes.io/control-plane
operator: Exists
effect: NoSchedule
- key: node-role.kubernetes.io/master
operator: Exists
effect: NoSchedule
containers:
- name: fluentd-elasticsearch
image: quay.io/fluentd_elasticsearch/fluentd:v5.0.1
resources:
limits: #资源限制,决定运行时最多能用多少
memory: 200Mi
requests: #资源请求,决定 Pod 能不能被调度、能保底拿到多少资源
cpu: 100m
memory: 200Mi
volumeMounts:
- name: varlog
mountPath: /var/log
terminationGracePeriodSeconds: 30
volumes:
- name: varlog
hostPath:
path: /var/log

2.运行yaml文件
bash
kubectl apply -f ds-fluentd-elasticsearch-update.yml
kubectl -n kube-system rollout history daemonsets fluentd-elasticsearch
kubectl -n kube-system get controllerrevisions


五.一次性任务------Job
5.1简单介绍
1.核心作用: 运行一次性任务(如数据备份),确保任务成功完成后终止,不保留副本。
2.特点:
1. 一次性:任务完成(Pod 成功退出)后,Job 状态变为 Completed。
2.重试机制:若 Pod 失败,Job 会自动重试(可通过 backoffLimit 限制重试次数)。
3.并行执行:支持 parallelism 配置并行运行的 Pod 数量(如同时启动5个Pod 处理任务)。
3.适用场景:
1. 数据迁移(如从旧数据库迁移数据到新库)。
2.日志分析(一次性处理历史日志)。
3.批处理计算(如生成报表、图片处理)。
5.2创建Job
说明:用 Perl 计算圆周率 π 的 2000 位小数,并把结果打印到日志。
1.编写yaml文件
bash
vim job.yml
添加以下内容:
bash
apiVersion: batch/v1
kind: Job
metadata:
name: pi
spec:
completions: 6 #总需完成6次任务
parallelism: 2 #一次并行2个任务
template:
spec:
containers:
- name: pi
image: reg.westos.org/library/perl:5.34.0
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"] #用 Perl 计算圆周率 π 的 2000 位小数,并打印到标准输出
restartPolicy: Never
backoffLimit: 4 #总多失败四次

2.运行任务
bash
kubectl apply -f job.yml
kubectl get pod -l job-name
kubectl logs pi-zrp99 #查看圆周率结果


5.3回收Job
bash
kubectl delete jobs.batch pi #删除任务
kubectl get pod -l job-name

六.定时任务------CronJob
6.1简单介绍
1.核心作用: 按照时间规则(类似 Linux crontab) 周期性运行任务(如定时备份、日志清理)。
2.特点:
1.定时触发 :通过 schedule 字段定义执行时间(如 0 3 * * * 表示每天凌晨 3 点)。
2.基于Job :每个周期自动创建一个 Job 执行任务,任务完成后 Job 保留(可配置自动清理)。
3.容错机制 :支持 startingDeadlineSeconds 配置任务启动的截止时间,避免错过时间后重复执行。
3. 适用场景:
1.定时备份(如每天凌晨备份数据库)。
2.日志清理(如每周日删除 7 天前的日志)。
3.周期性报表生成(如每小时生成业务统计报表)。
6.2创建CronJob
说明 :每分钟在终端输出时间和指定内容
1.编写yaml文件
bash
vim cronjob.yml
添加以下内容:
bash
apiVersion: batch/v1
kind: CronJob
metadata:
name: hello
spec:
schedule: "* * * * *" # 每分钟运行一次任务
jobTemplate:
spec:
template: #Pod模板
spec:
containers:
- name: hello
image: reg.westos.org/library/busybox:1.30.1 #镜像地址
imagePullPolicy: IfNotPresent
command: #设置命令
- /bin/sh
- -c
- date; echo Hello from the Kubernetes cluster
restartPolicy: OnFailure #重启策略

2.运行CronJob任务
bash
kubectl apply -f cronjob.yml
kubectl get cronjob.batch/hello
kubectl get pod -l job-name
kubectl logs hello-29890875-q29b5


6.3回收CronJob
bash
kubectl delete cronjob hello
