Kubernetes_Deployment全解析(无状态的Pod)
前言
一、创建Deployment
1.1 创建Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.16.0
ports:
- containerPort: 80


1.2 Deployment yaml文件
在该 yaml 文件中:
创建名为 nginx-deployment(由 .metadata.name 字段标明)的 Deployment。spec 中有三个字段,分别是 replicas 副本数、selector 选择器、template模板,如下:
(1) 该 Deployment 创建三个(由 .spec.replicas 字段标明)Pod 副本。
(2) .spec.selector 字段定义了 Deployment 如何查找要管理的 Pod。在这里,你选择在 Pod 模板中定义的标签(app: nginx)。 不过,更复杂的选择规则是也可能的,只要 Pod 模板本身满足所给规则即可。
(3) template 字段包含以下子字段:
Pod 被使用 .metadata.labels 字段打上 app: nginx 标签。
Pod 模板规约(即 .template.spec 字段)指示 Pod 运行一个 nginx 容器, 该容器运行版本为 1.14.2 的 nginx Docker Hub 镜像。
创建一个容器并使用 .spec.template.spec.containers[0].name 字段将其命名为 nginx。
1.3 查看当前deploy(get命令和rollout命令)
查看当前deploy,包括两条命令,如下:
kubectl get deployments
kubectl rollout status deploy nginx-deployment
运行 kubectl get deployments 检查 Deployment 是否已创建。 如果仍在创建 Deployment,则输出类似于:
[root@w1 deploy]# kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 3/3 3 3 9m45s

在检查集群中的 Deployment 时,所显示的字段有:
(1) NAME 列出了名字空间中 Deployment 的名称。
(2) READY 显示应用程序的可用的“副本”数。显示的模式是“就绪个数/期望个数”。
(3) UP-TO-DATE 显示为了达到期望状态已经更新的副本数。
(4) AVAILABLE 显示应用可供用户使用的副本数。
(5) AGE 显示应用程序运行的时间。
请注意期望副本数是根据 .spec.replicas 字段设置 3。

解释一下,这个 rollout 也是查看命令,只是这个 rollout 命令用的比 get 命令少,rollout 的英文就是 展示 的意思
1.4 查看当前rs(get命令)
kubectl get rs

ReplicaSet 输出中包含以下字段:
(1) NAME 列出名字空间中 ReplicaSet 的名称;
(2) DESIRED 显示应用的期望副本个数,即在创建 Deployment 时所定义的值。 此为期望状态;
(3) CURRENT 显示当前运行状态中的副本个数;
(4) READY 显示应用中有多少副本可以为用户提供服务;
(5) AGE 显示应用已经运行的时间长度。
注意 ReplicaSet 的名称始终被格式化为[Deployment名称]-[哈希]。 其中的哈希字符串与 ReplicaSet 上的 pod-template-hash 标签一致。
1.5 查看当前pod(get命令)
kubectl get pods --show-labels
kubectl get pods -o wide
kubectl get pods -o wide --show-labels

二、更新Deployment
当前镜像为 1.16.0 ,更新为 1.16.1 ,有两种方式:
方式1:kubectl set image deployment/nginx-deployment nginx=nginx:1.16.1
方式2:kubectl edit deploy xxx 直接修改当前运行的yaml文件
2.1 通过具体的kubectl命令来更新deploy
kubectl set image deployment/nginx-deployment nginx=nginx:1.16.1
kubectl get all -o wide
kubectl describe deploy xxx
更换镜像之前,如下:
6c64d87c8c 这个老的replicaset 有三个replica pod
59777878f8 这个新的replicaset 有了一个replica pod
6c64d87c8c 这个老的replicaset 变成二个replica pod
59777878f8 这个新的replicaset 有了二个replica pod
6c64d87c8c 这个老的replicaset 变成一个replica pod
59777878f8 这个新的replicaset 有了三个replica pod
6c64d87c8c 这个老的replicaset 变成零个replica pod


2.2 通过修改当前运行的yaml文件来更新deploy
需求:nignx 从 1.16.2 变成 1.17
方式:kubectl edit deploy xxx 直接修改当前运行的yaml文件
kubectl get deploy nginx-deployment -o yaml
kubectl edit deploy nginx-deployment
kubectl get deploy nginx-deployment -o yaml


三、回滚Deployment
3.1 查看版本历史信息
如果说更新deployment是正向变动,那么回滚Deployment就是反向变动。
回滚/反向变动都有一个版本的概念,查看版本的命令如下:
# 查看版本历史
kubectl rollout history deployment/nginx-deployment
# 查看具体版本详细信息
kubectl rollout history deployment/nginx-deployment --revision=2

3.2 回滚到指定版本
回滚/反向变动的命令包括回滚到上一版本和回滚到指定版本,如下:
kubectl rollout undo deployment/nginx-deployment
kubectl rollout undo deployment/nginx-deployment --to-revision=1
# 回滚到上一版本
kubectl rollout undo deployment/nginx-deployment

