Kubernetes Deployment
什么是Deployment?
Deployment提供了运行Pod能力,并且为Pod提供滚动升级、伸缩、副本等功能,一般用于运行无状态的应用。目前建议使用Deployment来代替RelicaSet及ReplicationController的使用。
什么是无状态应用?
无状态应用是不将数据或应用程序状态存储到容器中,这将使无状态应用程序更具可伸缩性。例如前端应用是无状态的,可以部署多个副本以提高其可用性并在需求低时进行缩减,并且这些副本不需要唯一的标识。
Deployment操作
创建Deployment
kubectl create deployment nginx-deployment --image=nginx:1.16
通过yaml文件操作
kubectl apply -f nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-deploymentlabels:app: nginx
spec:selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:1.16
查看Deployment列表
kubectl get deployment
查看Deployment描述信息
kubectl describe deployment
Deployment 手动伸缩Pod数量
方式1. 通过kubectl set image
kubectl scale deployment nginx-deployment --replicas 5
方式2. 通过YAML资源定义清单
kubectl apply -f nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-deploymentlabels:app: nginx
spec:replicas: 5selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:1.16
Deployment 自动伸缩Pod数量 (Horizontal Pod Autoscaler)
HPA基于观察到的CPU利用率或借助自定义指标自动缩放 ReplicaSet、Deployment中的Pod数量 。控制器会定期调整复制控制器或部署中副本的数量,以使观察到的平均CPU利用率与用户指定的目标相匹配。
方式1. 通过autoscale
kubectl autoscale deployment nginx-deployment --min=5 --max=10 --cpu-percent=80
方式2. 通过yaml文件
kubectl apply -f hpa-demo.yaml
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:name: nginx-deployment
spec:scaleTargetRef:apiVersion: apps/v1beta1kind: Deploymentname: nginx-deploymentminReplicas: 5maxReplicas: 10targetCPUUtilizationPercentage: 80
查看HPA列表
kubectl get hpa
查看HPA描述信息
kubectl describe hpa nginx-deployment
Deployment 版本管理
通过更改部署的Pod模板规范来更新Deployment中Pod镜像。触发更新时Deployment会停止Pod及逐渐将Pod的数量缩减为零,然后使用Pod模板来调出新的Pod。
方式1. 通过kubectl set image
kubectl set image deployment/nginx-deployment nginx=nginx:1.17
方式2. 通过yaml文件
kubectl apply -f deployment-demo.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-deploymentlabels:app: nginx
spec:replicas: 5selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:1.17
通过.spec.revisionHistoryLimit
字段,可指定为该 Deployment 保留多少个旧的 ReplicaSet。
默认为10,当为0时,将无法对Deployment进行回滚操作。
查看历史版本,在这里版本1的是nginx:1.16,版本2是nginx:1.17
kubectl rollout history deployment/nginx-deployment
回滚版本到版本1
kubectl rollout undo deployment/nginx-deployment
查看更新状态
kubectl rollout status deployment/nginx-deployment
暂停更新
kubectl rollout pause deployment/nginx-deployment
恢复更新
kubectl rollout resume deployment/nginx-deployment
部署策略
在Kubernetes中,针对于不同的应用场景推出了不同的发布策略,选择合适的策略将会使业务在发布过程中更加稳定。
Recreate: (重建)
停止旧版本服务后部署新版本
优点: 容易配置,服务一次性更新。
缺点: 部署时间长,取决于旧版本的停止时间及新版本的部署时间。
通过Deployment YAML配置清单定义
spec:replicas: 3strategy:type: Recreate
RollingUpdate: (滚动)
旧版本到新版本的逐步替换的策略
优点: 容易配置,不用停机,处理状态平衡的服务方便。
缺点: 需要一定的时间去完成部署、回滚,无法控制流量。
通过Deployment YAML配置清单定义
spec:strategy: type: RollingUpdate #指定滚动更新rollingUpdate: maxSurge: 25% #超过期望的Pod数量maxUnavailable: 25% #不可用Pod最大数量
.spec.strategy.rollingUpdate.minReadySeconds:
设置升级前等待时间,防止容器启动后造成无法提供服务
.spec.strategy.rollingUpdate.maxSurge:
设置升级过程中最多可以比定义的Pod多出的数量
.spec.strategy.rollingUpdate.maxUnavaible:
设置升级过程中最多有多少个Pod处于不可用状态
定义滚动升级的策略,如果maxUnavaible用默认值1,实际没起到升级失败后对旧Pod的保护。如果新的Pod启动失败,依然把旧的正常Pod Kill掉了,这不符合我们的预期。改成百分比后,若新Pod启动失败,则升级过程会被Block住,旧的正常Pod还是处于Running状态。
Blue/Green: (蓝绿)
保持旧版本,发布新版本,然后将流量从旧版本切换到新版本
优点: 即时部署、回滚,服务一次性更新。
缺点: 由于新旧版本同时存在需要2倍的资源,无法处理有状态应用。
通过Service YAML配置清单定义
labels:app: nginxversion: v1.0.0labels:app: nginxversion: v2.0.0
Canary: (金丝雀)
切换一部分用户到新版本,然后在将全部流量切换到新版本
优点: 快速回滚,如果出问题情况下影响最小
缺点: 需要一定的时间去完成部署、回滚
通过Deployment YAML配置清单定义,调整不同ReplicaSet的副本数
spec: # Version v1.0.0replicas: 90spec: # Version v2.0.0replicas: 10
或者可以通过Istio Route YAML配置清单定义
route:
- tags:version: v1.0.0weight: 90
- tags:version: v2.0.0weight: 10
A/B testing: (A/B测试)
根据不同的条件将流量切换到新版本,例如Cookie、地址位置、语言等
优点: 多版本同时运行,可控制流量
缺点: 需要负载均衡器根据条件去调度流量,需要分布式跟踪去解决会话错误问题
通过Istio Route YAML配置清单定义
kind: RouteRule
metadata: name: nginx-v1.0.0spec: destination: name: nginxroute: - labels: version: v1.0.0 match: request: headers: x-api-version: exact: "v1.0.0"kind: RouteRule
metadata: name: nginx-v2.0.0spec: destination: name: nginxroute: - labels: version: v2.0.0 match: request: headers: x-api-version: exact: "v2.0.0"
Shadow: (影子)
传入旧版本的请求流量镜像到新版本,响应流量将会被丢弃,当满足稳定性的测试时将会切换流量至新版本。
优点: 可以使用生产的流量对新版本进行测试而对用户没有影响
缺点: 由于新旧版本同时存在需要2倍的资源,配置复杂,可能需要模拟服务提供消相应
通过Istio VirtualSerivce YAML配置清单定义
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:name: nginx-vslabels:app: nginx
spec:hosts:- nginx.localgateways:- nginxhttp:- route:- destination:host: nginx-v1.0.0mirror:host: nginx-v2.0.0
一般在充足的测试下通常使用滚动或者蓝绿方案,蓝绿及阴影的方案对资源要求。如果缺乏测试或者信心可以使用金丝雀、A/B测试、影子方案。如果测试特定的维度可以使用A/B测试方案。如果使用到影子方案则需要额外的服务模拟流量,以及防止对数据的重复生产,但用在测试性能时很有用。
Deployment状态管理
与Pod一样,Deployment的声明周期不是一直处于同一个状态不变的,在操作ReplicaSet时状态会随之改变。
Progressing:
Deployment正在创建新的ReplicaSet、正在扩容、缩容已有的ReplicaSet。Available:
Deployment的可用副本数已经达到期望定义的策略,ReplicaSet中的版本已经更新完成。Failed:
Deployment配置了无效的引用、错误的探针、无法拉取镜像、权限不足等。
通过kubectl查看Deployment状态情况,Conditions段
kubectl describe deployment
kubectl get deployment -o yaml
使用技巧
在业务情况允许下,尽量将容器设置成无状态化的方式运行,这样对于环境等要求是最小的。而且容器设置采用最小化功能的原则,一个Pod内可以包含多个容器负责不同的功能。
Kubernetes Deployment相关推荐
- WHAT THE DATA SAYS ABOUT KUBERNETES DEPLOYMENT PATTERNS
2019独角兽企业重金招聘Python工程师标准>>> WHAT THE DATA SAYS ABOUT KUBERNETES DEPLOYMENT PATTERNS The con ...
- 容器编排技术 -- Kubernetes Deployment
容器编排技术 -- Kubernetes Deployment 1 创建 Deployment 1.1 Pod-template-hash label 2 更新Deployment 2.1 Rollo ...
- kubernetes deployment,pod 实践
本文同步gitlab 更新 https://github.com/lifalin0802/falin_repos/blob/master/kubernetes_manual.md 创建自主pod ku ...
- 2021完整版:Kubernetes Deployment故障排除的可视化指南
原文发表于kubernetes中文社区,为作者原创翻译 更多kubernetes文章,请多关注kubernetes中文社区 文章目录 连接Deployment 和 Service 连接 Service ...
- Kubernetes Deployment控制器(二十)
前面我们学习了 ReplicaSet 控制器,了解到该控制器是用来维护集群中运行的 Pod 数量的,但是往往在实际操作的时候,我们反而不会去直接使用 RS,而是会使用更上层的控制器,比如我们今天要学习 ...
- Kubernetes Deployment与Replica Set
Deployment相对于RC的优势 RS与Deployment主要用于替代RC.RS的全称为Replica Set.相对于RC,RS与Deployment的优势如下: RC只支持基于等式的selec ...
- Kubernetes:全面了解 Deployment
本文为作者的 Kubernetes 系列电子书的一部分,电子书已经开源,欢迎关注,电子书浏览地址: https://k8s.whuanle.cn[适合国内访问] https://ek8s.whuanl ...
- 容器编排技术 -- Kubernetes 联邦 Deployment
容器编排技术 -- Kubernetes 联邦 Deployment 1 Before you begin 2 创建联邦 Deployment 2.1 在底层集群中分布副本 3 更新联邦 Deploy ...
- kubernetes1.4 基础篇:Learn Kubernetes 1.4 by 6 steps(3):Step 2. Using kubectl to Create a Deployment
在上一篇文章中我们学习到了如何快速搭k8s的集群.本文将会将会学到Kubernetes的应用部署(Deployment),以及如何使用kubectl来部署我们的应用.被部署的应用我们将直接使用kube ...
最新文章
- 移动应用开发—— 如何搭建开发大型的应用架构?
- TDD可以驱动设计吗?
- 组态王浏览器java_1工程浏览器是组态王的集成开发环境在这里可以
- zzuli oj 1167逆转数(指针专题)
- 人工智能突破!牛津大学的科学家用机器合成了“类人类思想”
- hadoop容灾能力测试
- HNOI模拟 Day3.22
- Maven parent.relativePath
- 【Flink】Flink 源码之Buffer Debloating
- java stream 使用局部变量
- 小米牵手宜家,成立亿元开发者基金,雷军不仅要当AIoT开拓者,还要当扛把子...
- SQL分页查询的写法总结-MySQL、SQL Server、Oracle
- 如何通过a链接实现图片下载
- python中列表的使用
- “拼多多和短视频极速版”,让我怎么吐槽你好呢!
- 前端面试技巧和注意事项_前端HR的面试套路,你懂几个?
- 梁权财到徐闻生态工业集聚区调研
- Java学习指南从入门到入土
- AI医学影像技术展望
- [历朝通俗演义-蔡东藩-前汉]第005回 信佞臣尽毁诗书 筑阿房大兴土木
热门文章
- 谷歌浏览器修复一键修复_谷歌:Chrome浏览器用户尽需快升级以修复漏洞!
- C语言——PTA 最大公约数和最小公倍数
- 【预训练视觉-语言模型文献阅读文献阅读】最新BERT模型——UNITER: UNiversal Image-TExt Representation Learning
- 小白最优化学习(四) 算法学习 不精确一维搜索方法
- 2021阿里云ecs云服务器年终钜惠:1核/2G/50G/1Mbps/65元/年,3年180元,续费3.5折
- 第四章-linux内核裁剪与移植
- DvaJS快速上手(3)
- 《什么是HTML5》
- win10 安装office 2016 plus 备忘
- 【网络硬件】6.什么是路由器?