主打一手「Pod」管理。

一、背景

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

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

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

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

二、Deployment组件

1、简介

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

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

2、语法说明

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

这里只是一个简单的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】,或者直接从脚本文件查看相关信息;

查看上线状态

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

查看【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

3、更新操作

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

更新为【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

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

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

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

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,未触发上线

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

kubectl rollout resume deployment/serve-deployment

查看【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

K8S | Deployment应用编排的更多相关文章

  1. [转帖]从零开始入门 K8s:应用编排与管理:Job & DaemonSet

    从零开始入门 K8s:应用编排与管理:Job & DaemonSet https://www.infoq.cn/article/KceOuuS7somCYbfuykRG 陈显鹭 阅读数:193 ...

  2. 【转帖】K8S Deployment 命令

    K8S Deployment 命令 https://www.cnblogs.com/Tempted/p/7831604.html 今天学习了一下 kubectl scale deployment xx ...

  3. k8s的容器编排

    1.K8S是如何对容器编排? 在K8S集群中,容器并非最小的单位,K8S集群中最小的调度单位是Pod,容器则被封装在Pod之中.由此可知,一个容器或多个容器可以同属于在一个Pod之中. 2.Pod是怎 ...

  4. K8s(一)----容器编排工具基础概念

    kubernetes(k8s)容器编排工具基础概念 Kubernetes (K8s): 中文社区:https://www.kubernetes.org.cn/replication-controlle ...

  5. 详细聊聊k8s deployment的滚动更新(二)

    一.知识准备 ● 本文详细探索deployment在滚动更新时候的行为 ● 相关的参数介绍:   livenessProbe:存活性探测.判断pod是否已经停止   readinessProbe:就绪 ...

  6. 详细聊聊k8s deployment的滚动更新(一)

    一.知识准备 ● 本文详细探索deployment在滚动更新时候的行为 二.环境准备 组件 版本 OS Ubuntu 18.04.1 LTS docker 18.06.0-ce 三.准备镜像 首先准备 ...

  7. 从零开始入门 K8s| K8s 的应用编排与管理

    作者 | 张振 阿里巴巴高级技术专家 一.资源元信息 1. Kubernetes 资源对象 我们知道,Kubernetes 的资源对象组成:主要包括了 Spec.Status 两部分.其中 Spec ...

  8. k8s deployment controller源码分析

    deployment controller简介 deployment controller是kube-controller-manager组件中众多控制器中的一个,是 deployment 资源对象的 ...

  9. K8S Deployment 命令

    创建 Deployment kubectl create -f https://kubernetes.io/docs/user-guide/nginx-deployment.yaml --record ...

  10. k8s deployment yam 文件分析

    apiVersion: extensions/v1beta1 kind: Deployment metadata: name: namespace: labels:spec: replicas: #设 ...

随机推荐

  1. macOS下安装 n 管理包(node版本管理工具)

    1. 安装 n 管理包 终端命令全局安装 npm install -g n 安装成功后在终端输入 n --version 或 n 查看,可看到 n 的默认安装目录 下面就是使用 n 的方式了, 首先查 ...

  2. WPF Window设置ResizeMode="NoResize"

    WPF窗口设置属性ResizeMode="NoResize"时,回到桌面后,点击任意应用,都会将此窗口激活. 我们来看下详细操作: 1. WPF窗口设置属性ResizeMode 2 ...

  3. Python if 语句练习

    if语句 练习 # 1.以特殊方式跟管理员打招呼 # 创建一个至少包含 5 个用户名的列表,且其中一个用户名为 'admin' .想象你要编写代码,在每位用户登录网站后都打印一条问 # 候消息.遍历用 ...

  4. Python-psycopg2的简单使用

    一.简介 psycopg2 库是 python 用来操作 postgreSQL 数据库的第三方库. 二.安装 1.执行如下命令安装 pip3 install psycopg2 2.使用Pycharm安 ...

  5. 自制ASP.NET 本地授权文件

    asp.net登录时验证本地ini文件是否正确,主要步骤. 1.导入myini.DLL文件. 下载地址:http://yunpan.cn/cKw9kHJUk9Ui8  提取码 6631 2.添加引用 ...

  6. 2022-05-03:Alice 和 Bob 再次设计了一款新的石子游戏。现有一行 n 个石子,每个石子都有一个关联的数字表示它的价值。给你一个整数数组 stones ,其中 stones[i] 是第

    2022-05-03:Alice 和 Bob 再次设计了一款新的石子游戏.现有一行 n 个石子,每个石子都有一个关联的数字表示它的价值.给你一个整数数组 stones ,其中 stones[i] 是第 ...

  7. 2021-07-18:最高的广告牌。你正在安装一个广告牌,并希望它高度最大。这块广告牌将有两个钢制支架,两边各一个。每个钢支架的高度必须相等。你有一堆可以焊接在一起的钢筋 rods。举个例子,如果钢筋

    2021-07-18:最高的广告牌.你正在安装一个广告牌,并希望它高度最大.这块广告牌将有两个钢制支架,两边各一个.每个钢支架的高度必须相等.你有一堆可以焊接在一起的钢筋 rods.举个例子,如果钢筋 ...

  8. 为什么有了 HTTP 还要 RPC

    哈喽大家好,我是咸鱼 随着互联网技术的发展,分布式架构越来越被人们所采用.在分布式架构下,为了实现复杂的业务逻辑,应用程序需要分布式通信实现远程调用 而这时候就需要一种协议来支持远程过程调用,以便实现 ...

  9. 2014年蓝桥杯C/C++大学B组省赛真题(李白打酒)

    题目描述: 题目描述 话说大诗人李白,一生好饮.幸好他从不开车. 一天,他提着酒壶,从家里出来,酒壶中有酒2斗.他边走边唱: 无事街上走,提壶去打酒. 逢店加一倍,遇花喝一斗. 这一路上,他一共遇到店 ...

  10. SpringMVC使用注解开发

    1.编写web.xml(模板代码) 2.导入springmvc的context和mvc两个依赖,通过context标签可以自动扫描识别包"com.lian.controller"下 ...