Replication Controller、ReplicaSet和Deployment(Kubernetes调度系列,结合操作命令讲解)

本文主要是介绍Replication Controller、ReplicaSet和Deployment(Kubernetes调度系列,结合操作命令讲解),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

一、概述

二、Replication Controller

2.1 Replication Controller 说明

2.2 Replication Controller 举例

三、ReplicaSet

3.1 ReplicaSet说明

3.2 ReplicaSet 举例

四、无状态应用管理Deployment

4.1 概述

4.2 创建Deployment

4.2.1 Deployment 标签内容解析

4.2.2 kubectl create创建语句

4.2.3 查看Deployment的状态

4.3.4 使用rollout查看Deployment创建的状态

4.3.5 查看Deployment对应的ReplicaSet

4.3.6 查看Deployment创建的Pod

4.3 更新Deployment

4.3.1 说明

4.3.2 使用set 命令更新

4.3.3 使用edit命令编辑Deployment

4.3.4 使用rollout查看Deployment查看更新过程

4.3.5 查看ReplicaSet

4.3.6 describe查看Deployment的详细信息

4.4 回滚Deployment

4.4.1 多更新几次Deployment

4.4.2 查看更新历史

4.4.3 查看某次更新

4.4.4 回滚版本

4.5 扩容Deployment

4.5.1 扩容操作

4.6 暂停和恢复Deployment更新

4.6.1 说明

4.6.2 暂停更新

4.6.3 修改内容

4.6.4 rollout history 查看历史

4.6.5 恢复Deployment更新

4.7 更新Deployment的注意事项

4.7.1 历史版本清理策略

4.7.2 更新策略

4.7.3 Ready策略


一、概述

对于Kubernetes的应用部署,我们之前提到过Pod就是用来配置容器的,容器就是用来运行应用的。也提到过,在实际使用时,不会创建单独的Pod运行应用,而是使用更高级的资源进行调度,比如Deployment等。本文的内容就是讲解Kubernetes原生的调度资源,在讲解高级资源Deployment、StatefulSet之前,首先会介绍什么是Replication Controller和ReplicaSet。

二、Replication Controller

2.1 Replication Controller 说明

Replication Controller可以确保Pod副本数达到期望值,也就是RC定义的数量。换句话说,Replication Controller可以确保一个Pod或一组同类Pod总是可用的。

如果存在的Pod大于设定的值,则Replication Controller将终止额外的Pod。如果太小,Replication Controller将启动更多的Pod用于保证达到期望值。

与手动创建Pod不同的是,用Replication Controller维护的Pod在失败、删除或终止时会自动替换。因此,即使应用程序只需要一个Pod,也应该使用Replication Controller或其他方式管理。

Replication Controller类似于进程管理程序,但是Replication Controller不是监视单个节点上的各个进程,而是监视多个节点上的多个Pod。

2.2 Replication Controller 举例

定义一个Replication Controller的示例如下:

三、ReplicaSet

3.1 ReplicaSet说明

ReplicaSet是支持基于集合的标签选择器的下一代Replication Controller,它主要用作Deployment协调创建、删除和更新Pod,和Replication Controller唯一的区别是,ReplicaSet支持标签选择器。

在实际应用中,虽然ReplicaSet可以单独使用,但是一般建议使用Deployment来自动管理ReplicaSet,除非自定义的Pod不需要更新或有其他编排等。

3.2 ReplicaSet 举例

Replication Controller和ReplicaSet的创建、删除和Pod并无太大区别,Replication Controller目前几乎已经不在生产环境中使用,ReplicaSet也很少单独被使用,都是使用更高级的资源Deployment、DaemonSet、StatefulSet管理Pod。

四、无状态应用管理Deployment

4.1 概述

前文提到的ReplicaSet可以确保在任何给定时间运行的Pod副本达到指定的数量,但是Deployment是一个更高级的概念,它管理ReplicaSet并为Pod和ReplicaSet提供声明性更新以及许多其他有用的功能,所以建议在生产环境下使用Deployment代替ReplicaSet。

