k8s入门实战deployment使用详解

目录
  • 介绍
  • 自愈能力
  • 多副本
  • 扩缩容
  • 故障转移
  • 滚动更新
  • 版本回退
  • 其他

介绍

假设现在我们写了一个订单服务,由于访问量很高 只部署一台肯定不够,我希望k8s帮我启动好几个pod, 我们用kubectl run可能得运行100次,

基于deployment,你可以告诉k8s副本数量,k8s就会自动帮你完成,其实不止是副本数量,一旦你的pod被deployment管理,deployment将会赋予它更多的能力,比如自愈,扩缩容,滚动更新等

自愈能力

我们使用原来的方式创建一个pod

kubectl run mynginx --image=nginx

使用deployment方式创建一个pod

kubectl create deployment mytomcat --image=tomcat:8.5.68

当我们删除使用kubectl run方式创建的pod时,发现一删就真的删掉了

[root@k8s-master ~]# kubectl get pod
NAME                                      READY   STATUS    RESTARTS   AGE
mynginx                                   1/1     Running   0          112s
mytomcat-6f5f895f4f-7jqlr                 1/1     Running   0          47s
nfs-client-provisioner-6c8cdddb58-kh555   1/1     Running   8          7d
[root@k8s-master ~]#
[root@k8s-master ~]#
[root@k8s-master ~]# kubectl delete pod mynginx
pod "mynginx" deleted
[root@k8s-master ~]# kubectl get pod
NAME                                      READY   STATUS    RESTARTS   AGE
mytomcat-6f5f895f4f-7jqlr                 1/1     Running   0          2m4s
nfs-client-provisioner-6c8cdddb58-kh555   1/1     Running   8          7d

当我们删deployment创建的pod时,发现他又会自动帮我们创建一个

[root@k8s-master ~]# kubectl delete pod mytomcat-6f5f895f4f-7jqlr
pod "mytomcat-6f5f895f4f-7jqlr" deleted
[root@k8s-master ~]# kubectl get pod
NAME                                      READY   STATUS    RESTARTS   AGE
mytomcat-6f5f895f4f-s4zr7                 1/1     Running   0          15s
nfs-client-provisioner-6c8cdddb58-kh555   1/1     Running   8          7d

这个删除可以当成是你node节点宕机的情况,我们把这个称为k8s的自愈能力

这时候你又确实想删除怎么办,我们先试用下面命令查出deployment

[root@k8s-master ~]# kubectl get deploy
NAME                     READY   UP-TO-DATE   AVAILABLE   AGE
mytomcat                 1/1     1            1           13m
nfs-client-provisioner   1/1     1            1           7d

使用删除deployment命令

[root@k8s-master ~]# kubectl delete deploy mytomcat deployment.apps "mytomcat" deleted

这时候再查看就没有了

[root@k8s-master ~]# kubectl get pod
NAME                                      READY   STATUS    RESTARTS   AGE
nfs-client-provisioner-6c8cdddb58-kh555   1/1     Running   8          7d

多副本

假设现在业务量上来,我们需要同时针对一个服务部署多个实例,可以使用--replicas,比如我们使用下面3个命令创建3个副本

kubectl create deployment my-dep --image=nginx --replicas=3

可以看到创建了一个deployment,3/3指期望创建3个,3个可用

[root@k8s-master ~]# kubectl get deploy
NAME                     READY   UP-TO-DATE   AVAILABLE   AGE
my-dep                   3/3     3            3           2m4s
nfs-client-provisioner   1/1     1            1           7d

扩缩容

我们可以基于k8s实现手动扩缩容和动态扩缩容(根据系统负载) 手动扩缩容

使用kubectl scale命令

kubectl scale --replicas=5 deployment/my-dep

查看

[root@k8s-master ~]# kubectl get deploy
NAME                     READY   UP-TO-DATE   AVAILABLE   AGE
my-dep                   3/5     5            3           15m
nfs-client-provisioner   1/1     1            1           7d

缩容

[root@k8s-node2 ~]# kubectl scale --replicas=2 deployment/my-dep
deployment.apps/my-dep scaled

查看

