文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

K8S中五种控制器使用方法是什么

2023-06-22 06:36

关注

这篇文章主要介绍“K8S中五种控制器使用方法是什么”,在日常操作中,相信很多人在K8S中五种控制器使用方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”K8S中五种控制器使用方法是什么”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

k8s的控制器类型

Kubernetes中内建了很多controller(控制器),这些相当于一个状态机,用来控制Pod的具体状态和行为

Deployment:适合无状态的服务部署

StatefullSet:适合有状态的服务部署

DaemonSet:一次部署,所有的node节点都会部署,例如一些典型的应用场景:

运行集群存储 daemon,例如在每个Node上运行 glusterd、ceph

在每个Node上运行日志收集 daemon,例如 fluentd、 logstash

在每个Node上运行监控 daemon,例如 Prometheus Node Exporter

Job:一次性的执行任务

Cronjob:周期性的执行任务

总体来说,K8S有五种控制器,分别对应处理无状态应用、有状态应用、守护型应用和批处理应用

pod与控制器之间的关系

controllers:在集群上管理和运行容器的对象通过label-selector相关联

Pod通过控制器实现应用的运维,如伸缩,升级等

K8S中五种控制器使用方法是什么

Deployment(无状态化应用)

应用场景:web服务

Deployment中文意思为部署、调度,通过Deployment我们能操作RS(ReplicaSet),你可以简单的理解为它是一种通过yml文件的声明,在Deployment 文件里可以定义Pod数量、更新方式、使用的镜像,资源限制等。无状态应用都用Deployment来创建

通过Deployment对象,你可以轻松的做到以下事情:

Deployment创建[root@master shuai]# vim nginx-delpoy.yamlapiVersion: apps/v1kind: Deployment   '定义是Deployment'metadata:  name: nginx-deployment  labels:    app: nginxspec:  replicas: 3  '副本数量为3'  selector:    matchLabels:      app: nginx  template:    metadata:      labels:        app: nginx    spec:      containers:      - name: nginx        image: nginx:1.15.4        ports:        - containerPort: 80'创建资源'[root@master shuai]# kubectl apply -f nginx-delpoy.yaml deployment.apps/nginx-deployment created//Replicaset 是控制版本,副本数,回滚就是通过此来实现'//查看所有资源'[root@master shuai]# kubectl get allNAME                                  READY   STATUS    RESTARTS   AGEpod/nginx-deployment-d55b94fd-cndf2   1/1     Running   0          3m31spod/nginx-deployment-d55b94fd-ghlwk   1/1     Running   0          3m31spod/nginx-deployment-d55b94fd-tm4sw   1/1     Running   0          3m31spod/pod-example                       1/1     Running   0          10hNAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGEservice/kubernetes   ClusterIP   10.0.0.1     <none>        443/TCP   3d6hNAME                               DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGEdeployment.apps/nginx-deployment   3         3         3            3           3m31sNAME                                        DESIRED   CURRENT   READY   AGEreplicaset.apps/nginx-deployment-d55b94fd   3         3         3       3m31s查看控制器信息kubectl deit deployment/nginx-deployment.....省略信息.....strategy:    rollingUpdate:         '版本更新为滚动更新机制'      maxSurge: 25%        '最大更新副本数是25%,最多扩容125%' '为了保持副本数量,增加的百分比同时要销毁多少'      maxUnavailable: 25%  '最大删除副本是25%,最多缩容到75%'    type: RollingUpdate...省略信息....'执行kubectl describe deploy nginx-deployment 也可以查看'....省略信息....RollingUpdateStrategy:  25% max unavailable, 25% max surge查看历史版本[root@master shuai]# kubectl rollout history deploy/nginx-deploymentdeployment.extensions/nginx-deployment REVISION  CHANGE-CAUSE1         <none>   '//这边只有一个,证明还没有滚动更新'

状态与无状态化对特点

无状态服务的特点:

1)deployment 认为所有的pod都是一样的

2)不用考虑顺序的要求

3)不用考虑在哪个node节点上运行

4)可以随意扩容和缩容

有状态服务的特点:

