
一.Replicaset控制器作用保证 Pod 副本数量始终维持期望值Pod 挂掉自动重建。注意ReplicaSet 不支持滚动更新只能扩缩容。1.建立控制器[rootmaster controler]# kubectl create deployment webcluster --image myapp:v1 --dry-runclient -o yaml repset.yml[rootmaster controler]# vim repset.ymlapiVersion: apps/v1 kind: ReplicaSet metadata: labels: app: webcluster name: webcluster spec: replicas:2selector: matchLabels: app: webcluster# strategy: {}template: metadata: labels: app: webcluster spec: containers: - image: myapp:v1 name: myapp[rootmaster controler]# kubectl apply -f repset.yml#打开一个新的shell[rootmaster ~]# watch -n 1 kubectl get pods --show-labelsEvery1.0s: kubectl get pods --show-labels master: Sat Apr1110:08:322026NAME READY STATUS RESTARTS AGE LABELS webcluster-tbxq41/1 Running06m49sappwebcluster webcluster-jna231/1 Running06m49sappwebcluster#拉伸kubectl scale replicaset webcluster--replicas4kubectl scale replicaset webcluster--replicas2kubectl scale replicaset webcluster--replicas02.测试功能[rootmaster controler]# vim repset.yml。。。。 spec: replicas:4。。。。[rootmaster controler]# kubectl apply -f repset.yml[rootmaster ~]# watch -n 1 kubectl get pods --show-labelsEvery1.0s: kubectl get pods --show-labels master: Sat Apr1110:11:062026NAME READY STATUS RESTARTS AGE LABELS webcluster-4sxz41/1 Running013sappwebcluster webcluster-lvtsn1/1 Running013sappwebcluster webcluster-tbxq41/1 Running09m23sappwebcluster webcluster-tr5qk1/1 Running013sappwebcluster二.deployment1.监控[rootmaster ~]# watch -n 1 kubectl get pods --show-labels;echo ;kubectl get replicasets.apps2.建立deployment控制器Deployment 是上层控制器底层管理 ReplicaSet。[rootmaster controler]# kubectl create deployment webcluster --image myapp:v1 --dry-runclient -o yaml dep.yml[rootmaster controler]# vim dep.ymlapiVersion: apps/v1 kind: Deployment metadata: labels: app: webcluster name: webcluster spec: minReadySeconds:5replicas:2selector: matchLabels: app: webcluster# strategy: {}template: metadata: labels: app: webcluster spec: containers: - image: myapp:v1 name: myapp# resources: {}[rootmaster controler]# kubectl apply -f dep.yml#监控部分显示效果Every1.0s: kubectl get pods --show-labels;echo;kubectl get replicase... master: Sat Apr1110:43:242026NAME READY STATUS RESTARTS AGE LABELS webcluster-77c87d9946-49kh51/1 Running045sappwebcluster,pod-template-hash77c87d9946 webcluster-77c87d9946-m2x2d1/1 Running045sappwebcluster,pod-template-hash77c87d9946NAME DESIRED CURRENT READY AGE webcluster-77c87d994622245s#发布服务[rootmaster controler]# kubectl expose deployment webcluster --port 80 --target-port 80[rootmaster controler]# kubectl describe services webclusterName: webcluster Namespace: default Labels:appwebcluster Annotations:noneSelector:appwebcluster Type: ClusterIP IP Family Policy: SingleStack IP Families: IPv4 IP:10.107.142.60 IPs:10.107.142.60 Port:unset80/TCP TargetPort:80/TCP Endpoints:10.244.2.6:80,10.244.1.9:80 Session Affinity: None Internal Traffic Policy: Cluster Events:none#访问[rootmaster controler]# curl 10.107.142.60Hello MyApp|Version: v1|ahrefhostname.htmlPod Name/a3.升级和回滚原理Deployment 会新建一个 ReplicaSet逐步启动新版本 Pod销毁旧版本 Pod实现滚动更新。minReadySeconds:5Pod 启动完成后等待 5 秒才算就绪防止流量切到还没准备好的容器。#升级[rootmaster controler]# vim dep.yml。。。。 spec: minReadySeconds:5replicas:2selector: matchLabels: app: webcluster# strategy: {}template: metadata: labels: app: webcluster spec: containers: - image: myapp:v2#升级为版本2name: myapp 。。。。[rootmaster controler]# kubectl apply -f dep.ymldeployment.apps/webcluster configured[rootmaster controler]# curl 10.107.142.60Hello MyApp|Version: v2|ahrefhostname.htmlPod Name/a#回滚[rootmaster controler]# vim dep.yml。。。。 spec: minReadySeconds:5replicas:2selector: matchLabels: app: webcluster# strategy: {}template: metadata: labels: app: webcluster spec: containers: - image: myapp:v1#回滚为版本1name: myapp 。。。。[rootmaster controler]# kubectl apply -f dep.yml[rootmaster controler]# curl 10.107.142.60Hello MyApp|Version: v1|ahrefhostname.htmlPod Name/a三.版本更新管理及优化[rootmaster controler]# vim dep.ymlspec: minReadySeconds:5#就绪后观察5秒才标记为可用replicas:6#把pod数量设定为6方便观察selector:[rootmaster controler]# kubectl apply -f dep.ymldeployment.apps/webcluster configured1.查看更新策略信息输出默认滚动更新策略RollingUpdateStrategy: 25% max unavailable, 25% max surgemaxSurge更新过程最多可以比期望副本数多出来多少 Pod百分比 / 数字maxUnavailable更新过程最多允许多少 Pod 不可用百分比 / 数字[rootmaster controler]# kubectl describe deployments.apps webcluster RollingUpdateStrategy: 25% max unavailable, 25% max surge2.设定更新策略[rootmaster controler]# vim dep.yml spec: minReadySeconds:5replicas:6selector: matchLabels: app: webcluster strategy: rollingUpdate: maxSurge:1#更新时pod数量最多比期望值多一个maxUnavailable:0#不能使用pod数量比期望值数量多0template: metadata: labels: app: webcluster spec: containers: - image: myapp:v1 name: myapp[rootmaster controler]# kubectl apply -f dep.yml3.更新暂停和恢复[rootmaster controler]# kubectl rollout history deployment webclusterdeployment.apps/webcluster REVISION CHANGE-CAUSE7none8none[rootmaster controler]# kubectl rollout pause deployment webcluster #暂停更新deployment.apps/webcluster paused[rootmaster controler]# vim dep.yml。。。 containers: - image: myapp:v2 name: myapp 。。。[rootmaster controler]# kubectl apply -f dep.yml #执行成功。但更新过程在监控中没出现deployment.apps/webcluster configured[rootmaster controler]# kubectl rollout history deployment webclusterdeployment.apps/webcluster REVISION CHANGE-CAUSE7none8none[rootmaster controler]# kubectl rollout resume deployment webcluster #开启更新deployment.apps/webcluster resumed[rootmaster controler]# kubectl rollout history deployment webclusterdeployment.apps/webcluster REVISION CHANGE-CAUSE8none9none四.DaemonSet作用在集群每一个 Node 节点上运行一个 Pod。场景日志采集、监控代理、网络插件。新增节点会自动在新节点启动 Pod节点删除Pod 自动删除。[rootmaster controler]# kubectl create deployment daemonset --image myapp:v1 --dry-runclient -o yaml daemonset.yml[rootmaster controler]# vim daemonset.ymlapiVersion: apps/v1 kind: DaemonSet metadata: labels: app: daemonset name: daemonset spec: selector: matchLabels: app: daemonset template: metadata: labels: app: daemonset spec: containers: - image: myapp:v1 name: myapp#另外开启一个主机node3并设定在初始化集群时的所有设定确保所有服务的开启#在master中重新生成集群主机注册时需要的token[rootmaster controler]# kubeadm token create --print-join-commandkubeadmjoin172.25.254.100:6443--tokenlqcz14.6f4krq91w75h58bt --discovery-token-ca-cert-hash sha256:6b5950ef2cdba85d6dfdb564ee90d4187fa3d341767dc9852cbdd5c9dee4f927[rootnode3 ~]# 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加入集群后会在node3中立即群星指定的pod其原因是因为运行了daemonset#可以在master中观察pod的状态五.Job控制器[rootmaster ~]# docker load -i perl-5.34.tar.gz[rootmaster ~]# docker tag perl:5.34.0 reg.timinglee.org/library/perl:5.34.0[rootmaster ~]# docker login reg.timinglee.org -u adminPassword: Login Succeeded[rootmaster ~]# docker push reg.timinglee.org/library/perl:5.34.0[rootmaster controler]# kubectl create job job --image perl:5.34.0 --dry-runclient -o yaml job.yml[rootmaster controler]# vim job.ymlapiVersion: batch/v1 kind: Job metadata: name: job spec: completions:6parallelism:2template: spec: containers: - image: perl:5.34.0 name: job command:[perl,-Mbignumbpi,-wle,print bpi(2000)]restartPolicy: Never backoffLimit:4#completions总共需要成功完成多少个 Pod 任务# parallelism同时并行运行多少个 Pod# restartPolicy: Never任务失败不重启 Pod# backoffLimit:4任务失败最多重试 4 次[rootmaster controler]# kubectl apply -f job.ymljob.batch/job created[rootmaster controler]# kubectl logs job-4b45g3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989380952572010654858632788659361533818279682303019520353018529689957736225994138912497217752834791315155748572424541506959508295331168617278558890750983817546374649393192550604009277016711390098488240128583616035637076601047101819429555961989467678374494482553797747268471040475346462080466842590694912933136770289891521047521620569660240580381501935112533824300355876402474964732639141992726042699227967823547816360093417216412199245863150302861829745557067498385054945885869269956909272107975093029553211653449872027559602364806654991198818347977535663698074265425278625518184175746728909777727938000816470600161452491921732172147723501414419735685481613611573525521334757418494684385233239073941433345477624168625189835694855620992192221842725502542568876717904946016534668049886272327917860857843838279679766814541009538837863609506800642251252051173929848960841284886269456042419652850222106611863067442786220391949450471237137869609563643719172874677646575739624138908658326459958133904780275901六.Cronjob控制器Job 的定时版本linux crontab按时间周期自动创建 Job。schedulecron 表达式分 时 日 月 周restartPolicy: OnFailure任务失败才重启成功不重启[rootmaster controler]# kubectl create cronjob cronjob --image busybox --schedule * * * * * --dry-runclient -o yaml cronjob.yml[rootmaster controler]# vim cronjob.ymlapiVersion: batch/v1 kind: CronJob metadata: name: cronjob spec: jobTemplate: metadata: name: cronjob spec: template: spec: containers: - image: busybox name: cronjob command: - /bin/sh --c-echohello timingleerestartPolicy: OnFailure schedule:* * * * *[rootmaster controler]# kubectl apply -f cronjob.yml #整分运行[rootmaster controler]# kubectl get cronjobs.batchNAME SCHEDULE TIMEZONE SUSPEND ACTIVE LAST SCHEDULE AGE cronjob * * * * *noneFalse017s 70s[rootmaster controler]# kubectl logs cronjob-29598241-pxgghhello timinglee