前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >「走进k8s」Kubernetes1.15.1的Deployment 的使用(22)

「走进k8s」Kubernetes1.15.1的Deployment 的使用(22)

作者头像
IT架构圈
发布2019-08-21 15:35:47
9920
发布2019-08-21 15:35:47
举报
文章被收录于专栏:IT架构圈IT架构圈

上次学了rc和rs两种资源对象,两者的命令基本一致,但是本质的区别是rs支持集合的selector。rc和rs来控制pod副本的数量,也实现了滚动升级,了解了滚动升级的好处,基本都够用了,但是kubernetes推荐使用deployment的控制器。来一起了解下为什么。

(一)Deployment
  • ①具备和rc一样的特征

1.确保pod数量

它会确保Kubernetes中有指定数量的Pod在运行。如果少于指定数量的pod,Replication Controller会创建新的,反之则会删除掉多余的以保证Pod数量不变。

2.确保pod健康

当pod不健康,运行出错或者无法提供服务时,Replication Controller也会杀死不健康的pod,重新创建新的。

3.弹性伸缩

在业务高峰或者低峰期的时候,可以通过Replication Controller动态的调整pod的数量来提高资源的利用率。同时,配置相应的监控功能(Hroizontal Pod Autoscaler),会定时自动从监控平台获取Replication Controller关联pod的整体资源使用情况,做到自动伸缩。

4.滚动升级

滚动升级为一种平滑的升级方式,通过逐步替换的策略,保证整体系统的稳定,在初始化升级的时候就可以及时发现和解决问题,避免问题不断扩大。

  • ② 独有的特征
  1. 事件和状态查看

可以查看Deployment的升级详细进度和状态。

  1. 回滚

当升级pod镜像或者相关参数的时候发现问题,可以使用回滚操作回滚到上一个稳定的版本或者指定的版本。

3.版本记录

每一次对Deployment的操作,都能保存下来,给予后续可能的回滚使用。

  1. 暂停和启动

对于每一次升级,都能够随时暂停和启动。

多种升级方案:Recreate:删除所有已存在的pod,重新创建新的; RollingUpdate:滚动升级,逐步替换的策略,同时滚动升级时,支持更多的附加参数,例如设置最大不可用pod数量,最小升级间隔时间等等。

  • ③ 官方API介绍

https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.15/#deployment-v1-apps

  • ④ 演示yaml
代码语言:javascript
复制
apiVersion: apps/v1beta2 # for kubectl versions >= 1.9.0 use apps/v1
kind: Deployment
metadata:
  name: hello-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-deployment
  template:
    metadata:
      labels:
        app: my-deployment
    spec:
      containers:
      - name: my-pod
        image: nginx
        ports:
        - containerPort: 3000

执行生成deploy.yaml

代码语言:javascript
复制
kubectl apply -f deploy.yaml
kubectl get deployment
kubectl get rs
kubectl get pod

查看详细的描述信息的pod

代码语言:javascript
复制
kubectl get pods --show-labels
  • ⑤ 增加滚动升级
代码语言:javascript
复制
apiVersion: apps/v1beta2 # for kubectl versions >= 1.9.0 use apps/v1
kind: Deployment
metadata:
  name: hello-deployment
spec:
  minReadySeconds: 5
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 1
  selector:
    matchLabels:
      app: my-deployment
  template:
    metadata:
      labels:
        app: my-deployment
    spec:
      containers:
      - name: my-pod
        image: nginx
        ports:
        - containerPort: 3000

minReadySeconds

在等待设置的时间后才进行升级 如果没有设置该值,会假设该容器启动起来后就提供服务了,在某些极端情况下可能会造成服务不正常运行。

maxSurge

升级过程中最多可以比原先设置多出的POD数量 例如:maxSurage=1,replicas=5,会先启动1一个新的Pod后才删掉一个旧的POD,整个升级过程中最多会有5+1个POD。

maxUnavaible

升级过程中最多有多少个POD处于无法提供服务的状态 当maxSurge不为0时,该值也不能为0 例如:maxUnavaible=1,则表示整个升级过程中最多会有1个POD处于无法服务的状态。

代码语言:javascript
复制
kubectl apply -f deploy.yaml
kubectl rollout status deployment hello-deployment
  • ⑥ rollout命令

查看状态

代码语言:javascript
复制
kubectl rollout status deployment <deployment>

暂停升级

代码语言:javascript
复制
kubectl rollout pause deployment <deployment>

继续升级

代码语言:javascript
复制
kubectl rollout resume deployment <deployment>

查看rs的状态

代码语言:javascript
复制
kubectl get rs

升级历史

代码语言:javascript
复制
# kubectl rollout history deployment <deployment>

kubectl rollout history deployment hello-deployment

查看升级的全部信息

代码语言:javascript
复制
kubectl describe deployment hello-deployment

回滚版本

代码语言:javascript
复制
kubectl get rs
#  启动hello-deployment-5d5644bccf, 不启动hello-deployment-6678664459
kubectl rollout undo deployment hello-deployment
kubectl rollout status deployment  hello-deployment
kubectl get rs
#  启动hello-deployment-6678664459,不启动hello-deployment-5d5644bccf

添加change-cause,命令行中添加 --record=true

代码语言:javascript
复制
kubectl rollout history deployment  hello-deployment
kubectl apply -f deloy.yaml --record=true

rs 跟rollout 是对应的,如果rs删除了,rollout 也就看不到了

代码语言:javascript
复制
kubectl get rs
kubectl delete rs hello-deployment-5d5644bccf 
kubectl rollout history deployment hello-deployment
kubectl get rs

指定版本,不在是回到上个版本 --to-revision

代码语言:javascript
复制
kubectl rollout history deployment hello-deployment
kubectl rollout undo deployment hello-deployment --to-revision=4
kubectl rollout status deployment hello-deployment
kubectl get rs
kubectl rollout history deployment hello-deployment

PS:deployment 这个回滚版本功能很重要,CICD的思路完全是一致的,不需要考虑备份的功能。还可以查询历史记录,回滚指定版本。所以有了deployment ,谁还用cs啊!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-08-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 编程坑太多 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • (一)Deployment
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档