【云原生 | 从零开始学Kubernetes】十五、k8s核心技术-Deployment 控制器

简介: Deployment表示用户对K8S集群的一次更新操作。Deployment是一个比RS( Replica Set, RS) 应用模型更广的 API 对象,可以是创建一个新的服务,更新一个新的服务,也可以是滚动升级一个服务。滚动升级一个服务,实际是创建一个新的RS,然后逐渐将新 RS 中副本数增加到理想状态,将旧RS中的副本数减少到0的复合操作。

什么是Deployment 控制器


·Deployment控制器可以部署无状态应用


·管理Pod和ReplicaSet


·部署,滚动升级等功能


·应用场景:web服务,微服务


Deployment表示用户对K8S集群的一次更新操作。Deployment是一个比RS( Replica Set, RS) 应用模型更广的 API 对象,可以是创建一个新的服务,更新一个新的服务,也可以是滚动升级一个服务。滚动升级一个服务,实际是创建一个新的RS,然后逐渐将新 RS 中副本数增加到理想状态,将旧RS中的副本数减少到0的复合操作。


这样一个复合操作用一个RS是不好描述的,所以用一个更通用的Deployment来描述。以K8S的发展方向,未来对所有长期伺服型的业务的管理,都会通过Deployment来管理。


Deployment 概述


Deployment 是 kubernetes 中最常用的资源对象,为 ReplicaSet 和 Pod 的创建提供了一种声明式的定义方法,在 Deployment 对象中描述一个期望的状态,Deployment 控制器就会按照一定的控制速率把实际状态改成期望状态,通过定义一个 Deployment 控制器会创建一个新的 ReplicaSet 控制器,通过 ReplicaSet 创建 pod,删除 Deployment 控制器,也会删除 Deployment 控制器下对应的 ReplicaSet 控制器和 pod 资源。


使用 Deployment 而不直接创建 ReplicaSet 是因为 Deployment 对象拥有许多 ReplicaSet 没有的特性,例如滚动升级和回滚。


扩展:声明式定义是指直接修改资源清单 yaml 文件,然后通过 kubectl apply -f 资源清单 yaml 文 件,就可以更改资源。Deployment 控制器是建立在 rs 之上的一个控制器,可以管理多个 rs,每次更新镜像版本,都会生成一个新的 rs,把旧的 rs 替换掉,多个 rs 同时存在,但是只有一个 rs 运行。


5.png


rs v1 控制三个 pod,删除一个 pod,在 rs v2 上重新建立一个,依次类推,直到全部都是由 rs v2 控制,如果 rs v2 有问题,还可以回滚,Deployment 是建构在 rs 之上的,多个 rs 组成一个 Deployment,但是只有一个 rs 处于活跃状态.


Deployment 工作原理:如何管理 rs 和 Pod?


Deployment 可以使用声明式定义,直接在命令行通过纯命令的方式完成对应资源版本的内容的修改,也就是通过打补丁的方式进行修改;Deployment 能提供滚动式自定义自控制的更新;对 Deployment 来讲,我们在实现更新时还可以实现控制更新节奏和更新逻辑。


什么叫做更新节奏和更新逻辑呢?


比如说 Deployment 控制 5 个 pod 副本,pod 的期望值是 5 个,但是升级的时候需要额外多几个 pod,那我们控制器可以控制在 5 个 pod 副本之外还能再增加几个 pod 副本。比方说能多一个,但是不能少,那么升级的时候就是先增加一个,再删除一个,增加一个删除一个,始终保持 pod 副本数是 5 个。还有一种情况,最多允许多一个,最少允许少一个,也就是最多 6 个,最少 4 个,第一次加一个,删除两个,第二次加两个,删除两个,依次类推,可以自己控制更新方式,这种滚动更新需要加 readinessProbe 和 livenessProbe 探测,确保 pod 中容器里的应用都正常启动了才删除之前的 pod。


启动第一步,刚更新第一批就暂停了也可以;假如目标是 5 个,允许一个也不能少,允许最多可以 10 个,那一次加 5 个即可;这就是我们可以自己控制节奏来控制更新的方法。


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


1、创建 ReplicaSet 和 Pod


2、滚动升级(不停止旧服务的状态下升级)和回滚应用(将应用回滚到之前的版本)


3、平滑地扩容和缩容


4、暂停和继续 Deployment


简单使用Deployment


但是我们可以尝试使用上面的代码创建一个镜像【只是尝试,不会创建】


kubectl create deployment web --image=nginx --dry-run -o yaml > nginx.yaml


然后输出一个yaml配置文件 nginx.yml ,配置文件如下所示


apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: web
  name: web
spec:
  replicas: 1
  selector:
    matchLabels:
      app: web
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: web
    spec:
      containers:
      - image: nginx
        name: nginx
        resources: {}
