Kubernetes教程-资源控制器&ReplicaSet&Deployment&DaemonSet&Job/CronJob
第八章 资源控制器
一、什么是控制器
Kubernetes 中内建了很多 controller(控制器),这些相当于一个状态机,用来控制 Pod 的具体状态和行为
二、控制器类型
① ReplicationController 和 ReplicaSet
② Deployment
③ DaemonSet
④ StateFulSet
⑤ Job/CronJob
⑥ Horizontal Pod Autoscaling
1、ReplicationController 和 ReplicaSet
ReplicationController(RC)用来确保容器应用的副本数始终保持在用户定义的副本数,即如果有容器异常退出,会自动创建新的 Pod 来替代;而如果异常多出来的容器也会自动回收;
在新版本的 Kubernetes 中建议使用 ReplicaSet 来取代 ReplicationController 。ReplicaSet 跟ReplicationController 没有本质的不同,只是名字不一样,并且 ReplicaSet 支持集合式的 selector(标签 );
2、Deployment(扩展ReplicaSet,或者继承ReplicaSet)
Deployment 为 Pod 和 ReplicaSet 提供了一个声明式定义 (declarative) 方法,用来替代以前的ReplicationController 来方便的管理应用。典型的应用场景包括;
① 定义 Deployment 来创建 Pod 和 ReplicaSet
② 滚动升级和回滚应用
③ 扩容和缩容
④ 暂停和继续 Deployment
滚动更新:会创建一个新副本的rs1,旧的rs的pod减少一个时,rs1会新加一个,直到全部增减完成
回滚:同理,需要恢复旧的rs时,会启动rs,再进行增减操作
3、DaemonSet
DaemonSet确保全部(或者一些)Node 上运行一个 Pod 的副本。当有 Node 加入集群时,也会为他们新增一个Pod 。当有 Node 从集群移除时,这些 Pod 也会被回收。删除 DaemonSet 将会删除它创建的所有 Pod
使用 DaemonSet 的一些典型用法:
① 运行集群存储 daemon,例如在每个 Node 上运行glusterd、ceph
② 在每个 Node 上运行日志收集 daemon,例如fluentd、logstash
③ 在每个 Node 上运行监控 daemon,例如Prometheus Node Exporter、collectd、Datadog 代理、New Relic 代理,或 Ganglia gmond
4、Job
Job 负责批处理任务,即仅执行一次的任务,它保证批处理任务的一个或多个 Pod 成功结束
4、CronJob
管理基于时间的 Job,即:
- 在给定时间点只运行一次
- 周期性地在给定时间点运行
使用前提条件:**当前使用的 Kubernetes 集群,版本 >= 1.8(对 CronJob)。对于先前版本的集群,版本 <1.8,启动 API Server时,通过传递选项--runtime-config=batch/v2alpha1=true可以开启 batch/v2alpha1API**
典型的用法如下所示:
- 在给定的时间点调度 Job 运行
- 创建周期性运行的 Job,例如:数据库备份、发送邮件
5、StatefulSet
StatefulSet 作为 Controller 为 Pod 提供唯一的标识。它可以保证部署和 scale 的顺序
StatefulSet是为了解决有状态服务的问题(对应Deployments和ReplicaSets是为无状态服务而设计),其应用场景包括:
① 稳定的持久化存储,即Pod重新调度后还是能访问到相同的持久化数据,基于PVC来实现
② 稳定的网络标志,即Pod重新调度后其PodName和HostName不变,基于Headless Service(即没有Cluster IP的Service)来实现
③ 有序部署,有序扩展,即Pod是有顺序的,在部署或者扩展的时候要依据定义的顺序依次依次进行(即从0到N-1,在下一个Pod运行之前所有之前的Pod必须都是Running和Ready状态),基于init containers来实现
④ 有序收缩,有序删除(即从N-1到0)
6、Horizontal Pod Autoscaling(HPA )
应用的资源使用率通常都有高峰和低谷的时候,如何削峰填谷,提高集群的整体资源利用率,让service中的Pod个数自动调整呢?这就有赖于Horizontal Pod Autoscaling了,顾名思义,使Pod水平自动缩放
二、控制器实例
1、RS 与 RC 与 Deployment 关联RC (ReplicationController )
主要的作用就是用来确保容器应用的副本数始终保持在用户定义的副本数。即如果有容器异常退出,会自动创建新的Pod来替代;而如果异常多出来的容器也会自动回收
Kubernetes 官方建议使用 RS(ReplicaSet )替代 RC (ReplicationController )进行部署,RS 跟 RC 没有本质的不同,只是名字不一样,并且 RS 支持集合式的 selector
#kubectl explain rs #查看RS完整模板信息:
RS创建模板
vim rs.yaml apiVersion: extensions/v1beta1 kind: ReplicaSet metadata: name: frontend spec: replicas: 3 #副本3 selector: matchLabels: #template.metadata.labels.tier和selector.matchLabels.tier一致,找下面pod模版里面的labels,用来将rs匹配对应的pod信息 tier: frontend template: #Pod模版,从这开始往下就是创建Pod的信息了 metadata: labels: #metadata.labels和matchLabels.tier一致,pod的labels tier: frontend spec: containers: - name: myapp image: hub.atguigu.com/library/nginx:latestenv: - name: GET_HOSTS_FROM value: dns ports: - containerPort: 80
#kubectl create -f rs.yaml
#kubectl get rs
资源控制器所创建的pod,删除后会被新建
kubectl get pod --show-labels 查看标签
修改某一个pod的label名称
kubectl label pod frontend1-bgnvd tier=frontend1 --overwrite=true #把tier=frontend的label值改成tier=frontend1
kubectl get pod --show-labels 查看标签
注意下图是有4个frontend1了。因为:matchLabels:frontend设置没有1
kubectl delete rs --all #删除全部的replicaset kubectl get pod --show-labels
发现label是frontend1的pod还在,因为matchLabels没有匹配到带有1的值。
kubectl delete pod --all #通过pod命令删除就没有frontend1的pod了
2、RS 与 Deployment 的关联(扩展ReplicaSet,或者继承ReplicaSet)
Deployment 为 Pod 和 ReplicaSet 提供了一个声明式定义(declarative)方法,用来替代以前的ReplicationController 来方便的管理应用。典型的应用场景包括:
① 定义Deployment来创建Pod和ReplicaSet
② 滚动升级和回滚
③ 应用扩容和缩容
④ 暂停和继续Deployment
#kubectl get deployment #得到所有的deployment #kubectl delete deployment/hello-world-deployment #kubectl delete deployment/hello-world-deployment-1 #kubectl delete deployment/nginx-deployment
#vim deployment.yaml apiVersion: extensions/v1beta1 kind: Deployment metadata: name: nginx-deployment spec: replicas: 3 #副本3 selector: matchLabels: #template.metadata.labels.app和selector.matchLabels.app一致,找下面pod模版里面labels信息,用来将deployment匹配对应的pod信息 app: nginx template: #pod模版,从这开始往下就是创建pod的信息了 metadata: labels: app: nginx spec: containers: - name: nginx image: hub.atguigu.com/library/nginx:latest ports: - containerPort: 80 #kubectl create或apply -f deployment.yaml --record #--record参数可以记录命令,方便查看每次revision的变化
#kubectl scale deployment nginx-deployment --replicas=10 #扩容 #kubeclt get pod #kubectl set image deployment/nginx-deployment nginx=nginx:1.9.1 #更改镜像nginx镜像名称,镜像更新会触发rs的更改 #kubectl get deployment #kubectl rollout undo deployment/nginx-deployment #回滚 #kubectl get deployment
autoscale自动扩容:
kubectl rollout undo deployment/nginx-deployment #回滚 kubectl rollout status deployment/nginx-deployment #回滚状态 kubectl rollout history deployment/nginx-deployment #回滚历史
kubectl rollout undo deployment/nginx-deployment --to-revision=2 #回滚到指定历史版本2 kubectl rollout pause deployment/nginx-deployment #暂停 deployment 的更新
echo $? #查看返回值
目前是三个历史
#vim daemonset.yaml apiVersion: apps/v1 kind: DaemonSet metadata: name: deamonset-example #metadata.name和matchLabels.name一致 labels: app: daemonset spec: selector: matchLabels: name: deamonset-example #template.metadata.labels.name和selector.matchLabels.name一致,DaemonSet匹配下面的pod信息 template: #pod模版,从这开始往下就是创建Pod的信息了 metadata: labels: name: deamonset-example spec: containers: - name: deamonset-example image: hub.atguigu.com/library/nginx:latest #kubectl create -f daemonset.yaml
#kubectl get pod
注意,在每一个node节点的机器里创建一个daemonset的pod。主节点没有。
kubectl delete pod deamonset-example-8zrd9 #删掉一个
kubectl get pod -o wide #又会出现一个新的
kubectl delete daemonset --all #删除所有daemonset
#vim job.yaml apiVersion: batch/v1 kind: Job metadata: name: pi spec: template: #模版,从这开始往下就是之前创建的Pod的信息了 metadata: name: pi spec: containers: - name: pi image: perl command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"] #计算圆周率,小数点后面2000位 restartPolicy: Never #kubectl create -f job.yaml #kubectl get pod
#kubectl describe pod pi-qmfkq #查看详细信息
正在下载镜像
#kube get job #查看当前任务,完成状态:已完成
kubectl log pi-qmfkq #看日志
kubectl delete job --all #删除所有job
#vim cronjob.yaml apiVersion: batch/v1beta1 kind: CronJob metadata: name: hello spec: schedule: "*/1 * * * *" #定时任务,执行计划 jobTemplate: spec: template: #模版,从这开始往下就是之前创建的Pod的信息 spec: containers: - name: hello image: busybox args: - /bin/sh - -c - date; echo Hello from the Kubernetes cluster restartPolicy: OnFailure #kubectl create -f cronjob.yaml #kubectl get cronjob
#kubectl get pod #kubectl log hello-1591612320-8rzrx
#kubectl delete cronjob --all #删除cronjob
资源限制:
pod:
request:表示初始的时候设置的资源
limit:表示最大限制,不能在超过了
namespace:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现