返回顶部
首页 > 资讯 > 精选 >k8s更高级的对象Deployment怎么创建
  • 625
分享到

k8s更高级的对象Deployment怎么创建

2023-07-05 22:07:04 625人浏览 八月长安
摘要

这篇文章主要介绍“k8s更高级的对象Deployment怎么创建”,在日常操作中,相信很多人在k8s更高级的对象Deployment怎么创建问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”k8s更高级的对象De

这篇文章主要介绍“k8s更高级的对象Deployment怎么创建”,在日常操作中,相信很多人在k8s更高级的对象Deployment怎么创建问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”k8s更高级的对象Deployment怎么创建”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

Deployment & RC 对比

没有对比就没有伤害,我们来看下它们之间有什么异同吧。首先 RCKubernetes 的一个核心概念,当我们把应用部署到集群之后,需要保证应用能够持续稳定的运行,RC 就是这个保证的关键,其主要功能如下:

  • 维持 Pod 的数量:它会确保 kubernetes 中有指定数量的 Pod 在运行,如果少于指定数量的 Pod,RC 就会创建新的,反之这会删除多余的,保证 Pod 的副本数量不变。

  • 保证 Pod 健康:当 Pod 运行出错了,无法提供正常服务时,RC 会杀死不健康的 Pod,然后重新创建新的。

  • 可以弹性伸缩:在业务高峰或者低峰的时候,可以用过 RC 来动态的调整 Pod 数量来提供资源的利用率,当然我们也提到过如果使用 HPA 这种资源对象的话可以做到自动伸缩。

  • 滚动升级:滚动升级是一种平滑的升级方式,通过逐步替换的策略,保证整体系统的稳定性,这个前面我们也已经讲过了。

Deployment 同样也是 Kubernetes 系统的一个核心概念,主要职责和 RC 一样,都是确保 Pod 的数量和健康,二者大部分功能都是完全一致的,我们可以看成是一个升级版的 RC 控制器,那 Deployment 除了和 RC 一样的功能外,又具备有哪些其它新特性呢?

  • 事件和状态查看:可以查看 Deployment 的升级详细进度和状态

  • 回滚操作:当升级 Pod 的时候如果出现问题,可以使用回滚操作回滚到之前的任一版本

  • 版本记录:每一次对 Deployment 的操作,都能够保存下来,这也是保证可以回滚到任一版本的基础

作为对比,我们知道 Deployment 作为新一代的 RC,不仅在功能上更为丰富了,同时我们也说过现在官方也都是推荐使用 Deployment 来管理 Pod 的,比如一些官方组件 kube-dns、kube-proxy 也都是使用的 Deployment 来管理的,所以当大家在使用的使用也最好使用 Deployment 来管理 Pod

Deployment 创建

其实一个 Deployment 资源控制器拥有多个 Replica Set,而一个 Replica Set 拥有一个或多个 Pod。一个 Deployment 可以控制多个 rs 主要是为了支持回滚机制。每当 Deployment 操作时,Kubernetes 会重新生成一个 Replica Set 并保留,以后有需要的话就可以回滚至之前的状态。

下面创建一个 Deployment,它创建了一个 Replica Set 来启动 3 个 Nginx pod,yaml 文件如下:

apiVersion: apps/v1kind: Deploymentmetadata:  name: nginx-deploy  labels:    k8s-app: nginx-demospec:  replicas: 3  selector:    matchLabels:      app: nginx  template:    metadata:      labels:        app: nginx    spec:      containers:      - name: nginx        image: nginx:1.7.8        ports:        - containerPort: 80

将上面内容保存为: nginx-deployment.yaml,执行命令:

$ kubectl create -f nginx-deployment.yamldeployment "nginx-deploy" created

然后执行一下命令查看刚刚创建的 Deployment:

$ kubectl get deploymentsNAME           DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGEnginx-deploy   3         0         0            0           1s

隔一会再次执行上面命令:

$ kubectl get deploymentsNAME           DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGEnginx-deploy   3         3         3            3           4m

我们可以看到 Deployment 已经创建了 1 个 Replica Set 了,执行下面的命令查看 rs 和 pod:

$ kubectl get rsNAME                     DESIRED   CURRENT   READY     AGEnginx-deploy-431080110   3         3         3         6m
$ kubectl get pod --show-labelsNAME                           READY     STATUS    RESTARTS   AGE       LABELSnginx-deploy-431080110-53z8q   1/1       Running   0          7m        app=nginx,pod-template-hash=431080110nginx-deploy-431080110-bhhq0   1/1       Running   0          7m        app=nginx,pod-template-hash=431080110nginx-deploy-431080110-sr44p   1/1       Running   0          7m        app=nginx,pod-template-hash=431080110

上面的 Deployment 的 yaml 文件中的 replicas:3 将会保证我们始终有 3 个 POD 在运行。

由于 Deployment 和 RC 的功能大部分都一样的,我们上节课已经和大家演示了大部分功能了,我们这里重点给大家演示下 Deployment 的滚动升级和回滚功能。

Deployment 滚动升级