status: {}


我们看到的 selector 和 label 就是我们Pod 和 Controller之间建立关系的桥梁


51.png


使用YAML创建Pod


通过刚刚的代码快速创建Pod镜像


kubectl apply -f nginx.yaml


但是因为这个方式创建的,我们只能在集群内部进行访问,所以我们还需要对外暴露端口


kubectl expose deployment web --port=80 --type=NodePort --target-port=80 --name=web1


关于上述命令,有几个参数


· –port:就是我们内部的端口号


· –target-port:就是暴露外面访问的端口号


· –name:名称


· –type:类型


同理,我们一样可以导出对应的配置文件


kubectl expose deployment web --port=80 --type=NodePort --target-port=80 --name=web1 -o yaml > web1.yaml


得到的web1.yaml如下所示


apiVersion: v1
kind: Service
metadata:
  creationTimestamp: "2022-07-11T07:21:58Z"
  labels:
    app: web
  managedFields:
  - apiVersion: v1
    fieldsType: FieldsV1
    fieldsV1:
      f:metadata:
        f:labels:
          .: {}
          f:app: {}
      f:spec:
        f:externalTrafficPolicy: {}
        f:ports:
          .: {}
          k:{"port":80,"protocol":"TCP"}:
            .: {}
            f:port: {}
            f:protocol: {}
            f:targetPort: {}
        f:selector:
          .: {}
          f:app: {}
        f:sessionAffinity: {}
        f:type: {}
    manager: kubectl
    operation: Update
    time: "2022-07-11T07:21:58Z"
  name: web-5dcb957ccc-246f9
  namespace: default
  resourceVersion: "49814"
  selfLink: /api/v1/namespaces/default/services/web-5dcb957ccc-246f9
  uid: 05dbb353-3b46-4907-a6fe-7f345d178d93
spec:
  clusterIP: 10.105.31.251
  externalTrafficPolicy: Cluster
  ports:
  - nodePort: 30438
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: web
  sessionAffinity: None
  type: NodePort
status:
  loadBalancer: {}


然后我们可以通过下面的命令来查看对外暴露的服务


kubectl get pods,svc


然后我们访问对应的url,即可看到 nginx了 http://192.168.11.139:32639/


50.png


升级回滚和弹性伸缩


·升级: 假设从版本为1.14 升级到 1.15 ,这就叫应用的升级【升级可以保证服务不中断】


·回滚:从版本1.15 变成 1.14,这就叫应用的回滚


·弹性伸缩:我们根据不同的业务场景,来改变Pod的数量对外提供服务,这就是弹性伸缩


应用升级和回滚


首先我们先创建一个 1.14版本的Pod


apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: web
  name: web
spec:
  replicas: 1
  selector:
    matchLabels:
      app: web
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: web
    spec:
      containers:
      - image: nginx:1.14
        name: nginx
        resources: {}
status: {}


我们先指定版本为1.14,然后开始创建我们的Pod


kubectl apply -f nginx.yaml


然后我们查看pods,nginx在node2,过去使用docker images命令,就能看到我们成功拉取到了一个 1.14版本的镜像


nginx                                1.14                295c7be07902        3 years ago         109MB


我们使用下面的命令,可以将nginx从 1.14 升级到 1.15


kubectl set image deployment web nginx=nginx:1.15


在我们执行完命令后,能看到升级的过程


[root@k8smaster node]# kubectl get pods
NAME                    READY   STATUS              RESTARTS   AGE
web-65b7447c7-9rp9v     1/1     Running             0          107s
web-7d9697b7f8-fdtbv    0/1     ContainerCreating   0          21s
[root@k8smaster node]# kubectl get pods
NAME                    READY   STATUS    RESTARTS   AGE
nginx-f89759699-5qdtn   1/1     Running   2          14d
web-7d9697b7f8-fdtbv    1/1     Running   0          37s


·首先是开始的nginx 1.14版本的Pod在运行,然后 1.15版本的在创建


·然后在1.15版本创建完成后,就会暂停1.14版本


·最后把1.14版本的Pod移除,完成我们的升级


我们在下载 1.15版本,容器就处于ContainerCreating状态,然后下载完成后,就用 1.15版本去替换1.14版本了,这么做的好处就是:升级可以保证服务不中断


我们到我们的node2节点上,查看我们的 docker images;


52.png


能够看到,我们已经成功拉取到了 1.15版本的nginx了


查看升级状态


下面可以,查看升级状态


kubectl rollout status deployment web


查看历史版本


我们还可以查看历史版本


kubectl rollout history deployment web


应用回滚


我们可以使用下面命令,完成回滚操作,也就是回滚到上一个版本


kubectl rollout undo deployment web


然后我们就可以查看状态


kubectl rollout status deployment web