1)实例之间有差别,每个实例都有自己的独特性,元数据不同,例如etcd,zookeeper

2)实例之间不对等的关系,以及依靠外部存储的应用。

Deployment的更新

如果想要让 nginx pod 使用 nginx:1.9.1 的镜像来代替原来的 nginx的镜像,运行以下命令[root@master ~]# kubectl set image deployment/nginx-deployment nginx=nginx:1.9.1deployment.apps/nginx-deployment image updated或者我们可以使用 edit 命令来编辑 Deployment,将image从nginx改写成 nginx:1.9.1kubectl edit deployment/nginx-deployment查看更新进度[root@master ~]# kubectl rollout status deployment/nginx-deploymentWaiting for deployment "nginx-deployment" rollout to finish: 1 old replicas are pending termination...Waiting for deployment "nginx-deployment" rollout to finish: 1 old replicas are pending termination...deployment "nginx-deployment" successfully rolled out

Deployment更新时会创建一个新的ReplicaSet,然后将新的ReplicaSet中的Pod慢慢扩容到指定的副本数,将旧的ReplicaSet慢慢缩容到0。因此,更新时总能够确保旧的服务不会停止,这就是滚动更新。

Deployment的回滚

当我们像上文一样更新了Deployment之后,我们发现nginx:1.9.1的镜像不是很稳定,因此想要修改回nginx:1.7.9的版本,此时我们不需要手动更改Deployment文件,而是利用Deployment的回滚功能。

使用rollout history命令查看Deployment的版本(revision):

[root@master ~]# kubectl rollout history deployment/nginx-deploymentdeployment.apps/nginx-deployment REVISION  CHANGE-CAUSE1         kubectl create --filename=deploy.yml --record=true2         kubectl create --filename=deploy.yml --record=true

因为我们创建 Deployment 的时候使用了 —recored 参数可以记录命令,我们可以很方便的查看每次 revison 的变化。

查看单个 revision 的详细信息:[root@master ~]# kubectl rollout history deployment/nginx-deployment --revision=2deployment.apps/nginx-deployment with revision #2Pod Template:  Labels:       app=nginx        pod-template-hash=658d7f4b4b  Annotations:  kubernetes.io/change-cause: kubectl create --filename=deploy.yml --record=true  Containers:   nginx:    Image:      nginx:1.9.1    Port:       80/TCP    Host Port:  0/TCP    Environment:        <none>    Mounts:     <none>  Volumes:      <none>可以使用rollout undo命令回滚到前一个revision[root@master ~]# kubectl rollout undo deployment/nginx-deploymentdeployment.apps/nginx-deployment rolled back[root@master ~]# kubectl describe deployment/nginx-deploymentName:                   nginx-deploymentNamespace:              defaultCreationTimestamp:      Fri, 24 Dec 2021 22:24:10 +0800Labels:                 <none>Annotations:            deployment.kubernetes.io/revision: 3                        kubernetes.io/change-cause: kubectl create --filename=deploy.yml --record=trueSelector:               app=nginxReplicas:               3 desired | 3 updated | 3 total | 3 available | 0 unavailableStrategyType:           RollingUpdateMinReadySeconds:        0RollingUpdateStrategy:  25% max unavailable, 25% max surgePod Template:  Labels:  app=nginx  Containers:   nginx:    Image:        nginx    Port:         80/TCP    Host Port:    0/TCP    Environment:  <none>    Mounts:       <none>  Volumes:        <none>也可以使用–to-revision参数指定某个历史版本:[root@master ~]#  kubectl rollout undo deployment/nginx-deployment --to-revision=2deployment.apps/nginx-deployment rolled back[root@master ~]# kubectl describe deployment/nginx-deploymentName:                   nginx-deploymentNamespace:              defaultCreationTimestamp:      Fri, 24 Dec 2021 22:24:10 +0800Labels:                 <none>Annotations:            deployment.kubernetes.io/revision: 4                        kubernetes.io/change-cause: kubectl create --filename=deploy.yml --record=trueSelector:               app=nginxReplicas:               3 desired | 3 updated | 4 total | 3 available | 1 unavailableStrategyType:           RollingUpdateMinReadySeconds:        0RollingUpdateStrategy:  25% max unavailable, 25% max surgePod Template:  Labels:  app=nginx  Containers:   nginx:    Image:        nginx:1.9.1    Port:         80/TCP    Host Port:    0/TCP    Environment:  <none>    Mounts:       <none>  Volumes:        <none>

