Deployment控制器通常用来部署无状态的应用,这样可以在任意的节点上扩容或者删除,而不用考虑数据的问题,它可以管理pod对象。

一、多副本

1.使用命令行方式创建Deployment

在dev名称空间下创建3个副本的nginx pod

kubectl create deployment nginx --image=nginx --replicas=3 -n dev

监控创建进度

kubectl get deploy -n dev -w

可以看到副本可用数量从0变到3

2.查看Deployment的描述

kubectl describe deploy nginx -n dev

可以看到NewReplicaSet的名称为nginx-6799fc88d8

3.查看Deployment管理的pod

kubectl get pod -n dev -owide --show-labels

可以看到Name列是ReplicaSet的名称加上一串6位的随机字符串,每个pod都有自己独立的IP。由于只有2台worker节点,其中2个pod被调度到了同一台节点worker02,另一个pod被调度到了worker01。

4.删除Deployment

kubectl delete deploy nginx -n dev

删除Deployment,会把其管理的pod一起删除

5.使用yaml文件创建Deployment

(1)新建dp-nginx.yaml文件,并输入以下内容

apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx
name: nginx
namespace: dev
spec:
replicas: 3
selector:
# Deployment会匹配与这里设置的相同标签内容的pod
matchLabels:
app: nginx
# pod的模板描述
template:
metadata:
#定义pod的标签
labels:
app: nginx
spec:
containers:
- image: nginx
name: nginx

(2)创建Deployment对象

kubectl apply -f dp-nginx.yaml

查看创建的结果

二、扩缩容

1.通过命令行扩容

先通过命令自动监听pod的变化

kubectl get pod -n dev -owide -w

再开启一个新的bash会话,通过以下命令扩容(增加副本数量:由3个变成5个)

kubectl scale --replicas=5 deploy/nginx -n dev

在监听bash窗口可以看到扩容过程

2.通过命令行缩容

先通过命令自动监听pod的变化

kubectl get pod -n dev -owide -w

再开启一个新的bash会话,通过命令缩容(减少副本数量:由5个变成2个)

kubectl scale --replicas=2 deploy/nginx -n dev

在监听bash窗口可以看到缩容过程

3.通过yaml文件扩缩容

kubectl edit deployment nginx -n dev

定位到replicase参数所在行,然后修改它的值

三、自愈&故障转移

1.自愈

手动删除某个pod,或者某个pod异常挂掉,k8s会自动创建一个新的pod。

先通过命令自动监听pod的变化

kubectl get pod -n dev -owide -w

再开启一个新的bash会话,手动删除一个pod

kubectl scale --replicas=2 deploy/nginx -n dev

在监听bash窗口可以看到创建过程

2.故障转移

对worker02关机,k8s需要5分钟(可配置)才能感知从而启动自愈功能。

通过命令自动监听pod的变化

kubectl get pod -n dev -owide -w

大概等了5分钟左右的时间,可以看到worker01上启动了2个新的pod。

这个时候如果重新启动worker02,部署在它上面的2个旧pod会立马删除。

四、滚动更新

1.更改镜像版本

把nginx的镜像版本改为1.20

kubectl edit deploy nginx -n dev
# image: nginx:1.20

查看滚动更新状态

kubectl rollout status deploy nginx -n dev

监听pod的创建过程

kubectl get pod -n dev -owide -w

查看新创建的pod描述,确实更新成了新的镜像版本

2.回滚

(1)查看更新历史记录

kubectl rollout history deploy nginx -n dev

(2)查看某个指定版本的历史记录详情

kubectl rollout history deploy nginx -n dev --revision=2

(3)回滚到上次的版本

kubectl rollout undo deploy nginx -n dev

回滚完成之后,查看新pod的描述,发现nginx镜像的版本是最新的

(4)回滚到指定的版本

kubectl rollout undo deploy nginx -n dev --to-revision=2

五、总结

类似 Deployment 这样的一个控制器,实际上都是由上半部分的控制器定义(包括期望状态),加上下半部分的被控制对象的模板组成的

