ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

kubernetes 控制器的使用

kubernetes 控制器的使用 一 什么是控制器控制器也是管理pod的一种手段自主式podpod退出或意外关闭后不会被重新创建控制器管理的 Pod在控制器的生命周期里始终要维持 Pod 的副本数目Pod控制器是管理pod的中间层使用Pod控制器之后只需要告诉Pod控制器想要多少个什么样的 Pod就可以了它会创建出满足条件的Pod并确保每一个Pod资源处于用户期望的目标状态。如果Pod资 源在运行中出现故障它会基于指定策略重新编排Pod当建立控制器后会把期望值写入etcdk8s中的apiserver检索etcd中我们保存的期望状态并对比pod 的当前状态如果出现差异代码自驱动立即恢复二 控制器常用类型控制器名称控制器用途核心要点Replication Controller(RC)比较原始的 pod 控制器已经被废弃由 ReplicaSet 替代老版本控制器现已弃用不要在新版本集群使用ReplicaSet(RS)确保任何时间都有指定数量的 Pod 副本在运行只负责维持 Pod 副本数不支持滚动更新Deployment 底层会自动管理 RSDeployment为 Pod 和 ReplicaSet 提供声明式的更新能力无状态业务首选控制器支持滚动更新、回滚、扩缩容管理 ReplicaSetDaemonSet确保全指定节点上运行一个 Pod 的副本每个符合条件节点跑且仅跑 1 个 Pod适合日志采集、监控 agent如 node‑exporter、fluentdStatefulSet管理有状态应用的工作负载 API 对象给 Pod 稳定网络标识、稳定存储有序部署 / 收缩用于 mysql、redis 集群等有状态服务Job执行批处理任务仅执行一次任务保证任务的一个或多个 Pod 成功结束一次性任务保证任务成功完成退出失败会重建 Pod不用于常驻服务CronJob创建基于时间调度的 Jobs定时任务cron 表达式调度周期性创建 Job 对象HPA(Horizontal Pod Autoscaler)根据资源利用率自动调整 service 中 Pod 数量实现 Pod 水平自动缩放水平自动扩缩自动增减 Pod 副本数不操作节点只改 Pod 数量三 replicaset控制器3.1replicaset功能ReplicaSet 是下一代的 Replication Controller官方推荐使用ReplicaSetReplicaSet和Replication Controller的唯一区别是选择器的支持ReplicaSet支持新的基于集合的 选择器需求ReplicaSet 确保任何时间都有指定数量的 Pod 副本在运行虽然 ReplicaSets 可以独立使用但今天它主要被Deployments 用作协调 Pod 创建、删除和更新的 机制3.2 replicaset参数说明参数名称字段类型参数说明specObject资源的详细定义对象几乎所有业务配置都写在 spec 下spec.replicasinteger指定期望运行的 Pod 副本数量控制器会维持这个副本数spec.selectorObject标签选择器用来匹配 Pod 标签必须和 pod 模板里 labels 保持对应控制器通过它找到要管理的 Podspec.selector.matchLabelsstring标签匹配key:value 格式用来筛选对应标签的 Podspec.templateObjectPod 模板定义要创建的 Pod 长什么样是创建 Pod 的模板spec.template.metadataObjectPod 的元数据信息spec.template.metadata.labelsstring给 Pod 打标签selector.matchLabels 要能匹配这里的标签spec.template.specObjectPod 的 spec定义 Pod 内部容器、卷等配置spec.template.spec.containerslistPod 内部容器列表一个 Pod 可以多个容器spec.template.spec.containers.namestring容器名称spec.template.spec.containers.imagestring容器使用的镜像3.3 replicaset 示例[rootmaster controler]# kubectl create deployment web1 --image myapp:v1 --dry-runclient -o yaml replicaset.yml [rootmaster controler]# vim replicaset.yml apiVersion: apps/v1 kind: Deployment metadata: labels: app: web1 name: web1 spec: replicas: 1 selector: matchLabels: app: web1 template: metadata: labels: app: web1 spec: containers: - image: myapp:v1 name: myapp [rootmaster controler]# kubectl apply -f replicaset.yml deployment.apps/web1 created #打开一个新的shell [rootmaster ~]# 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 appwebcluster#扩容 [rootmaster controler]# kubectl scale deployment web1 --replicas 4 deployment.apps/web1 scaled #缩容 [rootmaster controler]# kubectl scale deployment web1 --replicas 1 deployment.apps/web1 scaled [rootmaster controler]# kubectl get pods --show-labels NAME READY STATUS RESTARTS AGE LABELS web1-59647bb49-qb722 1/1 Running 0 2m27s appweb1,pod-templat e-hash59647bb49 webserver 1/1 Running 0 21h runwebserver #replicaset是通过标签匹配pod 去掉标签 [rootmaster controler]# kubectl label pod web1-59647bb49-qb722 applin --overwr ite pod/web1-59647bb49-qb722 labeled [rootmaster controler]# kubectl get pods --show-labels NAME READY STATUS RESTARTS AGE LABELS web1-59647bb49-2pvsf 1/1 Running 0 13s appweb1,pod-templat #新开启的 e-hash59647bb49 web1-59647bb49-qb722 1/1 Running 0 3m58s applin,pod-template -hash59647bb49 webserver 1/1 Running 0 21h runwebserver #打上标签pod回复去掉多余pod [rootmaster controler]# kubectl label pod web1-59647bb49-qb722 appweb1 --overwrite pod/web1-59647bb49-qb722 labeled [rootmaster controler]# kubectl get pods --show-labels NAME READY STATUS RESTARTS AGE LABELS web1-59647bb49-qb722 1/1 Running 0 6m26s appweb1,pod-template-hash59647bb49 webserver 1/1 Running 0 21h runwebserver四 deployment 控制器4.1 deployment控制器的功能为了更好的解决服务编排的问题kubernetes在V1.2版本开始引入了Deployment控制器。 Deployment控制器并不直接管理pod而是通过管理ReplicaSet来间接管理PodDeployment管理ReplicaSetReplicaSet管理PodDeployment 为 Pod 和 ReplicaSet 提供了一个申明式的定义方法在Deployment中ReplicaSet相当于一个版本典型的应用场景1.用来创建Pod和ReplicaSet2.滚动更新和回滚3.扩容和缩容4.暂停与恢复4.2 deployment控制器示例[rootmaster controler]# kubectl create deployment web2 --image myapp:v1 --dry-r unclient -o yaml deployment.yml [rootmaster controler]# vim deployment.yml apiVersion: apps/v1 kind: Deployment metadata: labels: app: web2 name: web2 spec: minReadySeconds: 5 replicas: 1 selector: matchLabels: app: web2 template: metadata: labels: app: web2 spec: containers: - image: myapp:v1 name: myapp [rootmaster controler]# kubectl apply -f deployment.yml deployment.apps/web2 created [rootmaster controler]# kubectl expose deployment web2 --port 80 --target-port 80 service/web2 exposed [rootmaster controler]# kubectl describe services web2 Name: web2 Namespace: default Labels: appweb2 Annotations: none Selector: appweb2 Type: ClusterIP IP Family Policy: SingleStack IP Families: IPv4 IP: 10.101.21.227 IPs: 10.101.21.227 Port: unset 80/TCP TargetPort: 80/TCP Endpoints: 10.244.3.25:80 Session Affinity: None Internal Traffic Policy: Cluster Events: none [rootmaster controler]# curl 10.101.21.227 Hello MyApp | Version: v1 | a hrefhostname.htmlPod Name/a4.2.1 版本迭代#升级[rootmaster controler]# vim deployment.yml apiVersion: apps/v1 kind: Deployment metadata: labels: app: web2 name: web2 spec: minReadySeconds: 5 replicas: 6 selector: matchLabels: app: web2 template: metadata: labels: app: web2 spec: containers: - image: myapp:v2 #更改版本 name: myapp [rootmaster controler]# kubectl delete -f deployment.yml deployment.apps web2 deleted from default namespace [rootmaster controler]# kubectl apply -f deployment.yml deployment.apps/web2 created [rootmaster controler]# curl 10.101.21.227 Hello MyApp | Version: v2 | a hrefhostname.htmlPod Name/a更新的过程是重新建立一个版本的RS新版本的RS会把pod 重建然后把老版本的RS回收#回滚[rootmaster controler]# vim deployment.yml apiVersion: apps/v1 kind: Deployment metadata: labels: app: web2 name: web2 spec: minReadySeconds: 5 replicas: 6 selector: matchLabels: app: web2 template: metadata: labels: app: web2 spec: containers: - image: myapp:v1 #回滚到原来版本 name: myapp [rootmaster controler]# kubectl delete -f deployment.yml deployment.apps web2 deleted from default namespace [rootmaster controler]# kubectl apply -f deployment.yml deployment.apps/web2 created [rootmaster controler]# curl 10.101.21.227 Hello MyApp | Version: v2 | a hrefhostname.htmlPod Name/a4.2.2 版本更新策略[rootmaster controler]# vim deployment.yml replicas: 6 #改成6个好观察 [rootmaster controler]# kubectl delete -f deployment.yml deployment.apps web2 deleted from default namespace [rootmaster controler]# kubectl apply -f deployment.yml deployment.apps/web2 created [rootmaster controler]# kubectl describe deployments.apps web2 Name: web2 Namespace: default CreationTimestamp: Wed, 26 Aug 2026 19:42:48 0800 Labels: appweb2 Annotations: deployment.kubernetes.io/revision: 1 Selector: appweb2 Replicas: 6 desired | 6 updated | 6 total | 6 available | 0 unavai lable StrategyType: RollingUpdate MinReadySeconds: 5 RollingUpdateStrategy: 25% max unavailable, 25% max surge #这里更新策略默认是25% [rootmaster controler]# vim deployment.yml ... spec: minReadySeconds: 5 replicas: 6 selector: matchLabels: app: web2 strategy: rollingUpdate: maxSurge: 1 maxUnavailable: 0 ... [rootmaster controler]# kubectl delete -f deployment.yml deployment.apps web2 deleted from default namespace [rootmaster controler]# kubectl apply -f deployment.yml deployment.apps/web2 created4.2.3 暂停及恢复在实际生产环境中我们做的变更可能不止一处当修改了一处后如果执行变更就直接触发了 我们期望的触发时当我们把所有修改都搞定后一次触发暂停避免触发不必要的线上更新#更新历史 [rootmaster controler]# kubectl rollout history deployment web2 deployment.apps/web2 REVISION CHANGE-CAUSE 1 none 2 none #暂停更新 [rootmaster controler]# kubectl rollout pause deployment web2 deployment.apps/web2 paused [rootmaster controler]# vim deployment.yml #修改更新版本 [rootmaster controler]# kubectl apply -f deployment.yml deployment.apps/web2 configured [rootmaster controler]# curl 10.101.21.227 Hello MyApp | Version: v1 | a hrefhostname.htmlPod Name/a [rootmaster controler]# vim deployment.yml #可以看到更新了文件之后重启版本不变 #开启更新现在可以正常更新 [rootmaster controler]# kubectl rollout resume deployment web2 deployment.apps/web2 resumed [rootmaster controler]# kubectl rollout history deployment web2 deployment.apps/web2五 daemonset控制器5.1 daemonset功能DaemonSet 确保全部或者某些节点上运行一个 Pod 的副本。当有节点加入集群时 也会为他们新 增一个 Pod 当有节点从集群移除时这些 Pod 也会被回收。删除 DaemonSet 将会删除它创建的所有 PodDaemonSet 的典型用法在每个节点上运行集群存储 DaemonSet例如 glusterd、ceph。在每个节点上运行日志收集 DaemonSet例如 fluentd、logstash。在每个节点上运行监控 DaemonSet例如 Prometheus Node Exporter、zabbix agent等一个简单的用法是在所有的节点上都启动一个 DaemonSet将被作为每种类型的 daemon 使用一个稍微复杂的用法是单独对每种 daemon 类型使用多个 DaemonSet但具有不同的标志 并且 对不同硬件类型具有不同的内存、CPU 要求5.2 daemonset 示例[rootmaster controler]# kubectl create deployment web3 --image myapp:v1 --dry-r unclient -o yaml daemonset.yml [rootmaster controler]# vim daemonset.yml apiVersion: apps/v1 kind: DaemonSet metadata: labels: app: web3 name: web3 spec: selector: matchLabels: app: web3 template: metadata: labels: app: web3 spec: containers: - image: myapp:v1 name: myapp [rootmaster controler]# kubectl apply -f daemonset.yml daemonset.apps/web3 created [rootmaster controler]# kubectl get pods-o wide error: the server doesnt have a resource type pods-o [rootmaster controler]# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES web3-2cfsc 1/1 Running 0 29s 10.244.2.51 node2 none none web3-dfwmb 1/1 Running 0 29s 10.244.3.35 node3 none none web3-fxvhw 1/1 Running 0 29s 10.244.1.42 node1 none none webserver 1/1 Running 0 22h 10.244.1.23 node1 none none六 job 控制器6.1 job控制器功能Job主要用于负责批量处理(一次要处理指定数量任务)短暂的一次性(每个任务仅运行一次就结束)任务Job特点如下当Job创建的pod执行成功结束时Job将记录成功结束的pod数量当成功结束的pod达到指定的数量时Job将完成执行6.2 job 控制器示例[rootmaster controler]# kubectl create job web4 --image perl-5.34.0 --dry-runclient -o yaml job.yml [rootmaster controler]# vim job.yml apiVersion: batch/v1 kind: Job metadata: name: web4 spec: completions: 6 parallelism: 2 backoffLimit: 4 template: spec: containers: - image: busybox name: web4 command: [/bin/sh,-c] args: - | echo this is web4 message sleep 10 restartPolicy: Never [rootmaster controler]# kubectl apply -f job.yml job.batch/web4 created [rootmaster controler]# kubectl logs pods/web4-x52gr this is web4 message关于重启策略设置的说明如果指定为OnFailure则job会在pod出现故障时重启容器而不是创建podfailed次数不变如果指定为Never则job会在pod出现故障时创建新的pod并且故障pod不会消失也不会重启failed次数加1如果指定为Always的话就意味着一直重启2七 cronjob 控制器7.1 cronjob 控制器功能Cron Job 创建基于时间调度的 Jobs。CronJob控制器以Job控制器资源为其管控对象并借助它管理pod资源对象CronJob可以以类似于Linux操作系统的周期性任务作业计划的方式控制其运行时间点及重复运行的 方式。CronJob可以在特定的时间点(反复的)去运行job任务。7.2 cronjob 控制器 示例[rootmaster controler]# kubectl create cronjob web5 --image busybox --schedule * * * * * --dry-runclient -o yaml creonjob.yml [rootmaster controler]# vim creonjob.yml [rootmaster controler]# kubectl apply -f creonjob.yml cronjob.batch/web5 created [rootmaster controler]# kubectl get cronjobs.batch NAME SCHEDULE TIMEZONE SUSPEND ACTIVE LAST SCHEDULE AGE web5 * * * * * none False 0 8s 11s [rootmaster controler]# kubectl get pods NAME READY STATUS RESTARTS AGE web5-29795824-fdbqm 0/1 Completed 0 2m45s web5-29795825-86x6t 0/1 Completed 0 105s web5-29795826-h6r4k 0/1 Completed 0 45s [rootmaster controler]# kubectl logs web5-29795826-h6r4k hello xiaolin #可以看到当pod运行完成之后访问pod日志看到有运行结束时的写入结果
返回列表