# 回滚到指定版本
kubectl rollout undo deployment/nginx-deployment --to-revision=1


四、缩放Deployment
缩放包括手动缩放和自动缩放两种方式,命令如下:
手动缩放:kubectl scale deployment/nginx-deployment --replicas=10
自动缩放:kubectl autoscale deployment/nginx-deployment --min=10 --max=15 --cpu-percent=80
4.1 手动缩放
# 手动缩放
kubectl scale deployment/nginx-deployment --replicas=10
kubectl get all -o wide

4.2 自动缩放
# 自动缩放
kubectl autoscale deployment/nginx-deployment --min=10 --max=15 --cpu-percent=80
kubectl get all -o wide

五、暂停、恢复 Deployment 的上线过程
暂停:kubectl rollout pause deployment/nginx-deployment
恢复:kubectl rollout resume deployment/nginx-deployment
5.1 暂停deploy

处于暂停状态无法更新,如下:

kubectl set image deployment/nginx-deployment nginx=nginx:1.17
kubectl rollout history deployment/nginx-deployment
kubectl get rs
暂停 Deployment 上线之前的初始状态将继续发挥作用,但新的更新在 Deployment 上线被暂停期间不会产生任何效果。
5.2 恢复deploy
kubectl rollout resume deployment/nginx-deployment
kubectl get rs

六、Deployment 状态
6.1 进行中的Deployment
执行下面的任务期间,Kubernetes 标记 Deployment 为进行中(Progressing)_:
(1) Deployment 创建新的 ReplicaSet
(2) Deployment 正在为其最新的 ReplicaSet 扩容
(3) Deployment 正在为其旧有的 ReplicaSet(s) 缩容
(4) 新的 Pod 已经就绪或者可用(就绪至少持续了 MinReadySeconds 秒)。
当上线过程进入“Progressing”状态时,Deployment 控制器会向 Deployment 的 .status.conditions 中添加包含下面属性的状况条目:
type: Progressing
status: "True"
reason: NewReplicaSetCreated | reason: FoundNewReplicaSet | reason: ReplicaSetUpdated
你可以使用 kubectl rollout status 监视 Deployment 的进度。
6.2 成功的Deployment
当 Deployment 具有以下特征时,Kubernetes 将其标记为完成(Complete);
(1) 与 Deployment 关联的所有副本都已更新到指定的最新版本,这意味着之前请求的所有更新都已完成。
(2) 与 Deployment 关联的所有副本都可用。
(3) 未运行 Deployment 的旧副本。
当上线过程进入“Complete”状态时,Deployment 控制器会向 Deployment 的 .status.conditions 中添加包含下面属性的状况条目:
type: Progressing
status: "True"
reason: NewReplicaSetAvailable
这一 Progressing 状况的状态值会持续为 “True”,直至新的上线动作被触发。 即使副本的可用状态发生变化(进而影响 Available 状况),Progressing 状况的值也不会变化。
你可以使用 kubectl rollout status 检查 Deployment 是否已完成。 如果上线成功完成,kubectl rollout status 返回退出代码 0。
6.3 失败的Deployment
你的 Deployment 可能会在尝试部署其最新的 ReplicaSet 受挫,一直处于未完成状态。 造成此情况一些可能因素如下:
(1) 配额(Quota)不足
(2) 就绪探测(Readiness Probe)失败
(3) 镜像拉取错误
(4) 权限不足
(5) 限制范围(Limit Ranges)问题
(6) 应用程序运行时的配置错误
检测此状况的一种方法是在 Deployment 规约中指定截止时间参数: (.spec.progressDeadlineSeconds)。 .spec.progressDeadlineSeconds 给出的是一个秒数值,Deployment 控制器在(通过 Deployment 状态) 标示 Deployment 进展停滞之前,需要等待所给的时长。


