您当前的位置:首页 > 电脑百科 > 程序开发 > 框架

深入kubernetes:K8s的Deployment控制器

时间:2020-08-21 10:38:10  来源:  作者:
深入kubernetes:K8s的Deployment控制器

 

推荐阅读:膜拜!阿里内部都在强推的K8S(kubernetes)学习指南,不能再详细了

Deployment可以做到很便捷的管理Pod,只需要在Deployment中描述一下希望的Pod状态是什么,包括定义Pod副本数、滚动升级和回滚应用、扩容和缩容、暂停和继续Deployment等,然后Deployment Controller就可以帮我们实现我们想要达到的状态。

我们从一个例子入手:

apiVersion: Apps/v1
kind: Deployment
metadata:
  name: Nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 2
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80

这个例子中:

  • 我们定义了一个Deployment,名字叫nginx-deployment;
  • 通过spec.replicas字段定义了Pod的副本数是2;
  • 通过spec.selector字段定义了被打上app: nginx的标签的Pod才会被管理;
  • tmplate字段定义了这个Deployment管理的Pod应该是怎样的,具有怎样的属性;

总的来说一个Deploymet控制器可以由两部分组成:

深入kubernetes:K8s的Deployment控制器

 

ReplicaSet

ReplicaSet是一个副本控制器,ReplicaSet可以用selector来控制Pod的数量,而Deployments是一个更高层次的概念,它管理ReplicaSets,并提供对pod的声明性更新以及许多其他的功能。

Deployment通过控制ReplicaSet的个数来和属性,进而实现“水平扩展 / 收缩”和“滚动更新”这两个编排动作。

水平扩展与滚动更新

我们可以通过下面这个命令来创建Deployment:

kubectl create -f nginx-deployment.yaml --record

这里–record 参数作用是记录下你每次操作所执行的命令,以方便后面查看。

检查一下Deployment状态:

kubectl get deployments

NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   2/2     2            2           33m
  • NAME:列举出Deployments 的名字;
  • READY:显示了多少个应用的副本是可用的,目前副本数/期望副本数;
  • UP-TO-DATE:显示了副本更新的次数,这里显示为2,说明已经做过2次更新;
  • AVAILABLE:显示了多少个应用的副本是可用的;
  • AGE:显示了应用运行的时间。

现在我们使用kubectl scale来做一个水平扩展:

kubectl scale deployment nginx-deployment --replicas=4

deployment.apps/nginx-deployment scaled

然后我们可以使用rollout status来查看滚动更新的状态:

kubectl rollout status deployment/nginx-deployment

Waiting for deployment "nginx-deployment" rollout to finish: 2 of 4 updated replicas are available...
Waiting for deployment "nginx-deployment" rollout to finish: 3 of 4 updated replicas are available...
deployment "nginx-deployment" successfully rolled out

上面的3 of 4 updated replicas are available表示已经有3个Pod进入了UP-TO-DATE 状态。

然后我们还可以查看一下ReplicaSet状态:

kubectl get rs

NAME                         DESIRED   CURRENT   READY   AGE
nginx-deployment-9754ccbdf   4         4         4       44m

在运行了一个Deployment修改后,Deployment Controller会创建一个副本为ReplicaSet,并会生成一串随机字符,ReplicaSet 会把这个随机字符串加在它所控制的所有 Pod 的标签里,从而保证这些 Pod 不会与集群里的其他 Pod 混淆。

我们可以通过 kubectl get pods –show-labels来查看:

NAME                               READY   STATUS    RESTARTS   AGE    LABELS
nginx-deployment-9754ccbdf-5pl2j   1/1     Running   0          5m4s   app=nginx,pod-template-hash=9754ccbdf
nginx-deployment-9754ccbdf-67d4g   1/1     Running   0          48m    app=nginx,pod-template-hash=9754ccbdf
nginx-deployment-9754ccbdf-9drgb   1/1     Running   0          48m    app=nginx,pod-template-hash=9754ccbdf
nginx-deployment-9754ccbdf-fdmrx   1/1     Running   0          5m4s   app=nginx,pod-template-hash=9754ccbdf

下面我们看看Deployment的滚动更新是如何做的:

我们使用set image 来修改deployment中的镜像

kubectl set image deployment/nginx-deployment nginx=nginx:1.16.1 --record

deployment.apps/nginx-deployment image updated

然后我们可以通过kubectl describe查看滚动更新的过程:

$ kubectl describe deployment nginx-deployment
...
Events:
  Type    Reason             Age   From                   Message
  ----    ------             ----  ----                   -------
