控制器管理
·
一.Replicaset 控制器
ReplicaSet:保证集群中持续运行指定数量的 Pod,通过标签 selector 匹配管理 Pod;不直接生产使用,由 Deployment 内部调用
# --dry-run=client 只模拟创建不实际生成资源,-o yaml输出yaml,重定向保存到repset.yml
[root@master controler]# kubectl create deployment webcluster --image myapp:v1 --dry-run=client -o yaml > repset.yml
[root@master controler]# vim repset.yml
apiVersion: apps/v1
kind: ReplicaSet #资源类型ReplicaSet
metadata:
labels:
app: webcluster
name: webcluster
spec:
replicas: 2 #期望副本数2个pod
selector:
matchLabels:
app: webcluster #选择器,匹配标签app=webcluster的pod进行管理
# strategy: {}
template: #pod模板,控制器以此模板创建pod
metadata:
labels:
app: webcluster #pod标签,必须和selector匹配
spec:
containers:
- image: myapp:v1
name: myapp
#应用yaml,创建ReplicaSet资源
[root@master controler]# kubectl apply -f repset.yml
#新开shell,每1秒刷新查看pod以及pod标签
[root@master ~]# watch -n 1 kubectl get pods --show-labels
Every 1.0s: kubectl get pods --show-labels master: Sat Apr 11 10:08:32 2026
NAME READY STATUS RESTARTS AGE LABELS
webcluster-tbxq4 1/1 Running 0 6m49s app=webcluster
webcluster-jna23 1/1 Running 0 6m49s app=webcluster
#命令式扩容缩容
kubectl scale replicaset webcluster --replicas 4 #扩容到4副本
kubectl scale replicaset webcluster --replicas 2 #缩容到2副本
kubectl scale replicaset webcluster --replicas 0 #副本数0,销毁所有pod
2. 测试功能(修改 yaml 文件声明式扩容)
[root@master controler]# vim repset.yml
spec:
replicas: 4 #修改期望副本为4
#重新应用配置,完成扩容
[root@master controler]# kubectl apply -f repset.yml
#监控pod变化
[root@master ~]# watch -n 1 kubectl get pods --show-labels
Every 1.0s: kubectl get pods --show-labels master: Sat Apr 11 10:11:06 2026
NAME READY STATUS RESTARTS AGE LABELS
webcluster-4sxz4 1/1 Running 0 13s app=webcluster
webcluster-lvtsn 1/1 Running 0 13s app=webcluster
webcluster-tbxq4 1/1 Running 0 9m23s app=webcluster
webcluster-tr5qk 1/1 Running 0 13s app=webcluster
二.deployment
Deployment:无状态应用控制器,底层调用 ReplicaSet;支持滚动升级、回滚,生产最常用
#同时监控pod列表和底层ReplicaSet资源
[root@master ~]# watch -n 1 " kubectl get pods --show-labels;echo ====;kubectl get replicasets.apps"
#模拟创建deployment,导出yaml保存到dep.yml
[root@master controler]# kubectl create deployment webcluster --image myapp:v1 --dry-run=client -o yaml > dep.yml
[root@master controler]# vim dep.yml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: webcluster
name: webcluster
spec:
minReadySeconds: 5 #pod就绪后等待5s才算可用
replicas: 2 #期望副本数
selector:
matchLabels:
app: webcluster #匹配pod标签
# strategy: {}
template: #pod模板
metadata:
labels:
app: webcluster
spec:
containers:
- image: myapp:v1
name: myapp
# resources: {}
#创建Deployment
[root@master controler]# kubectl apply -f dep.yml
#监控输出效果
Every 1.0s: kubectl get pods --show-labels;echo ====;kubectl get replicase... master: Sat Apr 11 10:43:24 2026
NAME READY STATUS RESTARTS AGE LABELS
webcluster-77c87d9946-49kh5 1/1 Running 0 45s app=webcluster,pod-template-hash=77c87d9946
webcluster-77c87d9946-m2x2d 1/1 Running 0 45s app=webcluster,pod-template-hash=77c87d9946
====
NAME DESIRED CURRENT READY AGE
webcluster-77c87d9946 2 2 2 45s
#创建service暴露Deployment服务,--port service端口,--target-port容器端口
[root@master controler]# kubectl expose deployment webcluster --port 80 --target-port 80
#查看service详细信息,查看ClusterIP、后端Endpoints
[root@master controler]# kubectl describe services webcluster
Name: webcluster
Namespace: default
Labels: app=webcluster
Annotations: <none>
Selector: app=webcluster
Type: ClusterIP
IP Family Policy: SingleStack
IP Families: IPv4
IP: 10.107.142.60
IPs: 10.107.142.60
Port: <unset> 80/TCP
TargetPort: 80/TCP
Endpoints: 10.244.2.6:80,10.244.1.9:80
Session Affinity: None
Internal Traffic Policy: Cluster
Events: <none>
#使用ClusterIP访问服务
[root@master controler]# curl 10.107.142.60
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
#升级:修改镜像版本为myapp:v2
[root@master controler]# vim dep.yml
spec:
minReadySeconds: 5
replicas: 2
selector:
matchLabels:
app: webcluster
# strategy: {}
template:
metadata:
labels:
app: webcluster
spec:
containers:
- image: myapp:v2 #升级为版本2
name: myapp
#应用配置触发滚动更新
[root@master controler]# kubectl apply -f dep.yml
deployment.apps/webcluster configured
#访问测试,返回v2代表升级成功
[root@master controler]# curl 10.107.142.60
Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>
#回滚,镜像改回v1
[root@master controler]# vim dep.yml
spec:
minReadySeconds: 5
replicas: 2
selector:
matchLabels:
app: webcluster
# strategy: {}
template:
metadata:
labels:
app: webcluster
spec:
containers:
- image: myapp:v1 #回滚为版本1
name: myapp
[root@master controler]# kubectl apply -f dep.yml
#访问验证,返回v1,完成回滚
[root@master controler]# curl 10.107.142.60
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
三、版本更新管理及优化
#修改副本数为6便于观察滚动更新过程
[root@master controler]# vim dep.yml
spec:
minReadySeconds: 5
replicas: 6 #把pod数量设定为6方便观察
selector:
[root@master controler]# kubectl apply -f dep.yml
deployment.apps/webcluster configured
#describe查看deployment详细,默认滚动更新参数
[root@master controler]# kubectl describe deployments.apps webcluster
RollingUpdateStrategy: 25% max unavailable, 25% max surge
[root@master controler]# vim dep.yml
spec:
minReadySeconds: 5
replicas: 6
selector:
matchLabels:
app: webcluster
strategy: #更新策略配置
rollingUpdate:
maxSurge: 1 #更新时pod数量最多比期望值多一个
maxUnavailable: 0 #更新过程中,不可用pod数量最多0个(不销毁旧pod,先起新pod)
template:
metadata:
labels:
app: webcluster
spec:
containers:
- image: myapp:v1
name: myapp
[root@master controler]# kubectl apply -f dep.yml
#查看deployment更新历史记录
[root@master controler]# kubectl rollout history deployment webcluster
deployment.apps/webcluster
REVISION CHANGE-CAUSE
7 <none>
8 <none>
#暂停deployment更新,修改配置不会触发实际滚动
[root@master controler]# kubectl rollout pause deployment webcluster
deployment.apps/webcluster paused
[root@master controler]# vim dep.yml
containers:
- image: myapp:v2
name: myapp
#apply执行成功,但因为pause暂停,不会执行pod更新
[root@master controler]# kubectl apply -f dep.yml
deployment.apps/webcluster configured
#再次查看历史,版本号没有新增
[root@master controler]# kubectl rollout history deployment webcluster
deployment.apps/webcluster
REVISION CHANGE-CAUSE
7 <none>
8 <none>
#恢复更新,此时才执行滚动升级
[root@master controler]# kubectl rollout resume deployment webcluster
deployment.apps/webcluster resumed
#恢复之后出现新版本revision
[root@master controler]# kubectl rollout history deployment webcluster
deployment.apps/webcluster
REVISION CHANGE-CAUSE
8 <none>
9 <none>
四.DaemonSet
DaemonSet:集群每一个节点运行一个 Pod;适合日志收集、监控代理组件;新增节点会自动部署 Pod
#模拟创建,导出DaemonSet yaml
[root@master controler]# kubectl create deployment daemonset --image myapp:v1 --dry-run=client -o yaml > daemonset.yml
[root@master controler]# vim daemonset.yml
apiVersion: apps/v1
kind: DaemonSet #控制器类型DaemonSet
metadata:
labels:
app: daemonset
name: daemonset
spec:
selector:
matchLabels:
app: daemonset
template:
metadata:
labels:
app: daemonset
spec:
containers:
- image: myapp:v1
name: myapp
#生成节点加入集群的join命令
[root@master controler]# kubeadm token create --print-join-command
kubeadm join 172.25.254.100:6443 --token lqcz14.6f4krq91w75h58bt --discovery-token-ca-cert-hash sha256:6b5950ef2cdba85d6dfdb564ee90d4187fa3d341767dc9852cbdd5c9dee4f927
#node3节点执行加入集群,指定cri‑dockerd的socket
[root@node3 ~]# kubeadm join 172.25.254.100:6443 --token lqcz14.6f4krq91w75h58bt --discovery-token-ca-cert-hash sha256:6b5950ef2cdba85d6dfdb564ee90d4187fa3d341767dc9852cbdd5c9dee4f927 --cri-socket unix:///var/run/cri-dockerd.sock
#node3加入集群,DaemonSet自动在node3启动pod
五、job控制器
Job:一次性任务控制器;执行一次性批处理任务,保证任务成功结束;restartPolicy 只能 Never/OnFailure
#导入镜像,打标签、推送私有仓库
[root@master ~]# docker load -i perl-5.34.tar.gz
[root@master ~]# docker tag perl:5.34.0 reg.timinglee.org/library/perl:5.34.0
[root@master ~]# docker login reg.timinglee.org -u admin
Password:
Login Succeeded
[root@master ~]# docker push reg.timinglee.org/library/perl:5.34.0
#模拟生成job的yaml
[root@master controler]# kubectl create job job --image perl:5.34.0 --dry-run=client -o yaml > job.yml
[root@master controler]# vim job.yml
apiVersion: batch/v1
kind: Job
metadata:
name: job
spec:
completions: 6 #总共需要成功完成6次任务
parallelism: 2 #最大并行同时运行2个pod
template:
spec:
containers:
- image: perl:5.34.0
name: job
#执行perl脚本计算圆周率
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
restartPolicy: Never #任务失败不重启pod
backoffLimit: 4 #失败重试最大次数
#创建job任务
[root@master controler]# kubectl apply -f job.yml
job.batch/job created
#查看任务pod输出日志
[root@master controler]# kubectl logs job-4b45g
六.Cronjob 控制器
CronJob:定时任务控制器,基于 linux cron 表达式定时生成 Job,执行定时批处理
#模拟创建cronjob,导出yaml;schedule为cron定时表达式,* * * * *代表每分钟执行
[root@master controler]# kubectl create cronjob cronjob --image busybox --schedule "* * * * *" --dry-run=client -o yaml > cronjob.yml
[root@master controler]# vim cronjob.yml
apiVersion: batch/v1
kind: CronJob
metadata:
name: cronjob
spec:
jobTemplate: #CronJob通过模板生成Job资源
metadata:
name: cronjob
spec:
template:
spec:
containers:
- image: busybox
name: cronjob
command:
- /bin/sh
- -c
- echo "hello timinglee" #定时执行输出
restartPolicy: OnFailure #任务失败才重启pod
schedule: '* * * * *' #cron定时表达式:分 时 日 月 周
#创建定时任务
[root@master controler]# kubectl apply -f cronjob.yml
#查看cronjob状态
[root@master controler]# kubectl get cronjobs.batch
NAME SCHEDULE TIMEZONE SUSPEND ACTIVE LAST SCHEDULE AGE
cronjob * * * * * <none> False 0 17s 70s
#查看定时任务pod输出日志
[root@master controler]# kubectl logs cronjob-29598241-pxggh
hello timinglee
更多推荐



所有评论(0)