Deployment一般用于部署公司的无状态服务,这个也是最常用的控制器,因为企业内部现在都是以微服务为主,而微服务实现无状态化也是最佳实践,可以利用Deployment的高级功能做到无缝迁移、自动扩容缩容、自动灾难恢复、一键回滚等功能。

4.2 创建Deployment

创建一个Deployment也很简单,将前面章节创建Pod的YAML文件稍微更改一下即可变成Deployment的资源文件,比如创建一个有3个Nginx副本(实例)的Deployment,可以看到只是apiVersion和Kind有所变化,如下所示:

4.2.1 Deployment 标签内容解析

  • nginx-deployment:Deployment的名称。
  • replicas:创建Pod的副本数。
  • selector:定义Deployment如何找到要管理的Pod,与template的label(标签)对应,apiVersion为apps/v1必须指定该字段。
  • template字段包含以下字段:
  • app: nginx使用label(标签)标记Pod。
  • spec:表示Pod运行一个名字为nginx的容器。
  • image:运行此Pod使用的镜像。
  • Port:容器用于发送和接收流量的端口。

注意:从Kubernetes 1.16版本开始,彻底废弃了其他的APIVersion,只能使用apps/v1,1.16以下的版本可以使用extension等。

4.2.2 kubectl create创建语句

使用kubectl create创建此Deployment:

kubectl create -f dp-nginx.yaml

4.2.3 查看Deployment的状态

使用kubectl get或者kubectl describe查看此Deployment的状态:

kubectl get deploy

  • NAME:集群中Deployment的名称。
  • DESIRED:应用程序副本数。
  • CURRENT:当前正在运行的副本数。
  • UP-TO-DATE:显示已达到期望状态的被更新的副本数。
  • AVAILABLE:显示用户可以使用的应用程序副本数,当前为1,因为部分Pod仍在创建过程中。
  • AGE:显示应用程序运行的时间。

4.3.4 使用rollout查看Deployment创建的状态

可以使用rollout命令查看整个Deployment创建的状态:

     kubectl rollout status deployment/nginx-deployment

当rollout结束时,再次查看此Deployment,可以看到AVAILABLE的数量和YAML文件中定义的replicas相同:

kubectl get deploy

4.3.5 查看Deployment对应的ReplicaSet

之前讲过Deployment通过ReplicaSet管理Pod,可以查看此Deployment当前对应的ReplicaSet:

kubectl get rs -l app=nginx

如果Deployment有过更新,对应的ReplicaSet可能不止一个,可以通过-o yaml获取当前对应的ReplicaSet是哪个,其余的ReplicaSet为保留的历史版本,用于回滚等操作。

注意:ReplicaSet的命名格式为[DEPLOYMENT-NAME]-[POD-TEMPLATE-HASH-VALUE]POD-TEMPLATE-HASH- VALUE,是自动生成的,不用手动指定。

4.3.6 查看Deployment创建的Pod

查看此Deployment创建的Pod,可以看到Pod的hash值5c689d88bb和上述Deployment对应的ReplicaSet的hash值一致:

kubectl get pods --show-labels

4.3 更新Deployment

4.3.1 说明

通过Deployment部署应用后,经常会有Deployment文件的配置更改或者镜像版本迭代的需求,更改配置后该Deployment会创建新的ReplicaSet,之后会对管理的Pod进行滚动升级。

注意:当且仅当Deployment的Pod模板(即.spec.template)更改时,才会触发Deployment更新,例如更改内存、CPU配置或者容器的image。

4.3.2 使用set 命令更新

假如更新Nginx Pod的image使用nginx:1.9.1,并使用--record记录当前更改的参数,后期回滚时可以查看到对应的信息:

     kubectl set image deployment nginx-deployment nginx=nginx:1.9.1 --record

4.3.3 使用edit命令编辑Deployment

     kubectl edit deployment.v1.apps/nginx-deployment

4.3.4 使用rollout查看Deployment查看更新过程

kubectl rollout status deployment.v1.apps/nginx-deployment

可以看出更新过程为新旧交替更新,首先新建一个Pod,当Pod状态为Running时,删除一个旧的Pod,同时创建一个新的Pod。

4.3.5 查看ReplicaSet