[root@k8s-node2 ~]# kubectl get deploy
NAME                     READY   UP-TO-DATE   AVAILABLE   AGE
my-dep                   2/2     2            2           17m
nfs-client-provisioner   1/1     1            1           7d

除了使用kubectl scale,还可以使用下面方式

kubectl edit deploy my-dep

这时候会以yaml格式打开,我们编辑这个replicas的值

保存后退出,这时候发现又变成了5份

[root@k8s-node2 ~]# kubectl get deploy
NAME                     READY   UP-TO-DATE   AVAILABLE   AGE
my-dep                   2/5     5            2           19m
nfs-client-provisioner   1/1     1            1           7d

故障转移

我们看到目前的pod都在这个node1节点

[root@k8s-master ~]# kubectl get pod -owide
NAME                                      READY   STATUS    RESTARTS   AGE    IP              NODE        NOMINATED NODE   READINESS GATES
my-dep-5b7868d854-9ljtd                   1/1     Running   0          3m5s   10.244.36.105   k8s-node1   <none>           <none>
my-dep-5b7868d854-fh5bf                   1/1     Running   0          3m5s   10.244.36.96    k8s-node1   <none>           <none>
my-dep-5b7868d854-l74rf                   1/1     Running   0          3m5s   10.244.36.106   k8s-node1   <none>           <none>
my-dep-5b7868d854-r2dpl                   1/1     Running   0          22m    10.244.36.109   k8s-node1   <none>           <none>
my-dep-5b7868d854-xsqzp                   1/1     Running   0          22m    10.244.36.120   k8s-node1   <none>           <none>
nfs-client-provisioner-6c8cdddb58-kh555   1/1     Running   8          7d     10.244.36.110   k8s-node1   <none>           <none>

我们尝试把node1节点关掉,看下他是否会自动转移,重新拉起正常运行呢

这时候我们需要等待一段时间,因为node节点挂掉会有一个阈值k8s才能感知

[root@k8s-master ~]# kubectl get pod -owide
NAME                                      READY   STATUS        RESTARTS   AGE     IP               NODE        NOMINATED NODE   READINESS GATES
my-dep-5b7868d854-694hk                   1/1     Running       0          6m15s   10.244.169.191   k8s-node2   <none>           <none>
my-dep-5b7868d854-dq8h8                   1/1     Running       0          6m15s   10.244.169.190   k8s-node2   <none>           <none>
my-dep-5b7868d854-vmlrz                   1/1     Running       0          6m15s   10.244.169.151   k8s-node2   <none>           <none>
nfs-client-provisioner-6c8cdddb58-t7wmd   1/1     Running       0          22m     10.244.169.170   k8s-node2   <none>           <none>

滚动更新

我们看下之前部署的my-dep使用了nginx最新版的镜像

命令如下

kubectl set image deployment/my-dep nginx=nginx:1.16.1 --record
//查看滚动状态
kubectl rollout status deployment/my-dep

可以使用-w看到有一个逐步替换的过程,最后使用了我们指定的1.16.1版本

版本回退

加入我们发现我们滚动更新的版本有问题,就需要执行版本回退

#历史记录
kubectl rollout history deployment/my-dep
#查看某个历史详情
kubectl rollout history deployment/my-dep --revision=2
#回滚(回到上次)
kubectl rollout undo deployment/my-dep
#回滚(回到指定版本)
kubectl rollout undo deployment/my-dep --to-revision=2

其他

除了Deployment,k8s还有 StatefulSet 、DaemonSet 、Job 等 类型资源。我们都称为 工作负载。有状态应用使用 StatefulSet 部署,无状态应用使用 Deployment 部署

以上就是k8s入门实战deployment使用详解的详细内容,更多关于k8s deployment使用的资料请关注我们其它相关文章!

(0)