你可以通过设置 .spec.revisonHistoryLimit 项来指定 deployment 最多保留多少 revison 历史记录。默认的会保留所有的 revision;如果将该项设置为 0,Deployment 就不允许回退了。

只有 Deployment 的 rollout 被触发才会创建一个 revision!注意!当且仅当 Deployment 的 Pod template被更改,例如更新 template 中的 label 和容器镜像时,才会触发一个rollout,从而为Deployment创建出一个新的 revision。

rollout命令的更多用法:

Job Controller负责根据Job Spec创建Pod,并持续监控Pod的状态,直至其成功结束。如果失败,则根据restartPolicy(只支持OnFailure和Never,不支持Always)决定是否创建新的Pod再次重试任务。

K8S中五种控制器使用方法是什么

Job负责批量处理短暂的一次性任务 (short lived one-off tasks),即仅执行一次的任务,它保证批处理任务的一个或多个Pod成功结束。

Kubernetes支持以下几种Job:

JOB类型使用实例行为completionsparallelism
一次性Job数据库迁移创建一个Pod直至其成功结束11
固定结束次数的Job处理工作队列的Pod依次创建一个Pod运行直至completions个成功结束2+1
固定结束次数的并行Job多个Pod同时处理工作队列依次创建多个Pod运行直至completions个成功结束2+2+
并行Job多个Pod同时处理工作队列创建一个或多个Pod直至有一个成功结束12+
.job的使用[root@master ~]# vi job.yml ---apiVersion: batch/v1kind: Jobmetadata:  name: myjobspec:  template:    spec:      containers:      - name: myjob        image: busybox        command: ["echo",  "hello k8s job"]      restartPolicy: Never[root@master ~]# kubectl apply -f job.yml job.batch/myjob created[root@master ~]# kubectl get podsNAME          READY   STATUS      RESTARTS   AGEmyjob-gq27p   0/1     Completed   0          37s#查看这个 pod的任务[root@master ~]# kubectl get jobNAME    COMPLETIONS   DURATION   AGEmyjob   1/1           19s        5m11s#查看这个 pod的日志[root@master ~]# kubectl logs myjob-gq27phello k8s job

CronJob控制器

CronJob 可以用来执行基于时间计划的定时任务,类似于Linux/Unix系统中的 crontable (opens new window)。

CronJob 执行周期性的重复任务时非常有用,例如备份数据、发送邮件等。CronJob 也可以用来指定将来某个时间点执行单个任务,例如将某项任务定时到系统负载比较低的时候执行。

一个 CronJob 对象就像 crontab (cron table) 文件中的一行。 它用Cron格式进行编写, 并周期性地在给定的调度时间执行 Job。

注意:

下面的 CronJob 示例清单会在每分钟打印出当前时间和问候消息:

[root@master kubenetres]# vi cronjob.yml---apiVersion: batch/v1beta1kind: CronJobmetadata:  name: hellospec:  schedule: "*/1 * * * *"  jobTemplate:    spec:      template:        spec:          containers:          - name: hello            image: busybox            imagePullPolicy: IfNotPresent            command:            - /bin/sh            - -c            - date; echo Hello nihao          restartPolicy: OnFailure创建pod查看[root@master ~]# kubectl apply -f cronjob.yml Warning: batch/v1beta1 CronJob is deprecated in v1.21+, unavailable in v1.25+; use batch/v1 CronJobcronjob.batch/hello created#等一分钟查看[root@master ~]# kubectl get podsNAME                   READY   STATUS      RESTARTS   AGEhello-27339330-kkfxv   0/1     Completed   0          2s#查看日志[root@master ~]# kubectl logs hello-27339330-kkfxvFri Dec 24 15:30:00 UTC 2021Hello nihao

到此,关于“K8S中五种控制器使用方法是什么”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