k8s入门之Deployment(五)的更多相关文章

  1. K8s 入门

    中文文档:https://www.kubernetes.org.cn/kubernetes%E8%AE%BE%E8%AE%A1%E6%9E%B6%E6%9E%84 小结大白话 Portainer 挺好 ...

  2. 反手来个K8S入门到跑路

    layout: post title: 反手来个K8S入门到跑路 category: linux date: 2019-06-09 tags: linux k8s 反手来个K8S入门到跑路 前言 放假 ...

  3. k8s入门你至少需要会哪些

    body { margin: 0; overflow: auto; font: normal 14px Verdana; background: rgba(255, 255, 255, 1); pad ...

  4. WCF入门教程(五)配置文件

    WCF入门教程(五)配置文件 服务协定以及实现写好后,需要将相关服务公布出去,就需要HOST来承载,供客户端来调用. 承载服务有两种方式,一种通过配置文件,一种通过代码进行配置.上一章已经介绍了代码方 ...

  5. k8s入门系列之guestbook快速部署

    k8s集群以及一些扩展插件已经安装完毕,本篇文章介绍一下如何在k8s集群上快速部署guestbook应用. •实验环境为集群:master(1)+node(4),详细内容参考<k8s入门系列之集 ...

  6. Docker入门教程(五)Docker安全

    Docker入门教程(五)Docker安全 [编者的话]DockOne组织翻译了Flux7的Docker入门教程,本文是系列入门教程的第五篇,介绍了Docker的安全问题,依然是老话重谈,入门者可以通 ...

  7. 无废话ExtJs 入门教程十五[员工信息表Demo:AddUser]

    无废话ExtJs 入门教程十五[员工信息表Demo:AddUser] extjs技术交流,欢迎加群(201926085) 前面我们共介绍过10种表单组件,这些组件是我们在开发过程中最经常用到的,所以一 ...

  8. k8s入门系列之扩展组件(一)DNS安装篇

    DNS (domain name system),提供域名解析服务,解决了难于记忆的IP地址问题,以更人性可读可记忆可标识的方式映射对应IP地址. Cluster DNS扩展插件用于支持k8s集群系统 ...

  9. k8s入门系列之集群安装篇

    关于kubernetes组件的详解介绍,请阅读上一篇文章<k8s入门系列之介绍篇> Kubernetes集群安装部署 •Kubernetes集群组件: - etcd 一个高可用的K/V键值 ...

随机推荐

  1. close()和flush()的区别

    对于字符流,一般写入的时候想要马上看到一般需要flush()面试题:close()和flush()的区别?A:close()关闭流对象,但是先刷新一次缓冲区,关闭之后,流对象不可以继续再使用了.B:f ...

  2. li 与 li 之间有空白间隔是什么原因引起的,有什么解决办法

    li 与 li 之间有空白间隔是什么原因引起的,有什么解决办法 原因 浏览器会把inline元素间的空白字符(空格.换行.Tab等)渲染成一个空格.而为了美观,我们通常是一个 放在一行,这导致 换行后 ...

  3. Java Arrays.asList(0,1,2,3,4,5,6,7,8,9).parallelStream().forEach 进行循环获取HttpServletRequest的为Null的解决方案

    Arrays.asList(0,1,2,3,4,5,6,7,8,9).parallelStream().forEach() parallelStream是并行执行流的每个元素,也就是多线程执行,这样就 ...

  4. 在 Java 中 CycliBarriar 和 CountdownLatch 有什么区别?

    CyclicBarrier 可以重复使用,而 CountdownLatch 不能重复使用. Java 的 concurrent 包里面的 CountDownLatch 其实可以把它看作一个计数器, 只 ...

  5. 在 Spring中如何注入一个java集合?

    Spring提供以下几种集合的配置元素: 类型用于注入一列值,允许有相同的值. 类型用于注入一组值,不允许有相同的值. 类型用于注入一组键值对,键和值都可以为任意类型. 类型用于注入一组键值对,键和值 ...

  6. 为什么说 Mybatis 是半自动 ORM 映射工具?它与全自动 的区别在哪里?

    Hibernate 属于全自动 ORM 映射工具,使用 Hibernate 查询关联对象或者关联 集合对象时,可以根据对象关系模型直接获取,所以它是全自动的.而 Mybatis 在查询关联对象或关联集 ...

  7. (stm32f103学习总结)—USART串口通信

    一. USART简介 USART即通用同步异步收发器,它能够灵活地与外部设备进行全双工 数据交换,满足外部设备对工业标准 NRZ 异步串行数据格式的要求. UART即通用异步收发器,它是在USART基 ...

  8. DIV 上下左右居中黑科技

    <style> #info{height:0px; width:0px;top:50%; left:50%;position:absolute;} #center{background:# ...

  9. 破解浏览器同源政策利器之JSONP

    本文是在了解了浏览器的同源规则之后,学习了破解这个规则的一个简单有效的方法->JSONP.主要通过阮一峰老师的博客学习 浏览器的同源规则 有这样一个背景,如果你通过银行的网站进行的取钱的交易,而 ...

  10. 人机交互大作业--flash嵌入web(纯界面)

    界面: 源代码:最近较忙,后续会上传至github