相关推荐

  • k8s应用监控探针详解

    目录 应用监控 pod状态转换 pod的启动流程? Pod支持的监测类型(健康探针) 监测机制 配置参数 示例 image pull policy 镜像管理策略 应用监控 参考 https://www.jb51.net/article/241418.htm 在pod之上 添加一个探针, kubelet通过探针去检查应用 pod状态转换 pod的启动流程? schduler环节 先绑定节点 kubelet接管 准备CNI CSI CRI 启动pod中的container 启动探针 存活探针 监测p

  • K8S 实用工具之合并多个kubeconfig实现详解

    目录 开篇 解决方案 方案一:KUBECONFIG 环境变量指向多个文件 方案二:flatten 方案三:kubectl 插件 konfig 实用工具:krew 实用工具:konfig 总结 开篇 磨刀不误砍柴工 工欲善其事必先利其器 K8S 集群规模,有的公司倾向于少量大规模 K8S 集群,也有的公司会倾向于大量小规模的 K8S 集群. 如果是第二种情况,是否有一个简单的 kubectl 命令来获取一个 kubeconfig 文件并将其合并到 ~/.kube/config 文件作为一个额外的上

  • k8s部署redis集群搭建过程示例详解

    目录 写在前面 一.redis集群搭建 1.1使用redis-cli创建集群 1.2redis集群状态验证(可选) 1.3重启pod,验证集群(可选) 1.4创建Service服务 1.5 Springboot项目配置 1.6相关疑问分析 写在前面 在上一篇文章中,我们已经做到了已经创建好6个redis副本了. 具体的详情,可以查看这里:k8s部署redis集群(一) 那么接下来,我们就继续实现redis集群的搭建过程. 一.redis集群搭建 1.1使用redis-cli创建集群 # 查看re

  • k8s部署redis集群实现过程实例详解

    目录 写在前面 前置准备 一.nfs安装 二.SC.PV 创建 2.1创建SC 2.2创建PV 三.redis集群搭建 3.1创建headless服务 3.2创建redis对应pod集群 写在前面 一般来说,REDIS部署有三种模式. 单实例模式,一般用于测试环境. 哨兵模式 集群模式 后两者用于生产部署 哨兵模式 在redis3.0以前,要实现集群一般是借助哨兵sentinel工具来监控master节点的状态. 如果master节点异常,则会做主从切换,将某一台slave作为master. 引

  • k8s容器互联flannel vxlan通信原理

    目录 k8s容器互联-flannel vxlan 原理篇 vxlan 模式通信原理 flannel的xvlan模式是如何办到的呢? 集群网络模型 查看worker2网络设备类型 查看集群pod 信息 worker1节点的接收过程 再看flannel xvlan模式 k8s容器互联-flannel vxlan 原理篇 容器系列文章 容器系列视频 vxlan 模式通信原理 flannel 在为不同主机的pod分配ip地址的时候,会在一个大的网段范围内分配ip地址,而同一台主机上的pod,则是在大的网

  • k8s编排之Deployment知识点详解

    目录 Pod 复杂的API对象 nginx-deployment Deployment 及类似控制器总结 Deployment 所控制的 ReplicaSet查看 Pod 复杂的API对象 Pod 这个看似复杂的 API 对象,实际上就是对容器的进一步抽象和封装而已. 说得更形象些,“容器”镜像虽然好用,但是容器这样一个“沙盒”的概念,对于描述应用来说,还是太过简单了.这就好比,集装箱固然好用,但是如果它四面都光秃秃的,吊车还怎么把这个集装箱吊起来并摆放好呢? 所以,Pod 对象,其实就是容器的

  • Spring入门实战之Profile详解

    前言 Spring中的Profile功能其实早在Spring 3.1的版本就已经出来,它可以理解为我们在Spring容器中所定义的Bean的逻辑组名称,只有当这些Profile被激活的时候,才会将Profile中所对应的Bean注册到Spring容器中. 看到Profile这个关键字,或许你从来没有正眼瞧过他,又或者脑海中有些模糊的印象,比如除了这里Springmvc中的Profile,maven中也有Profile的标签. 从字面意思来看,Profile表示侧面,那什么情况下才会用到侧面这个功

  • Django零基础入门之模板变量详解

    引言: 我们在页面上会看到,谁登录的就会显示谁的信息,那么这个页面上的变量信息是怎样实现的呢? 这就是本文要讲述的内容--Django中的模板变量! 1.模板变量! 可以在前端页面中使用模板变量来取数据库中的数据,实现前端页面数据动态显示. (1)模板变量使用规则:(在HTML模板中使用!) 语法: {{ 变量名 }} 命名由字母和数字以及下划线组成,不能有空格和标点符号 可以使用字典.类对象.方法.函数.列表.字符串 不要和python或django关键字重名 注意: 如果data是一个字典,

  • Django零基础入门之常用过滤器详解

    引言: 前面讲过了Django中使用模板变量.使用很简单,那么有没有什么关于模板变量的骚操作呢? 答案是肯定有的,这就是本文要讲的--过滤器! 1.过滤器 (1)纯干货讲解: 作用: 对变量进行过滤.在真正渲染出来之前,过滤器会根据功能处理好变量,然后得出结果后再替换掉原来的变量展示出来. 语法:{{ fruits|lower }} 管道符号进行链式调用(可以理解为嵌套使用!),比如实现一个功能,先把所有字符变成小写,再把第一个字符转换成大写. 语法:{{fruits|lower|capfirs

  • k8s编排之StatefulSet知识点详解二

    目录 StatefulSet 对存储状态的管理机制 第一步:定义一个 PVC,声明想要的 Volume 的属性 第二步:在应用的 Pod 中,声明使用这个 PVC 常见的 PV 对象的 YAML 文件 StatefulSet 对存储状态的管理机制 这个机制,主要使用的是一个叫作 Persistent Volume Claim 的功能. 要在一个 Pod 里声明 Volume,只要在 Pod 里加上 spec.volumes 字段即可.然后,你就可以在这个字段里定义一个具体类型的 Volume 了

  • k8s编排之StatefulSet知识点详解一

    目录 正文 StatefulSet 的设计理解 Service 如何被访问 Headless Service 对应的 YAML文件 StatefulSet 的 YAML 文件 解析一下 Pod 对应的 Headless Service 正文 Deployment认为,一个应用的所有 Pod,是完全一样的.所以,它们互相之间没有顺序,也无所谓运行在哪台宿主机上.需要的时候,Deployment 就可以通过 Pod 模板创建新的 Pod:不需要的时候,Deployment 就可以“杀掉”任意一个 P

  • k8s编排之DaemonSet知识点详解

    目录 如何对 StatefulSet 进行“滚动更新”(rolling update)? 下面重点讲解一个\知识点:DaemonSet 列举几个例子: API 对象的定义 如何在指定的 Node 上创建新 Pod 呢? nodeAffinity 含义 如何对 StatefulSet 进行“滚动更新”(rolling update)? 你只要修改 StatefulSet 的 Pod 模板,就会自动触发“滚动更新”: kubectl patch statefulset mysql --type='j

  • Python入门_条件控制(详解)

    条件控制其实就是if...else...(如果...条件是成立的,就做...:反之,就做...)的使用,其基本结构是: 具体看下面这个例子: def account_login(): # 定义函数 password = input('请输入密码:') # 输入密码 if password == '12345': # 如果输入密码是12345,则登录成功 print('登录成功') else: print('密码有误,请重新输入') # 否则提示密码有误,请重新输入 account_login()

  • C语言入门之基础知识详解

    一.思维导图 内容不限于此思维导图 二.环境搭建 对于老手,自动跳过这一趴吧,或者也可以看一下我有没有啥纰漏,毕竟小白需要这一趴. 编译器很多,大部分老师会在学生学习C语言的时候推荐使用VC,不带语言提示器的那种,说是可以提高学生的编码能力.我也不知道到底是不是这么一回事儿.我推荐使用VS,这样学的快,函数记不住的问题很严重吗?项目的车轮碾压过去,再记不住也得记住吧!!! 更何况这个系列到后面是会有需要用文本文件编程写项目的阶段. 下载VS2019社区版,不要标新立异选那些最新版的,出了问题到时

  • Python入门之基础语法详解

    一.我的经历及目标 在学习python之前:我学习过C/C++,在学校期间做过很多的项目,已经有两年多了,算是对C/C++非常的熟悉了,精通不敢说,但是对于面向过程和面向对象有很深刻的认识,做过很多的开发,学习数据库,MFC, QT, linux下利用C/C++进行服务器的开发,QT环境下进行模拟QQ的开发- 听说python挺火的,我也来尝试一门新的语言,python和c有80%的相似性,毕竟是用C来开发的语言,但是是面向过程的一门语言,有C++的继承等相似的特性,感觉更有信心学会它了,毕竟可

随机推荐