现在我们将刚刚保存的 yaml 文件中的 nginx 镜像修改为 nginx:1.12.1,然后在 spec 下面添加滚动升级策略:

minReadySeconds: 5strategy:  # indicate which strategy we want for rolling update  type: RollingUpdate  rollingUpdate:    maxSurge: 1    maxUnavailable: 1
  • minReadySeconds:

    • Kubernetes 在等待设置的时间后才进行升级

    • 如果没有设置该值,Kubernetes 会假设该容器启动起来后就提供服务了

    • 如果没有设置该值,在某些极端情况下可能会造成服务不正常运行

  • maxSurge:

    • 升级过程中最多可以比原先设置多出的 POD 数量

    • 例如:maxSurage=1,replicas=5,则表示 Kubernetes 会先启动 1 一个新的 Pod 后才删掉一个旧的 POD,整个升级过程中最多会有 5+1 个 POD。

  • maxUnavaible:

    • 升级过程中最多有多少个 POD 处于无法提供服务的状态

    • 当 maxSurge 不为 0 时,该值也不能为 0

    • 例如:maxUnavaible=1,则表示 Kubernetes 整个升级过程中最多会有 1 个 POD 处于无法服务的状态。

然后执行命令:

$ kubectl apply -f nginx-deployment.yamldeployment "nginx-deploy" configured

然后我们可以使用 rollout 命令查看状态:

$ kubectl rollout status deployment/nginx-deployWaiting for rollout to finish: 1 out of 3 new replicas have been updated..deployment "nginx-deploy" successfully rolled out

升级结束后,继续查看 rs 的状态:

$ kubectl get rsNAME                      DESIRED   CURRENT   READY     AGEnginx-deploy-2078889897   0         0         0         47mnginx-deploy-3297445372   3         3         3         42mnginx-deploy-431080110    0         0         0         1h

根据 AGE 我们可以看到离我们最近的当前状态是:3,和我们的 yaml 文件是一致的,证明升级成功了。用 describe 命令可以查看升级的全部信息:

