K8S | Deployment应用编排

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: 通过Deployment控制器,可以对应用进行快速的编排,比如声明Pod的发布方式,更新和回滚策略,维持Pod副本数量;

主打一手「Pod」管理。

一、背景

分布式系统的一大优势:可以针对不同的服务制定不同的管理策略,比如发布、更新、下线,会根据服务自身的特点采取相应的措施;

1.png

如果服务的流量小,通常采取单服务部署即可,并且可以限定其资源分配;

如果服务的流量大并且是核心的能力,通常会采用集群的方式管理,资源分配上也会更加的倾斜,从而保证核心应用的稳定性;

这种管理策略虽然很合理,但是从技术角度来看,其实现的复杂程度度也相对较高,在Kubenetes中可以使用Deployment组件简化服务的编排难度;

二、Deployment组件

1、简介

通过Deployment控制器,可以对应用进行快速的编排,比如声明Pod的发布方式,更新和回滚策略,维持Pod副本数量;

2.png

实际上控制器并不会直接管理Pod,而是通过管理ReplicaSet间接实现Pod管理,ReplicaSet是在后台管理的Pod,在应用部署后可以查看相关的配置文件来验证该流程;

2、语法说明

作为K8S的工作负载(运行的应用程序)资源,Deployment为Pod和ReplicaSet提供声明式的管理能力;

3.png

这里只是一个简单的Deployment的yaml文件,作为生产环境中最常用的部署方式,更多的细节可以参考K8S文档;

三、基础用例

1、创建操作

Deployment资源脚本,容器使用【auto-serve:latest】镜像文件;

apiVersion: apps/v1
kind: Deployment
metadata:
  name: serve-deployment
  labels: 
    app: auto-serve
spec:
  replicas: 2
  selector:
    matchLabels:
      app: auto-serve
  template:
    metadata:
      labels:
        app: auto-serve
    spec:
      containers:
        - name: auto-serve
          image: auto-serve:latest
          imagePullPolicy: Never
          ports:
            - containerPort: 8082

执行创建,然后在命令行或者控制台界面查看相关结果;

kubectl apply -f serve-deployment.yaml

2、查看信息

查看指定【serve-deployment】信息;

kubectl get deployment/serve-deployment

NAME               READY   UP-TO-DATE   AVAILABLE   AGE
serve-deployment   2/2     2            2           5s

查看指定【serve-deployment】描述信息;

kubectl describe deployment/serve-deployment

Name:                   serve-deployment
Labels:                 app=auto-serve
Annotations:            deployment.kubernetes.io/revision: 1
Selector:               app=auto-serve
Replicas:               2 desired | 2 updated | 2 total | 2 available | 0 unavailable
StrategyType:           RollingUpdate

Pod Template:
  Labels:  app=auto-serve
  Containers:
   auto-serve:
    Image:        auto-serve:latest
    Port:         8082/TCP
    Host Port:    0/TCP

Conditions:
  Type           Status  Reason
  ----           ------  ------
  Available      True    MinimumReplicasAvailable
  Progressing    True    NewReplicaSetAvailable

Events:
  Type    Reason             Age   From                   Message
  ----    ------             ----  ----                   -------
  Normal  ScalingReplicaSet  10m   deployment-controller  Scaled up replica set serve-deployment-f6f6c5bbd to 2

可以在控制台界面查看【ReplicaSet】,或者直接从脚本文件查看相关信息;

4.png

查看上线状态

kubectl rollout status deployment/serve-deployment

deployment "serve-deployment" successfully rolled out

查看【ReplicaSet】

kubectl get rs

NAME                         DESIRED   CURRENT   READY   AGE
serve-deployment-f6f6c5bbd   2         2         2       12m

5.png

查看【Pod】

kubectl get pods

NAME                               READY   STATUS    RESTARTS   AGE
serve-deployment-f6f6c5bbd-d8k6v   1/1     Running   0          15m
serve-deployment-f6f6c5bbd-hs6h5   1/1     Running   0          15m

6.png

3、更新操作

提供【auto-serve】多个版本的镜像文件,用来模拟最常见的镜像更新动作;

7.png

更新为【1.1.1】镜像版本

kubectl set image deployment/serve-deployment auto-serve=auto-serve:1.1.1

查看描述信息

kubectl describe deployment/serve-deployment

Name:                   serve-deployment
Labels:                 app=auto-serve
Annotations:           【deployment.kubernetes.io/revision: 2】对比此处和初次发布的描述
Selector:               app=auto-serve
Replicas:               2 desired | 2 updated | 2 total | 2 available | 0 unavailable
RollingUpdateStrategy:  25% max unavailable, 25% max surge