...
 Normal  ScalingReplicaSet  29s                 deployment-controller  Scaled down replica set nginx-deployment-9754ccbdf to 3
  Normal  ScalingReplicaSet  29s                 deployment-controller  Scaled up replica set nginx-deployment-dc46b5ffc to 2
  Normal  ScalingReplicaSet  12s (x2 over 11m)   deployment-controller  Scaled down replica set nginx-deployment-9754ccbdf to 2
  Normal  ScalingReplicaSet  12s                 deployment-controller  Scaled up replica set nginx-deployment-dc46b5ffc to 3
  Normal  ScalingReplicaSet  11s                 deployment-controller  Scaled down replica set nginx-deployment-9754ccbdf to 1
  Normal  ScalingReplicaSet  11s                 deployment-controller  Scaled up replica set nginx-deployment-dc46b5ffc to 4
  Normal  ScalingReplicaSet  11s                 deployment-controller  Scaled down replica set nginx-deployment-9754ccbdf to 0

可以看到Deployment Controller控制ReplicaSet将旧的Pod 副本数一个个减少,并创建一个新的ReplicaSet:nginx-deployment-dc46b5ffc,并将其控制的Pod副本数一个个增加。

在这个“滚动更新”过程完成之后,你可以查看一下新、旧两个 ReplicaSet 的最终状态:

kubectl get rs

NAME                         DESIRED   CURRENT   READY   AGE
nginx-deployment-9754ccbdf   0         0         0       57m
nginx-deployment-dc46b5ffc   4         4         4       5m9s

默认的情况下,Deployment 会保至少有75%的Pod还是可用的,所以我们的例子中,会保证至少有3个Pod是出于可用的状态。

这个策略,是 Deployment 对象的一个字段,名叫 RollingUpdateStrategy,如下所示:

 kubectl describe deployment

Name:                   nginx-deployment
...
Selector:               app=nginx
Replicas:               4 desired | 4 updated | 4 total | 4 available | 0 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  25% max unavailable, 25% max surge
...

25% max unavailable表示最大25%不可用;25% max surge表示最多可以创建多少个新的Pod。

版本控制与回滚

在上面的操作中,我们将nginx的版本设置成了1.16.1,现在我们可以通过rollout undo来进行版本的回滚:

kubectl rollout undo deployment/nginx-deployment

deployment.apps/nginx-deployment rolled back

当然除了这个命令以外由于我们使用了–record,所以我们可以通过kubectl rollout history 来查看版本信息:

kubectl rollout history deployment/nginx-deployment

deployment.apps/nginx-deployment
REVISION  CHANGE-CAUSE
2         kubectl set image deployment/nginx-deployment nginx=nginx:1.16.1 --record=true
3         kubectl apply --filename=nginx-deployment.yaml --record=true

我们可以通过kubectl rollout history来看到相应版本的具体信息:

kubectl rollout history deployment/nginx-deployment --revision=2

通过kubectl rollout undo命令来回滚到相应的版本:

kubectl rollout undo deployment/nginx-deployment --to-revision=2

Pausing 和Resuming 一个Deployment

我们在上面的操作中,每进行一步操作都会进行一次滚动更新,如果我们想一次性执行多条命令然后再一次性滚动更新,那么可以先pause Deployment然后操作完之后再resume 它。

如下:

kubectl rollout pause deployment/nginx-deployment

deployment.apps/nginx-deployment paused

然后就可以随意的修改这个 Deployment 的内容了。由于此时 Deployment 正处于“暂停”状态,所以我们对 Deployment 的所有修改,都不会触发新的“滚动更新”,也不会创建新的 ReplicaSet。

操作完之后再执行:

kubectl rollout resume deployment/nginx-deployment

deployment.apps/nginx-deployment resumed

在 kubectl rollout pause 指令之后的这段时间里,我们对 Deployment 进行的所有修改,最后只会触发一次“滚动更新”。