Name:     nginx-deployNamespace:    defaultCreationTimestamp:  Wed, 18 Oct 2017 16:58:52 +0800Labels:     k8s-app=nginx-demoAnnotations:    deployment.kubernetes.io/revision=3      kubectl.kubernetes.io/last-applied-configuration={"apiVersion":"apps/v1","kind":"Deployment","metadata":{"annotations":{},"labels":{"k8s-app":"nginx-demo"},"name":"nginx-deploy","namespace":"defa...Selector:   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:1.12.1    Port:   80/tcp    Environment:  <none>    Mounts:   <none>  Volumes:    <none>Conditions:  Type    Status  Reason  ----    ------  ------  Progressing   True  NewReplicaSetAvailable  Available   True  MinimumReplicasAvailableOldReplicaSets: <none>NewReplicaSet:  nginx-deploy-3297445372 (3/3 replicas created)...

Deployment 回滚

我们已经能够滚动平滑的升级我们的 Deployment 了,但是如果升级后的 POD 出了问题该怎么办?我们能够想到的最好最快的方式当然是回退到上一次能够提供正常工作的版本,Deployment 就为我们提供了回滚机制。

首先,查看 Deployment 的升级历史:

$ kubectl rollout history deployment nginx-deploydeployments "nginx-deploy"REVISION  CHANGE-CAUSE1   <none>2   <none>3   kubectl apply --filename=Desktop/nginx-deployment.yaml --record=true

从上面的结果可以看出在执行 Deployment 升级的时候最好带上 record 参数,便于我们查看历史版本信息。

默认情况下,所有通过 kubectl xxxx --record 都会被 kubernetes 记录到 etcd 进行持久化,这无疑会占用资源,最重要的是,时间久了,当你 kubectl get rs 时,会有成百上千的垃圾 RS 返回给你,那时你可能就眼花缭乱了。

如果是在生产,我们最好通过设置 Deployment 的.spec.revisionHistoryLimit 来限制最大保留的 revision number,比如 10 个版本,回滚的时候一般只会回滚到最近的几个版本就足够了。其实 rollout history 中记录的 revision 都和 ReplicaSets 一一对应。如果手动 delete 某个 ReplicaSet,对应的 rollout history 就会被删除,也就是还说你无法回滚到这个 revison 了。

同样我们可以使用下面的命令查看单个 revison 的信息:

$ kubectl rollout history deployment nginx-deploy --revision=3Deployments "nginx-deploy" with revision #3Pod Template:  Labels: app=nginx  pod-template-hash=3297445372  Annotations:  kubernetes.io/change-cause=kubectl apply --filename=nginx-deployment.yaml --record=true  Containers:   nginx:    Image:  nginx:1.12.1    Port: 80/TCP    Environment:  <none>    Mounts: <none>  Volumes:  <none>

假如现在要直接回退到当前版本的前一个版本:

$ kubectl rollout undo deployment nginx-deploydeployment "nginx-deploy" rolled back

当然也可以用 revision 回退到指定的版本:

$ kubectl rollout undo deployment nginx-deploy --to-revision=2deployment "nginx-deploy" rolled back

Deployment 扩容

也可以使用以下命令扩容 Deployment:

$ kubectl scale deployment nginx-deploy --replicas 10deployment "nginx-deployment" scaled

到此,关于“k8s更高级的对象Deployment怎么创建”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: k8s更高级的对象Deployment怎么创建

本文链接: https://lsjlt.com/news/355742.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • k8s更高级的对象Deployment怎么创建
    这篇文章主要介绍“k8s更高级的对象Deployment怎么创建”,在日常操作中,相信很多人在k8s更高级的对象Deployment怎么创建问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”k8s更高级的对象De...
    99+
    2023-07-05
  • 带你学会k8s 更高级的对象Deployment
    目录Deployment 引入Deployment & RC 对比Deployment 创建Deployment 滚动升级Deployment 回滚Deployment 扩容...
    99+
    2023-05-14
    k8s 对象Deployment k8s Deployment
  • JavaScript中怎么创建一个高级对象
    这篇文章给大家介绍JavaScript中怎么创建一个高级对象,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。JavaScript创建高级对象1)使用构造函数创建对象的实例在JAVASCR...
    99+
    2024-04-02
  • XMLHttpRequest对象怎么创建
    这篇文章主要介绍了XMLHttpRequest对象怎么创建的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇XMLHttpRequest对象怎么创建文章都会有所收获,下面我们一起来...
    99+
    2024-04-02
  • XMLHTTP对象怎么创建
    这篇文章主要介绍了XMLHTTP对象怎么创建的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇XMLHTTP对象怎么创建文章都会有所收获,下面我们一起来看看吧。MSXML中提供了M...
    99+
    2024-04-02
  • 怎么创建Java对象
    这篇文章主要介绍“怎么创建Java对象”,在日常操作中,相信很多人在怎么创建Java对象问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么创建Java对象”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!一、...
    99+
    2023-06-16
  • JS怎么创建对象
    本篇内容主要讲解“JS怎么创建对象”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JS怎么创建对象”吧!一、new Object(); var x="age"...
    99+
    2023-06-27
  • java怎么创建对象
    在Java中,可以使用关键字new来创建一个对象。创建对象的一般语法是: <类名> <变量名> = new ...
    99+
    2024-02-29
    java
  • ADO.NET的DataTable对象怎么创建
    本篇内容主要讲解“ADO.NET的DataTable对象怎么创建”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“ADO.NET的DataTable对象怎么创建”吧!ADO.NET可以在与数据库断开...
    99+
    2023-06-17
  • JavaScript中怎么创建对象
    小编给大家分享一下JavaScript中怎么创建对象,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!ECMA-262把对象定义为:...
    99+
    2024-04-02
  • ADO.NET Connection对象怎么创建
    本篇内容介绍了“ADO.NET Connection对象怎么创建”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在默认情况下,vc++不支持a...
    99+
    2023-06-17
  • ADO.NET SqlDataAdapter对象怎么创建
    这篇文章主要介绍“ADO.NET SqlDataAdapter对象怎么创建”,在日常操作中,相信很多人在ADO.NET SqlDataAdapter对象怎么创建问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”A...
    99+
    2023-06-17
  • ADO.NET DataTable对象怎么创建
    本篇内容介绍了“ADO.NET DataTable对象怎么创建”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! ADO.NET可以在...
    99+
    2023-06-17
  • java中怎么创建对象
    这篇文章主要介绍了java中怎么创建对象的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇java中怎么创建对象文章都会有所收获,下面我们一起来看看吧。1、检查类是否加载。当虚拟机遇到new指令时,首先检查该指令的...
    99+
    2023-06-30
  • JavaScript怎么创建类和对象
    这篇文章主要介绍了JavaScript怎么创建类和对象的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇JavaScript怎么创建类和对象文章都会有所收获,下面我们一起来看看吧。...
    99+
    2024-04-02
  • C#中怎么创建String对象
    本文小编为大家详细介绍“C#中怎么创建String对象”,内容详细,步骤清晰,细节处理妥当,希望这篇“C#中怎么创建String对象”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。创建 String 对象您可以使用...
    99+
    2023-06-17
  • js怎么创建数组对象
    本篇内容主要讲解“js怎么创建数组对象”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“js怎么创建数组对象”吧!说明返回新创建并初始化的数组。如果调用构造函数数组()时没有参数,则返回的数组为空,...
    99+
    2023-06-20
  • Spring复杂对象怎么创建
    本文小编为大家详细介绍“Spring复杂对象怎么创建”,内容详细,步骤清晰,细节处理妥当,希望这篇“Spring复杂对象怎么创建”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。什么是复杂类型,比如连接数据库的Con...
    99+
    2023-06-26
  • 怎么创建Java线程对象
    本篇内容介绍了“怎么创建Java线程对象”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!默认情况下,主线程和垃圾回收线程都是由系统创建的,但是...
    99+
    2023-06-02
  • javascript中怎么通过面向对象创建对象
    本篇文章为大家展示了javascript中怎么通过面向对象创建对象,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。方式一:通过内置Object对象的方式创建 然后通过...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作