当触发一个更新后,会有新的ReplicaSet产生,旧的ReplicaSet会被保存,查看此时的ReplicaSet,可以从AGE或READY看出新旧ReplicaSet:

kubectl get rs

4.3.6 describe查看Deployment的详细信息

kubectl describe deploy nginx-deployment

在describe中可以看出,第一次创建时,它创建了一个名为nginx-deployment-5c689d88bb的ReplicaSet,并直接将其扩展为3个副本。更新部署时,它创建了一个新的ReplicaSet,命名为nginx-deployment-6987cdb55b,并将其副本数扩展为1,然后将旧的ReplicaSet缩小为2,这样至少可以有两个Pod可用,最多创建了4个Pod。以此类推,使用相同的滚动更新策略向上和向下扩展新旧ReplicaSet,最终新的ReplicaSet可以拥有3个副本,并将旧的ReplicaSet缩小为0。

4.4 回滚Deployment

4.4.1 多更新几次Deployment

当更新的版本不稳定或配置不合理时,可以对其进行回滚操作,假设我们又进行了几次更新(此处以更新镜像版本触发更新,更改配置效果类似):

     kubectl set image deployment nginx-deployment nginx=dotbalo/canary:v1 --recordkubectl set image deployment nginx-deployment nginx=dotbalo/canary:v2 --record

4.4.2 查看更新历史

使用kubectl rollout history查看更新历史:

kubectl rollout history deployment/nginx-deployment

4.4.3 查看某次更新

查看Deployment某次更新的详细信息,使用--revision指定某次更新的版本号:

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

4.4.4 回滚版本

如果只需要回滚到上一个稳定版本,使用kubectl rollout undo即可:

     kubectl rollout undo deployment/nginx-deployment

再次查看更新历史,发现REVISION5回到了canary:v1:

kubectl rollout history deployment/nginx-deployment

如果要回滚到指定版本,使用--to-revision参数:

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

4.5 扩容Deployment

4.5.1 扩容操作

当公司访问量变大,或者有预期内的活动时,3个Pod可能已无法支撑业务时,可以提前对其进行扩展。

使用kubectl scale动态调整Pod的副本数,比如增加Pod为5个:

      kubectl scale deployment.v1.apps/nginx-deployment --replicas=5

查看Pod,此时Pod已经变成了5个:

kubectl get pods

4.6 暂停和恢复Deployment更新

4.6.1 说明

上述演示的均为更改某一处的配置,更改后立即触发更新,大多数情况下可能需要针对一个资源文件更改多处地方,而并不需要多次触发更新,此时可以使用Deployment暂停功能,临时禁用更新操作,对Deployment进行多次修改后再进行更新。

4.6.2 暂停更新

使用kubectl rollout pause命令即可暂停Deployment更新:

      kubectl rollout pause deployment/nginx-deployment

4.6.3 修改内容

然后对Deployment进行相关更新操作,比如先更新镜像,然后对其资源进行限制(如果使用的是kubectl edit命令,可以直接进行多次修改,无须暂停更新,kubectl set命令一般会集成在CICD流水线中):

kubectl set image deployment.v1.apps/nginx-deployment nginx=nginx:1.9.1

kubectl set resources deployment.v1.apps/nginx-deployment -C=nginx -limits=cpu=200m,memory=512Mi

4.6.4 rollout history 查看历史

通过rollout history可以看到没有新的更新:

kubectl rollout history deployment.v1.apps/nginx-deployment

4.6.5 恢复Deployment更新

进行完最后一处配置更改后,使用kubectl rollout resume恢复Deployment更新:

     kubectl rollout resume deployment.v1.apps/nginx-deployment

可以查看到Deployment的image(镜像)已经变为nginx:1.9.1:

kubectl describe deploy nginx-deployment

4.7 更新Deployment的注意事项

4.7.1 历史版本清理策略

在默认情况下,revision保留10个旧的ReplicaSet,其余的将在后台进行垃圾回收,可以在.spec.revisionHistoryLimit设置保留ReplicaSet的个数。当设置为0时,不保留历史记录。