Tags:K8s   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
背景:目前prometheus 给pod的内存告警阀值设置的85%,由于JVM 设置最高申请内存为pod limit 的75%,通过arthas-boot查看到堆内存和元空间占用内存之和跟prometheus告警值不同。...【详细内容】
2021-09-16  Tags: K8s  点击:(104)  评论:(0)  加入收藏
近期由于工作原因,在项目支持的过程中,进行了一次K8S的基础环境部署,云平台一直是公司的重要底座,而我由于一系列原因,一直没有亲自尝试,通过本次的机会,让我重新做了一遍,也找到了...【详细内容】
2021-09-09  Tags: K8s  点击:(90)  评论:(0)  加入收藏
概述谷歌云使用先进的 Andromeda 网络来实现 VPC 内实例之间的相互访问,以及 Google Kubernetes Engine (GKE) 的 Pod 的跨节点互访,避免了配置静态路由或者 Overlay 网络带来...【详细内容】
2021-08-20  Tags: K8s  点击:(103)  评论:(0)  加入收藏
1.创建yaml模板 kubectl create deployment web --image=nginx --dry-run -o yaml > web.yaml 2.修改模板 vim web.yamlapiVersion: apps/v1kind: Deploymentmetadata:label...【详细内容】
2021-07-20  Tags: K8s  点击:(160)  评论:(0)  加入收藏
Jenkins 是目前最常用的持续集成工具,拥有近50%的市场份额,他还是很多技术团队的第一个使用的自动化工具。由此可见他的重要性!这份Jenkins宝典从入门介绍到结合Docker+SpringC...【详细内容】
2021-06-09  Tags: K8s  点击:(145)  评论:(0)  加入收藏
kubeadm 是官方社区推出的一个用于快速部署 kubernetes 集群的工具。这个工具能通过两条指令完成一个 kubernetes 集群的部署:# 创建一个 Master 节点$ kubeadm init # 将一...【详细内容】
2021-04-29  Tags: K8s  点击:(276)  评论:(0)  加入收藏
K8S 网络设计与实现是在学习 K8S 网络过程中总结的内容。本文按照 K8S 网络设计原则、Pod 内部网络、Pod 之间网络等几个步骤讲解 K8S 复杂的网络架构。 图片出自:《你女儿也...【详细内容】
2021-04-01  Tags: K8s  点击:(266)  评论:(0)  加入收藏
记录在 ubuntu-20.04.2-live-server系统上通过rancher安装k8s的过程。0. 更换阿里云软件源为了保障下载速度,将ubuntu软件源替换为阿里云软件源。如果网络通畅,可跳过。0.1....【详细内容】
2021-03-26  Tags: K8s  点击:(324)  评论:(0)  加入收藏
1.创建一个简单的应用程序在安装好Docker后,现在让我们来创建一个简单的应用程序。我们先创建一个简单的Node.js Web应用,然后将它打包到镜像中。该应用可以接受HTTP请求并返...【详细内容】
2021-03-10  Tags: K8s  点击:(219)  评论:(0)  加入收藏
一、日志收集的需求背景:• 业务发展越来越庞大,服务器越来越多​ • 各种访问日志、应用日志、错误日志量越来越多​ • 开发人员排查问题,需要到服务器上查日志,...【详细内容】
2021-03-05  Tags: K8s  点击:(189)  评论:(0)  加入收藏
▌简易百科推荐
近日只是为了想尽办法为 Flask 实现 Swagger UI 文档功能,基本上要让 Flask 配合 Flasgger, 所以写了篇 Flask 应用集成 Swagger UI 。然而不断的 Google 过程中偶然间发现了...【详细内容】
2021-12-23  Python阿杰    Tags:FastAPI   点击:(6)  评论:(0)  加入收藏
文章目录1、Quartz1.1 引入依赖<dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.3.2</version></dependency>...【详细内容】
2021-12-22  java老人头    Tags:框架   点击:(11)  评论:(0)  加入收藏
今天来梳理下 Spring 的整体脉络啦,为后面的文章做个铺垫~后面几篇文章应该会讲讲这些内容啦 Spring AOP 插件 (了好久都忘了 ) 分享下 4ye 在项目中利用 AOP + MybatisPlus 对...【详细内容】
2021-12-07  Java4ye    Tags:Spring   点击:(14)  评论:(0)  加入收藏
&emsp;前面通过入门案例介绍,我们发现在SpringSecurity中如果我们没有使用自定义的登录界面,那么SpringSecurity会给我们提供一个系统登录界面。但真实项目中我们一般都会使用...【详细内容】
2021-12-06  波哥带你学Java    Tags:SpringSecurity   点击:(18)  评论:(0)  加入收藏
React 简介 React 基本使用<div id="test"></div><script type="text/javascript" src="../js/react.development.js"></script><script type="text/javascript" src="../js...【详细内容】
2021-11-30  清闲的帆船先生    Tags:框架   点击:(19)  评论:(0)  加入收藏
流水线(Pipeline)是把一个重复的过程分解为若干个子过程,使每个子过程与其他子过程并行进行的技术。本文主要介绍了诞生于云原生时代的流水线框架 Argo。 什么是流水线?在计算机...【详细内容】
2021-11-30  叼着猫的鱼    Tags:框架   点击:(21)  评论:(0)  加入收藏
TKinterThinter 是标准的python包,你可以在linx,macos,windows上使用它,你不需要安装它,因为它是python自带的扩展包。 它采用TCL的控制接口,你可以非常方便地写出图形界面,如...【详细内容】
2021-11-30    梦回故里归来  Tags:框架   点击:(26)  评论:(0)  加入收藏
前言项目中的配置文件会有密码的存在,例如数据库的密码、邮箱的密码、FTP的密码等。配置的密码以明文的方式暴露,并不是一种安全的方式,特别是大型项目的生产环境中,因为配置文...【详细内容】
2021-11-17  充满元气的java爱好者  博客园  Tags:SpringBoot   点击:(25)  评论:(0)  加入收藏
一、搭建环境1、创建数据库表和表结构create table account(id INT identity(1,1) primary key,name varchar(20),[money] DECIMAL2、创建maven的工程SSM,在pom.xml文件引入...【详细内容】
2021-11-11  AT小白在线中  搜狐号  Tags:开发框架   点击:(29)  评论:(0)  加入收藏
SpringBoot开发的物联网通信平台系统项目功能模块 功能 说明 MQTT 1.SSL支持 2.集群化部署时暂不支持retain&will类型消 UDP ...【详细内容】
2021-11-05  小程序建站    Tags:SpringBoot   点击:(55)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条