总结
创建deployment并查看deploy、查看rs、查看pod
更新deployment:要么通过kubectl命令、要么通过edit deploy xxx来更新
回滚deployment:学会查看版本历史信息的两条命令,学会回滚到指定版本
缩放deployment:手动缩放+自动缩放
暂停deployment+恢复deployment
deployment的状态
天天打码,天天进步!!
Kubernetes_Deployment全解析(无状态的Pod)的更多相关文章
- Oracle AWR报告指标全解析-11011552
1-5 Top 5 Timed EventsWaits : 该等待事件发生的次数, 对于DB CPU此项不可用Times : 该等待事件消耗的总计时间,单位为秒, 对于DB CPU 而言是前台进程所消 ...
- Java7/8 中的 HashMap 和 ConcurrentHashMap 全解析
Java7/8 中的 HashMap 和 ConcurrentHashMap 全解析 今天发一篇”水文”,可能很多读者都会表示不理解,不过我想把它作为并发序列文章中不可缺少的一块来介绍.本来以为花不了 ...
- oracle提高查询效率的34个方面全解析
oracle提高查询效率的34个方面全解析 在一个数据库中进行操作的时候,效率是很重要的,那么,如何提高oracle的查询效率呢?笔者将从以下几个方面进行详细解析: 1.选择最有效率的表名顺序(只 ...
- JWT+Interceptor实现无状态登录和鉴权
无状态登录原理 先提一下啥是有状态登录 单台tomcat的情况下:编码的流程如下 前端提交表单里用户的输入的账号密码 后台接受,查数据库, 在数据库中找到用户的信息后,把用户的信息存放到session ...
- Java 最常见 200+ 面试题答案全解析-面试必备
本文分为十九个模块,分别是: Java 基础.容器.多线程.反射.对象拷贝.Java Web .异常.网络.设计模式.Spring/Spring MVC.Spring Boot/Spring Clou ...
- Java生鲜电商平台-电商订单系统全解析
Java生鲜电商平台-电商订单系统全解析 说明:Java生鲜电商平台-电商订单系统全解析主要讲解OMS的内容,设计,开发,架构等知识. 今天分享将会分为以下三个环节来阐述: 1.订单系统的介绍 2.订 ...
- Java 最常见 200+ 面试题全解析:面试必备
本文分为十九个模块,分别是: Java 基础.容器.多线程.反射.对象拷贝.Java Web .异常.网络.设计模式.Spring/Spring MVC.Spring Boot/Spring Clou ...
- K8s无状态控制器原理介绍
Pod控制器: ReplicationController:早期K8s只有这一个控制器,但后来发现让这一个来完成所有任务,太复杂.因此被废弃. ReplicaSet: 它用于帮助用户创建指定数量的Po ...
- Java 最常见 200+ 面试题 + 全解析
本文分为十九个模块,分别是: Java 基础.容器.多线程.反射.对象拷贝.Java Web .异常.网络.设计模式.Spring/Spring MVC.Spring Boot/Spring Clou ...
- Java并发原理层面:ReentrantLock中lock()、unlock()全解析
一.前言 Java线程同步两种方式,synchronized关键字和Lock锁机制,其中,AQS队列就是Lock锁实现公平加锁的底层支持. 二.AQS源码对于lock.lock()的实现 2.1 AQ ...
随机推荐
- C# Parallel类For循环与普通For循环耗时性能比较
1 static void Main(string[] args) 2 { 3 var dt = DateTime.Now; 4 var rand = new Random(DateTime.Now. ...
- docker-compose部署elastiflow
docker-compose导入导出命令 涉及的命令有export.import.save.load save 命令 docker save [options] images [images...] ...
- JAVA中方法的调用主要有以下几种
JAVA中方法的调用主要有以下几种: 1.非静态方法 非静态方法就是没有 static 修饰的方法,对于非静态方法的调用,是通过对 象来调用的,表现形式如下. 对象名.方法() eg: public ...
- C#:winform窗体 实现类似QQ的窗体在桌面边缘停靠和隐藏
设计思路:1.使用定时器(Timer)来监控鼠标位置和窗体位置,并实现窗体的停靠和隐藏2.当鼠标拖动窗体时,窗体才有可能根据自身位置决定是否停靠3.如果窗体四周没有接触到屏幕边缘则不会停靠4.如果窗体 ...
- Windows Admin Center无法访问
近日,有一台安装了Windows Admin Center的服务器无法访问了.遇到错误ERR_HTTP2_INADEQUATE_TRANSPORT_SECURITY.本以为这是更新了Chromium内 ...
- Python数据科学手册-机器学习之特征工程
特征工程常见示例: 分类数据.文本.图像. 还有提高模型复杂度的 衍生特征 和 处理 缺失数据的填充 方法.这个过程被叫做向量化.把任意格式的数据 转换成具有良好特性的向量形式. 分类特征 比如房屋数 ...
- Kubernetes 存储卷详解
转载自:https://mp.weixin.qq.com/s/Ywx3ju6FP0IShOgI757XYA Volumes 默认情况下容器中的磁盘文件是非持久化的,对于运行在容器中的应用来说面临两个问 ...
- 【前端必会】让ESLint与Prettier一起玩耍
背景 上回说到ESlint和Prettier可能会有规则上的冲突,解决的办法有多种,好比不用Prettier 不用Prettier也是一种选择 配置相同的规则 我们选择一种可以共存的方式 可以参考这篇 ...
- 适合生产制造企业用的ERP系统有哪些?
什么叫适合?匹配很重要!同是生产制造企业,规模不同.行业不同.发展阶段不同.生产模式不同.管理理念不同,适用的ERP自然也不同.不同规模的企业选用不同的系统,如过你是大型企业,业务管理都比较标准规范, ...
- [题解] Atcoder AGC 005 F Many Easy Problems NTT,组合数学
题目 观察当k固定时答案是什么.先假设每个节点对答案的贡献都是\(\binom{n}{k}\),然后再减掉某个点没有贡献的选点方案数.对于一个节点i,它没有贡献的方案数显然就是所有k个节点都选在i连出 ...