Pod Template:
  Labels:  app=auto-serve
  Containers:
   auto-serve:
    Image:        auto-serve:1.1.1 【镜像已更新】
    Port:         8082/TCP

Conditions:
  Type           Status  Reason
  ----           ------  ------
  Available      True    MinimumReplicasAvailable
  Progressing    True    NewReplicaSetAvailable

NewReplicaSet:   serve-deployment-6d9cd7f8c6 (2/2 replicas created)

4、删除操作

kubectl delete -f serve-deployment.yaml

四、进阶用例

1、回滚操作

再次执行镜像更新,这样【serve-deployment】会有3个版本

kubectl set image deployment/serve-deployment auto-serve=auto-serve:2.2.2

查看历史版本

kubectl rollout history deployment/serve-deployment

deployment.apps/serve-deployment 
REVISION  CHANGE-CAUSE
1         <none>
2         <none>
3         <none>

查看历史版本2信息,【auto-serve】对应的镜像版本是【1.1.1】

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

deployment.apps/serve-deployment with revision #2
Pod Template:
  Labels:    app=auto-serve
    pod-template-hash=6d9cd7f8c6
  Containers:
   auto-serve:
    Image:    auto-serve:1.1.1
    Port:    8082/TCP
    Host Port:    0/TCP
    Environment:    <none>
    Mounts:    <none>
  Volumes:    <none>

回滚到上个版本,即镜像【auto-serve:1.1.1】

kubectl rollout undo deployment/serve-deployment

deployment.apps/serve-deployment rolled back

8.png

回滚到指定版本,即镜像【auto-serve:latest】

kubectl rollout undo deployment/serve-deployment --to-revision=1

9.png

2、伸缩操作

伸缩命令

kubectl scale deployment/serve-deployment --replicas=3

deployment.apps/serve-deployment scaled

查看【ReplicaSet】信息

kubectl get rs

NAME                          DESIRED   CURRENT   READY   AGE
serve-deployment-6b47bf4db7   0         0         0       7m3s
serve-deployment-6d9cd7f8c6   0         0         0       7m17s
serve-deployment-f6f6c5bbd    3         3         3       8m10s

查看【Pod】信息

kubectl get pods

NAME                               READY   STATUS    RESTARTS   AGE
serve-deployment-f6f6c5bbd-4rvhw   1/1     Running   0          4m13s
serve-deployment-f6f6c5bbd-bwg7s   1/1     Running   0          4m15s
serve-deployment-f6f6c5bbd-mv9wt   1/1     Running   0          2m21s

10.png

3、暂停与恢复

暂停发布

kubectl rollout pause deployment/serve-deployment

deployment.apps/serve-deployment paused

查看信息描述

kubectl describe deployment/serve-deployment

Conditions:
  Type           Status   Reason
  ----           ------   ------
  Available      True     MinimumReplicasAvailable
  Progressing    Unknown  DeploymentPaused  【注意此处的状态】

执行更新

kubectl set image deployment/serve-deployment auto-serve=auto-serve:1.1.1

查看Pod,未触发上线

11.png

恢复发布,会自动执行上面的更新动作

kubectl rollout resume deployment/serve-deployment

12.png

查看【ReplicaSet】信息

kubectl get rs -o wide

NAME                          DESIRED   CURRENT   READY   AGE   CONTAINERS   IMAGES              
serve-deployment-6b47bf4db7   0         0         0       14m   auto-serve   auto-serve:2.2.2    
serve-deployment-6d9cd7f8c6   3         3         3       15m   auto-serve   auto-serve:1.1.1    
serve-deployment-f6f6c5bbd    0         0         0       16m   auto-serve   auto-serve:latest

查看【Pod】信息

kubectl get pods -o wide

NAME                                READY   STATUS    RESTARTS   AGE     IP           NODE           
serve-deployment-6d9cd7f8c6-m66cv   1/1     Running   0          2m9s    10.1.0.125   docker-desktop 
serve-deployment-6d9cd7f8c6-sk2qv   1/1     Running   0          2m11s   10.1.0.124   docker-desktop 
serve-deployment-6d9cd7f8c6-zj6p2   1/1     Running   0          2m8s    10.1.0.126   docker-desktop

五、状态描述

Deployment有三个核心状态来描述其生命周期的变化:「Progressing」进行中,「Complete」已完成,「Failed」失败;