53.png


同时我们还可以回滚到指定版本


kubectl rollout undo deployment web --to-revision=2


弹性伸缩


弹性伸缩,也就是我们通过命令一下创建多个副本


kubectl scale deployment web --replicas=10


能够清晰看到,我们一下创建了10个副本


55.png

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
7天前
|
Cloud Native Serverless 数据中心
阿里云ACK One:注册集群支持ACS算力——云原生时代的计算新引擎
ACK One注册集群已正式支持ACS(容器计算服务)算力,为企业的容器化工作负载提供更多选择和更强大的计算能力。
|
1月前
|
存储 运维 Kubernetes
正式开源,Doris Operator 支持高效 Kubernetes 容器化部署方案
飞轮科技推出了 Doris 的 Kubernetes Operator 开源项目(简称:Doris Operator),并捐赠给 Apache 基金会。该工具集成了原生 Kubernetes 资源的复杂管理能力,并融合了 Doris 组件间的分布式协同、用户集群形态的按需定制等经验,为用户提供了一个更简洁、高效、易用的容器化部署方案。
正式开源,Doris Operator 支持高效 Kubernetes 容器化部署方案
|
2月前
|
存储 Kubernetes Docker
Kubernetes(k8s)和Docker Compose本质区别
理解它们的区别和各自的优势,有助于选择合适的工具来满足特定的项目需求。
232 19
|
2月前
|
存储 Kubernetes 开发者
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
Docker 是一种开源的应用容器引擎,允许开发者将应用程序及其依赖打包成可移植的镜像,并在任何支持 Docker 的平台上运行。其核心概念包括镜像、容器和仓库。镜像是只读的文件系统,容器是镜像的运行实例,仓库用于存储和分发镜像。Kubernetes(k8s)则是容器集群管理系统,提供自动化部署、扩展和维护等功能,支持服务发现、负载均衡、自动伸缩等特性。两者结合使用,可以实现高效的容器化应用管理和运维。Docker 主要用于单主机上的容器管理,而 Kubernetes 则专注于跨多主机的容器编排与调度。尽管 k8s 逐渐减少了对 Docker 作为容器运行时的支持,但 Doc
178 5
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
|
2月前
|
Kubernetes 应用服务中间件 nginx
二进制安装Kubernetes(k8s)v1.32.0
本指南提供了一个详细的步骤,用于在Linux系统上通过二进制文件安装Kubernetes(k8s)v1.32.0,支持IPv4+IPv6双栈。具体步骤包括环境准备、系统配置、组件安装和配置等。
686 10
|
3月前
|
Kubernetes Cloud Native API
深入理解Kubernetes——容器编排的王者之道
深入理解Kubernetes——容器编排的王者之道
71 1
|
3月前
|
Kubernetes Cloud Native 微服务
云原生入门与实践:Kubernetes的简易部署
云原生技术正改变着现代应用的开发和部署方式。本文将引导你了解云原生的基础概念,并重点介绍如何使用Kubernetes进行容器编排。我们将通过一个简易的示例来展示如何快速启动一个Kubernetes集群,并在其上运行一个简单的应用。无论你是云原生新手还是希望扩展现有知识,本文都将为你提供实用的信息和启发性的见解。
|
2月前
|
运维 Cloud Native 持续交付
云原生技术深度探索:重塑现代IT架构的无形之力####
本文深入剖析了云原生技术的核心概念、关键技术组件及其对现代IT架构变革的深远影响。通过实例解析,揭示云原生如何促进企业实现敏捷开发、弹性伸缩与成本优化,为数字化转型提供强有力的技术支撑。不同于传统综述,本摘要直接聚焦于云原生技术的价值本质,旨在为读者构建一个宏观且具体的技术蓝图。 ####
|
2月前
|
Cloud Native API 持续交付
云原生架构下的微服务治理策略与实践####
本文旨在探讨云原生环境下微服务架构的治理策略,通过分析当前面临的挑战,提出一系列实用的解决方案。我们将深入讨论如何利用容器化、服务网格(Service Mesh)等先进技术手段,提升微服务系统的可管理性、可扩展性和容错能力。此外,还将分享一些来自一线项目的经验教训,帮助读者更好地理解和应用这些理论到实际工作中去。 ####
72 0
|
2月前
|
Kubernetes Cloud Native 微服务
探索云原生技术:容器化与微服务架构的融合之旅
本文将带领读者深入了解云原生技术的核心概念,特别是容器化和微服务架构如何相辅相成,共同构建现代软件系统。我们将通过实际代码示例,探讨如何在云平台上部署和管理微服务,以及如何使用容器编排工具来自动化这一过程。文章旨在为开发者和技术决策者提供实用的指导,帮助他们在云原生时代中更好地设计、部署和维护应用。

热门文章

最新文章