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:

 

 

posted @   —八戒—  阅读(326)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示