4.Pod控制器
Controller-manager:
Kube-controller-manager
Cloud-controller-manager:在K8S上启用CloudProvider的时候才需要,用来配合云服务提供商的控制(NodeController,RouteController,ServiceController)
文档:《Kubernetes Deployment控制器:Pod扩容与滚动更新指南:https://zhuanlan.zhihu.com/p/647183229》
一、Pod控制器
ReplicationController:
ReplicaSet:是新一代的ReplicationController。帮助用户管理无状态的资源,并确保能够精确反映用户定义的目标数量。
核心组件:用户期望的副本数,标签选择器,pod资源模板
Deployment:建立在ReplicaSet之上。支持扩缩容,支持滚动更新,回滚等,提供声明式定义资源。是目前管理无状态应用的最好的控制器。
DaemonSet:用于确保集群的每一个节点只运行一个特定的Pod副本,或者仅在满足条件的节点上,运行一个Pod副本。通常用来实现系统级别的后台任务(以守护进程形式运行),托管到K8S上,。不用定义pod的期望数量,因为副本数量取决于集群规模。
Job:是否重建Pod取决于任务是否完成。只能执行一次性的任务。
CronJob:周期性运行任务。
StatefulSet:管理有状态应用。把需要手动做的运维操作步骤封装成脚本,放在pod模板中,让控制器按脚本去做。 --- 有状态应用托管到K8S很难,因为有状态应用,无法抽取共同特点,并定义出一种模式来,只能每一种应用都单独对待。
二、ReplicaSet
[kubelet@master yaml]$ cat rs-demo.yaml [kubelet@master ~]$ kubectl get pods --show-labels
[kubelet@master yaml]$ kubectl edit rs myapp ## 在线修改yaml,动态扩容缩容(更改replicas);动态更新(更改container的image版本),已存在的pod版本不会改变,只有重建的才会是新版本。
三、Deployment
一个deployment管理多个ReplicaSet。只有一个是处于活动状态。可以提供声明式更新创建。通常用apply,而不使用create。提供滚动式自定义自控制更新;可以实现控制更新逻辑和更新节奏,更新粒度。
Deployment控制器支持两种更新策略: 滚动更新(RollingUpdate)和删除式更新(Recreate)默认使用滚动更新策略。
滚动更新(Rolling Update),滚动更新是默认的更新策略,一次仅更新一批Pod,当更新的Pod就绪后再更新另一批,直到全部更新完成为止;该策略实现了不间断服务的目标,但是在更新过程中,不同客户端得到的响应内容可能会来自不同版本的应用,会出现新老版本共存状态。
删除式更新(Recreate),当更新策略设定为Recreate,在更新镜像时,它会先删除现在正在运行的Pod,等彻底杀死后,重新创建新的RS(ReplicaSet),然后启动对应的Pod,在整个更新过程中,会造成服务一段时间无法提供服务。也称之为单批次更新。
[kubelet@master yaml]$ kubectl explain deployment.spec.strategy # 更新策略
[kubelet@master yaml]$ kubectl explain deployment.spec.revisionHistoryLimit # 历史版本数
[kubelet@master yaml]$ vim deploy-demo.yaml # 直接修改yaml文件replicas
[kubelet@master yaml]$ kubectl apply -f deploy-demo.yaml # 再次apply,得到如下效果。
[kubelet@master yaml]$ kubectl rollout history deployment myapp-deploy # 查看滚动更新的历史 [kubelet@master yaml]$ kubectl patch deployment myapp-deploy -p '{"spec":{"replicas":5}}' # 打补丁 [kubelet@master yaml]$ kubectl patch deployment myapp-deploy -p '{"spec":{"strategy":{"rollingUpdate":{"maxSurge":1,"maxUnavailable":0}}}}' #修改更新策略 [kubelet@master yaml]$ kubectl set image deployment myapp-deploy myapp-container=ikubernetes/myapp:v3 && kubectl rollout pause deployment myapp-deploy #更新,然后暂停更新。金丝雀发布 [kubelet@master yaml]$ kubectl rollout resume deployment myapp-deploy # 恢复操作,继续进行更新。 [kubelet@master yaml]$ kubectl rollout status deployment myapp-deploy # 查看更新进度 [kubelet@master yaml]$ kubectl rollout undo deployment myapp-deploy --to-revision=1 #回滚到版本1(不指定默认回滚为上一版本)
查看使用的是v1版本:
[kubelet@master yaml]$ kubectl delete pod myapp-ds-ljlh5 --force --grace-period=0 #强制删除pod,当pod长时间处于Terminating状态时可使用。
四、DaemonSet
也支持滚动更新
kubelet@master yaml]$ kubectl expose deployment redis --port=6379 #暴露端口
[kubelet@master yaml]$ kubectl explain pods.spec.hostNetwork #共享宿主机的网络命名空间,daemonset可以使用,就不需要用service单独暴露端口
日志收集是节点级别的,需要收集所有Pod的日志。
五、Tips
TPR:Third Party Resources 第三方资源 1.2+ 1.7废弃了
CDR:Custom Defined Resources 1.8+ 用户自定义资源
Operator:
Helm:类似于Yum
[kubelet@master yaml]$ kubectl explain deploy # 文档是落后于k8s集群本身的,所以此命令获得的群组可能是不正确的。
[kubelet@master yaml]$ kubectl get pods -l app=myapp –w # 查看pod的动态变化
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」