【Progressing】

Deployment处在部署或者伸缩过程中;

当Deployment执行这些任务期间:创建新的ReplicaSet;正在为其最新的ReplicaSet扩容;正在为其旧有的ReplicaSets缩容;新的Pod已经就绪或者可用;

【Complete】

具有以下特征时会被标记为已完成状态;

Deployment关联的所有副本都已更新到指定的最新版本,意味着此前请求的所有更新都已完成;Deployment关联的所有副本都可用;未运行Deployment的旧副本;

【Failed】

Deployment可能会在尝试部署其最新的ReplicaSet受挫,一直处于未完成状态;

造成这种情况的因素很多,可能是:配额不足,就绪探测失败,镜像拉取错误,权限不足,限制范围问题,应用程序运行时的配置错误;

六、参考源码

文档仓库:
https://gitee.com/cicadasmile/butte-java-note

脚本仓库:
https://gitee.com/cicadasmile/butte-auto-parent
相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
3天前
|
Prometheus Kubernetes 监控
k8s学习--kubernetes服务自动伸缩之水平伸缩(pod副本伸缩)HPA详细解释与案例应用
k8s学习--kubernetes服务自动伸缩之水平伸缩(pod副本伸缩)HPA详细解释与案例应用
k8s学习--kubernetes服务自动伸缩之水平伸缩(pod副本伸缩)HPA详细解释与案例应用
|
1天前
|
存储 Kubernetes 负载均衡
基于Ubuntu-22.04安装K8s-v1.28.2实验(四)使用域名访问网站应用
基于Ubuntu-22.04安装K8s-v1.28.2实验(四)使用域名访问网站应用
9 1
|
3天前
|
Kubernetes 负载均衡 应用服务中间件
k8s学习--ingress详细解释与应用(nginx ingress controller))
k8s学习--ingress详细解释与应用(nginx ingress controller))
|
3天前
|
缓存 Kubernetes 负载均衡
k8s学习--sessionAffinity会话保持(又称会话粘滞)详细解释与应用
k8s学习--sessionAffinity会话保持(又称会话粘滞)详细解释与应用
|
10天前
|
存储 Kubernetes 关系型数据库
阿里云ACK备份中心,K8s集群业务应用数据的一站式灾备方案
阿里云ACK备份中心,K8s集群业务应用数据的一站式灾备方案
|
21天前
|
Kubernetes 监控 Cloud Native
云原生入门:从传统应用到容器化部署的旅程
【9月更文挑战第19天】在数字化浪潮中,企业正迅速将目光投向云原生技术,以实现更快的应用开发和更灵活的资源管理。本文将通过一个简单示例引导读者理解如何将传统应用转变为云原生应用,并部署至云端。我们将探索容器化技术的基础,以及它如何帮助企业解锁现代软件交付的速度和效率。准备好让你的应用乘上云原生的快车了吗?让我们开始这段令人兴奋的旅程吧!
|
23天前
|
Kubernetes Cloud Native Linux
云原生入门:Kubernetes的简易部署与应用
【8月更文挑战第49天】在云原生的世界里,Kubernetes(K8s)是一颗璀璨的星。本文将带你走进K8s的世界,从安装到简单应用,轻松驾驭这个强大的容器编排工具。让我们一起探索云原生的奥秘,解锁新技能!
|
3天前
|
存储 Kubernetes 调度
k8s学习--k8s群集部署zookeeper应用及详细解释
k8s学习--k8s群集部署zookeeper应用及详细解释
|
3天前
|
存储 Kubernetes 数据安全/隐私保护
k8s学习--Secret详细解释与应用
Secret 支持四种类型: - **Opaque Secrets**:存储任意类型机密数据,需自行加密。 - **Service Account Token Secrets**:自动管理 API 访问令牌。 - **Docker Registry Secrets**:存储 Docker 私有仓库认证信息。 - **TLS Secrets**:存储 TLS 证书和私钥,用于加密通信。
|
3天前
|
存储 Kubernetes 开发工具
k8s学习--ConfigMap详细解释与应用
ConfigMap 是 Kubernetes 中用于管理非机密配置数据的 API 对象,可将应用配置与容器分离,便于动态管理和更新。它支持四种创建方式:命令行参数、多个文件、文件内的键值对以及 YAML 资源清单文件。ConfigMap 可通过环境变量或挂载为卷的方式传递给 Pod,并且当通过卷挂载时支持热更新。这使得配置管理更加灵活和安全,无需重新部署应用即可更新配置。