Kubernetes - 4.4 Workload - Deployment
什么是Deployment?
Deployment提供了运行Pod能力,并且为Pod提供滚动升级、伸缩、副本等功能,一般用于运行无状态的应用。目前建议使用Deployment来代替RelicaSet及ReplicationController的使用。
什么是无状态应用?
无状态应用是不将数据或应用程序状态存储到容器中,这将使无状态应用程序更具可伸缩性。例如前端应用是无状态的,可以部署多个副本以提高其可用性并在需求低时进行缩减,并且这些副本不需要唯一的标识。
Deployment操作
创建Deploymentkubectl create deployment nginx-deployment --image=nginx:1.16
通过yaml文件操作kubectl apply -f nginx-deployment.yaml
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment labels: app: nginx spec: selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.16
查看Deployment列表kubectl get deployment
查看Deployment描述信息kubectl describe deployment
Deployment 手动伸缩Pod数量
方式1. 通过kubectl set imagekubectl scale deployment nginx-deployment --replicas 5
方式2. 通过kubectl applykubectl apply -f nginx-deployment.yaml
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment labels: app: nginx spec: replicas: 5 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.16
方式3. 通过kubectl editkubectl edit deployment/nginx-deployment
spec: replicas: 5
Deployment 自动伸缩Pod数量 (Horizontal Pod Autoscaler)
HPA基于观察到的CPU利用率或借助自定义指标自动缩放 ReplicaSet、Deployment中的Pod数量 。控制器会定期调整复制控制器或部署中副本的数量,以使观察到的平均CPU利用率与用户指定的目标相匹配。
方式1. 通过autoscalekubectl 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/v1beta1 kind: Deployment name: nginx-deployment minReplicas: 5 maxReplicas: 10 targetCPUUtilizationPercentage: 80
方式3. 通过kubectl editkubectl edit hpa nginx-deployment
spec: maxReplicas: 10 minReplicas: 5 scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: nginx-deployment targetCPUUtilizationPercentage: 80
查看HPA列表kubectl get hpa
查看HPA描述信息kubectl describe hpa nginx-deployment
Deployment 版本管理
通过更改部署的Pod模板规范来更新Deployment中Pod镜像。触发更新时Deployment会停止Pod及逐渐将Pod的数量缩减为零,然后使用Pod模板来调出新的Pod。
方式1. 通过kubectl set imagekubectl 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-deployment labels: app: nginx spec: replicas: 5 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.17
方式3. 通过kubectl editkubectl edit deployment/nginx-deployment
spec: containers: image: nginx:1.17
通过.spec.revisionHistoryLimit 字段,可指定为该 Deployment 保留多少个旧的 ReplicaSet。
默认为10,当为0时,将无法对Deployment进行回滚操作。
查看历史版本,在这里版本1的是nginx:1.16,版本2是nginx:1.17kubectl rollout history deployment/nginx-deployment
回滚版本到版本1kubectl 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: 3 strategy: 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: nginx version: v1.0.0 labels: app: nginx version: v2.0.0
Canary: (金丝雀)切换一部分用户到新版本,然后在将全部流量切换到新版本
优点: 快速回滚,如果出问题情况下影响最小
缺点: 需要一定的时间去完成部署、回滚
通过Deployment YAML配置清单定义,调整不同ReplicaSet的副本数
spec: # Version v1.0.0 replicas: 90 spec: # Version v2.0.0 replicas: 10
或者可以通过Istio Route YAML配置清单定义
route: - tags: version: v1.0.0 weight: 90 - tags: version: v2.0.0 weight: 10
A/B testing: (A/B测试) 根据不同的条件将流量切换到新版本,例如Cookie、地址位置、语言等
优点: 多版本同时运行,可控制流量
缺点: 需要负载均衡器根据条件去调度流量,需要分布式跟踪去解决会话错误问题
通过Istio Route YAML配置清单定义
kind: RouteRule metadata: name: nginx-v1.0.0 spec: destination: name: nginx route: - labels: version: v1.0.0 match: request: headers: x-api-version: exact: "v1.0.0" kind: RouteRule metadata: name: nginx-v2.0.0 spec: destination: name: nginx route: - 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-vs labels: app: nginx spec: hosts: - nginx.local gateways: - nginx http: - route: - destination: host: nginx-v1.0.0 mirror: 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内可以包含多个容器负责不同的功能。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Fabric 2.0区块链开发环境安装
本文介绍如何安装最新的Hyperledger Fabric 2.0的预编译程序、fabric-samples示例配置和代码以及docker镜像。 Hyperledger Fabric区块链开发教程: Fabric区块链Node.js开发详解 Fabric区块链Java开发详解 Fabric区块链Golang开发详解 1、安装预编译的Hyperledger Fabric 2.0应用程序 Hyperledger Fabric官方提供了以下2.0版本的预编译程序: configtxgen:用于生成Fabric创世区块初始或更新配置文件 configtxlator:用于编解码Fabric区块链配置文件 cryptogen:用于快速生成节点、用户、客户端等所需的证书和密钥文件 discover:用于Fabric网络的服务发现 idemixgen:很少用到 orderer:Fabric排序节点程序 peer:Fabric对等节点程序 fabric-ca-client:Fabric-CA服务程序的客户端,用于注册和添加用户 首先创建一个Hyperledger Fabric 2.0的专用目录,然后进入...
- 下一篇
阿里云服务器宽带值选择方法以及5M宽带分割点注意事项
阿里云ECS云服务器公网宽带选多少合适?云吞铺子来说说阿里云宽带的选择方法以及5M宽带分割点的注意事项: 阿里云服务器宽带选多少合适? 关于ECS云服务器公网宽带值大小选择多少?肯定是要根据用实际的应用场景来选择,在选择宽带之前,云吞铺子带大家计算下宽带对应的实际下载速度,如下表所示: 宽带兆数 实际下载速度峰值 1M宽带 128KB/秒 2M宽带 2*128=256KB/秒 3M宽带 3*128=384KB/秒 4M宽带 4*128=512KB/秒 5M宽带 5*128=640KB/秒 6M宽带 6*128=768KB/秒 7M宽带 7*128=896KB/秒 8M宽带 8*128=1024KB/S=1M/秒 9M宽带 9*128=1152KB/秒=1.125M/秒 10M宽带 10*128=1280KB/秒=1.25M/秒 20M宽带 20*128=2560KB/秒=2.5M/秒 50兆宽带 50*128=6400KB/秒=6.25M/秒 100兆宽带 100*128=12800KB/秒=12.5M/秒 200兆宽带 200*128=25600KB/秒=25M/秒 N兆宽带 N*1...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- Mario游戏-低调大师作品
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Red5直播服务器,属于Java语言的直播服务器
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS8编译安装MySQL8.0.19
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS6,CentOS7官方镜像安装Oracle11G
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装