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 ...
随机推荐
- 【设计模式】Java设计模式 - 观察者模式
[设计模式]Java设计模式 - 观察者模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 @一个有梦有戏的人 @怒放吧德德 分享学习心得,欢迎指正,大家一起学习成长 ...
- 通过ftutilx 插件实现流版式文件全文检索
Oracle 支持流版式文件的全文检索,而原生的PostgreSQL是不支持流版式文件全文检索的.KingbaseES 通过ftutilx 插件将流版式文件转换成文本文件,从而支持流版式文件全文检索. ...
- 【读书笔记】C#高级编程 第五章 泛型
(一)泛型概述 泛型不仅是C#编程语言的一部分,而且与程序集中的IL代码紧密地集成.泛型不仅是C#语言的一种结构,而且是CLR定义的.有了泛型就可以创建独立于被包含类型的类和方法了. 1.性能 泛型的 ...
- .Net之接口小知识
目的 通过一个简单的项目,在原来的文章基础上完善一下常用的几种WebApi编写方式以及请求方式,一方面是用于给我一个前端朋友用来学习调用接口,另一方面让我测试HttpClient的一些效果. 本文示例 ...
- 后端程序员实现一个IP归属地的小程序
在日常开发中,后端主要提供数据以及处理业务逻辑,前端主要提供页面布局以及数据展示.后端程序员对于页面布局接触比较少,但是小程序有完善的文档说明.页面布局也相对简单,实现起来相对简单一些.而且小程序相对 ...
- 继GitHub的Copilot收费后,亚马逊推出了 CodeWhisperer,感觉不错哟!
Copilot 是 Github 推出的一款人工智能编程助手,推出仅一年就受到大量开发者的追捧(据官方统计有 120 万用户).然而,自 2022 年 6 月起,它改为了付费订阅模式(每月 10 美元 ...
- Java SE 四大内部类
内部类 1.成员内部类 调用成员内部类 //在外面的类的最后,写一个方法,调用成员内部类(创建对象,在访问) class Outer08{ class Inner08{ //成员内部类 public ...
- 使用Gitlab CI/CD功能在本地部署 Spring Boot 项目
前提条件: 1.Docker安装Gitlab,地址:https://www.cnblogs.com/sanduzxcvbnm/p/13814730.html 2.Docker安装Gitlab-runn ...
- 第二章:视图层 - 1:URL路由基础
路由的编写方式是Django2.0和1.11最大的区别所在.Django官方迫于压力和同行的影响,不得不将原来的正则匹配表达式,改为更加简单的path表达式,但依然通过re_path()方法保持对1. ...
- suse 安装mysql5.7
1.上传包到home目录下 2.安装 1,解压下载的文件: tar -xvf mysql-5.7.29-1.sles12.x86_64.rpm-bundle.tar 解压后: 3.安装libatomi ...