4.7.2 更新策略

  • .spec.strategy.type==Recreate:表示重建,先删掉旧的Pod,再创建新的Pod。
  • .spec.strategy.type==RollingUpdate:表示滚动更新,可以指定maxUnavailable和maxSurge来控制滚动更新过程。
  • .spec.strategy.rollingUpdate.maxUnavailable:指定在回滚更新时最大不可用的Pod数量,可选字段,默认为25%,可以设置为数字或百分比,如果maxSurge为0,则该值不能为0。
  • .spec.strategy.rollingUpdate.maxSurge:可以超过期望值的最大Pod数,可选字段,默认为25%,可以设置成数字或百分比,如果maxUnavailable为0,则该值不能为0。

4.7.3 Ready策略

.spec.minReadySeconds是可选参数,指定新创建的Pod应该在没有任何容器崩溃的情况下视为Ready(就绪)状态的最小秒数,默认为0,即一旦被创建就视为可用,通常和容器探针连用。

好了,本次内容就分享到这,欢迎大家关注《Kubernetes》专栏,后续会继续输出相关内容文章。如果有帮助到大家,欢迎大家点赞+关注+收藏,有疑问也欢迎大家评论留言!

这篇关于Replication Controller、ReplicaSet和Deployment(Kubernetes调度系列,结合操作命令讲解)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/878426

相关文章

Linux之计划任务和调度命令at/cron详解

《Linux之计划任务和调度命令at/cron详解》:本文主要介绍Linux之计划任务和调度命令at/cron的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux计划任务和调度命令at/cron一、计划任务二、命令{at}介绍三、命令语法及功能 :at

Python结合PyWebView库打造跨平台桌面应用

《Python结合PyWebView库打造跨平台桌面应用》随着Web技术的发展,将HTML/CSS/JavaScript与Python结合构建桌面应用成为可能,本文将系统讲解如何使用PyWebView... 目录一、技术原理与优势分析1.1 架构原理1.2 核心优势二、开发环境搭建2.1 安装依赖2.2 验

C++ vector的常见用法超详细讲解

《C++vector的常见用法超详细讲解》:本文主要介绍C++vector的常见用法,包括C++中vector容器的定义、初始化方法、访问元素、常用函数及其时间复杂度,通过代码介绍的非常详细,... 目录1、vector的定义2、vector常用初始化方法1、使编程用花括号直接赋值2、使用圆括号赋值3、ve

Spring Boot项目中结合MyBatis实现MySQL的自动主从切换功能

《SpringBoot项目中结合MyBatis实现MySQL的自动主从切换功能》:本文主要介绍SpringBoot项目中结合MyBatis实现MySQL的自动主从切换功能,本文分步骤给大家介绍的... 目录原理解析1. mysql主从复制(Master-Slave Replication)2. 读写分离3.

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++

Python基础文件操作方法超详细讲解(详解版)

《Python基础文件操作方法超详细讲解(详解版)》文件就是操作系统为用户或应用程序提供的一个读写硬盘的虚拟单位,文件的核心操作就是读和写,:本文主要介绍Python基础文件操作方法超详细讲解的相... 目录一、文件操作1. 文件打开与关闭1.1 打开文件1.2 关闭文件2. 访问模式及说明二、文件读写1.

C# WinForms存储过程操作数据库的实例讲解

《C#WinForms存储过程操作数据库的实例讲解》:本文主要介绍C#WinForms存储过程操作数据库的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、存储过程基础二、C# 调用流程1. 数据库连接配置2. 执行存储过程(增删改)3. 查询数据三、事务处

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时

Spring中@RestController和@Controller的使用及区别

《Spring中@RestController和@Controller的使用及区别》:本文主要介绍Spring中@RestController和@Controller的使用及区别,具有很好的参考价... 目录Spring中@RestController和@Controller使用及区别1. 基本定义2. 使

C++快速排序超详细讲解

《C++快速排序超详细讲解》快速排序是一种高效的排序算法,通过分治法将数组划分为两部分,递归排序,直到整个数组有序,通过代码解析和示例,详细解释了快速排序的工作原理和实现过程,需要的朋友可以参考下... 目录一、快速排序原理二、快速排序标准代码三、代码解析四、使用while循环的快速排序1.代码代码1.由快