九、K8s deployment相关操作
实验环境:
按照图示部署好了K8s集群,一个Master,两个worker nodes。
什么是Deployment:
docker容器是不稳定,当一个容器出现故障后或误删除后,管理员需要去排查并重启。在K8s中,最小的单位是Pod,本质上是对容器的包装,也是不稳定的。为了避免这种缺点,K8s里设置了Deployment来帮助我们解决这些问题。
Deployment可以帮我们做什么?
- 定义一组Pod期望数量,Controller会维持Pod数量与期望数量一致;
- 配置Pod的发布方式,controller会按照给定的策略更新Pod,保证更新过程中不可用Pod维持在限定数量范围内;
- 如果发布有问题支持回滚。
Deployment原理:
在Kubernetes架构中,有一个叫做kube-controller-manager的组件。这个组件,是一系列控制器的集合。其中每一个控制器,都以独有的方式负责某种编排功能。而Deployment正是这些控制器中的一种。
在具体实现中,实际状态往往来自于Kubernetes集群本身。比如Kubelet通过心跳汇报的容器状态和节点状态,或者监控系统中保存的应用监控数据,或者控制器主动收集的它感兴趣的信息,这些都是常见的实际状态的来源;期望状态一般来自用户提交的YAML文件,这些信息都保存在Etcd中。
对于Deployment,它的控制器简单实现如下:
- Deployment Controller从Etcd中获取到所有携带 “app:nginx”标签的Pod,然后统计它们的数量,这就是实际状态;
- Deployment对象的replicas的值就是期望状态;
- Deployment Controller将两个状态做比较,然后根据比较结果,确定是创建Pod,还是删除已有Pod。
一、创建Deployment
可以用命令行或者yaml文件的方式创建deployment。但是推荐使用yaml文件的方式来完成,功能能丰富。
步骤1:获取deployment的yaml文件:
在master上:导出deployment的yaml文件模板:
kubectl create deployment web1 --image=nginx --dry-run=client -o yaml > web1.yaml
查看并分析其yaml文件:
[root@vms201 deployment_practise]# cat web1.yaml
apiVersion: apps/v1
kind: Deployment
metadata:creationTimestamp: nulllabels:app: web1name: web1
spec:replicas: 1selector:matchLabels:app: web1strategy: {}template:metadata:creationTimestamp: nulllabels:app: web1spec:containers:- image: nginxname: nginxresources: {}
status: {}
template数据表示pod的模板, replicas则表示根据此模板需要创建几个副本数。matchLabels属性会去匹配template中指定的labels,来控制pod的数量,所以务必保证这两个地方labels的值是相同的。
步骤2:编辑模板文件,创建deploy:
编辑模板文件:
[root@vms201 deployment_practise]# cat web1.yaml
apiVersion: apps/v1
kind: Deployment
metadata:creationTimestamp: nulllabels:app: web1name: web1
spec:replicas: 3selector:matchLabels:app1: web1strategy: {}template:metadata:creationTimestamp: nulllabels:app1: web1app2: web1spec:containers:- image: nginxname: nginximagePullPolicy: IfNotPresentresources: {}
status: {}
创建并查看deployment:
[root@vms201 deployment_practise]# kubectl apply -f web1.yaml
deployment.apps/web1 created
[root@vms201 deployment_practise]# kubectl get deployments.apps -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
web1 3/3 3 3 57s nginx nginx app=web1
可以看到,目前已经运行了3个副本;注意容器的labels可以由多个,matchLabels属性至少要match其中的一个。
注意:当当前pod无法无法满足实际环境的中的流量时,可以为当前pod创建多个副本,后续流量则会被分配到各个pod上去,减少了每个pod的负载。
二、删除pod,查看副本数是否依然保持
删除其中的一个pod:
[root@vms201 deployment_practise]# kubectl get pods
NAME READY STATUS RESTARTS AGE
web1-5bfb6d8dcc-5vv2p 1/1 Running 0 23m
web1-5bfb6d8dcc-hgt8v 1/1 Running 0 23m
web1-5bfb6d8dcc-js546 1/1 Running 0 23m[root@vms201 deployment_practise]# kubectl delete pod web1-5bfb6d8dcc-5vv2p
pod "web1-5bfb6d8dcc-5vv2p" deleted
然后在重新查看副本数和pod:
[root@vms201 deployment_practise]# kubectl get deployments.apps
NAME READY UP-TO-DATE AVAILABLE AGE
web1 3/3 3 3 24m
[root@vms201 deployment_practise]# kubectl get pods
NAME READY STATUS RESTARTS AGE
web1-5bfb6d8dcc-hgt8v 1/1 Running 0 27m
web1-5bfb6d8dcc-js546 1/1 Running 0 27m
web1-5bfb6d8dcc-wfjbn 1/1 Running 0 3m2s
可以发现,deployment重新装机了一个pod,保证了副本数量依旧为3。
当一个worker node出现故障,deployment会将在其上运行的pod安排到其他node上运行,当故障node重启后,pod并不会返回到重启的node上运行。
三、修改deployment
pod的yaml文件在线修改并应用是有问题的,但是deployment却可以。例如我们通过如下命令将deployment的值修改为2,然后再查看修改后的结果:
[root@vms201 deployment_practise]# kubectl edit deployments.apps
deployment.apps/web1 edited
[root@vms201 deployment_practise]# kubectl get deployments.apps
NAME READY UP-TO-DATE AVAILABLE AGE
web1 2/2 2 2 34m
通过如上的操作,deployment已经被在线修改并应用了。但如果不是使用edit的方式修改,而是直接修改其的yaml文件,修改完成后需要重新apply才会生效。
使用scale的方式设置副本的数量:
[root@vms201 deployment_practise]# kubectl scale deployment web1 --replicas=4
deployment.apps/web1 scaled
[root@vms201 deployment_practise]# kubectl get deployments.apps
NAME READY UP-TO-DATE AVAILABLE AGE
web1 4/4 4 4 51m
[root@vms201 deployment_practise]# kubectl get pod
NAME READY STATUS RESTARTS AGE
web1-5bfb6d8dcc-2djjm 1/1 Running 0 33s
web1-5bfb6d8dcc-9mj2v 1/1 Running 0 33s
web1-5bfb6d8dcc-hgt8v 1/1 Running 0 51m
web1-5bfb6d8dcc-js546 1/1 Running 0 51m
四、HPA
HPA(horizontal pod autoscalers)水平自动伸缩。通过检测pod CPU的负载,解决deployment里某pod负载太重,动态伸缩pod的数量来负载均衡。
HPA可以检测pod cpu的使用情况,通知deployment增加或者减少所管理pod副本的数量。
步骤1:配置HPA
设置web1的pod数量最小为2,最大为10:
[root@vms201 deployment_practise]# kubectl autoscale deployment web1 --min=2 --max=10
horizontalpodautoscaler.autoscaling/web1 autoscaled
当我们强行设置pod数为1时,查看副本数:
[root@vms201 deployment_practise]# kubectl scale deployment web1 --replicas=1
deployment.apps/web1 scaled
[root@vms201 deployment_practise]# kubectl get pods
NAME READY STATUS RESTARTS AGE
web1-5bfb6d8dcc-2w8dd 1/1 Running 0 6s
web1-5bfb6d8dcc-js546 1/1 Running 0 62m
可以看到,有一个pod的AGE是6s,表示的是我们手工让pod从4个变为1个,由于设置了HPA的最小数量为2,所以又重新创建了一个新的pod。
步骤2:查看负载的情况和设置阈值
在当前的hpa中,我们可以看到当前的CPU的使用情况为unknown,可以通过设置让其显示
[root@vms201 deployment_practise]# kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
web1 Deployment/web1 <unknown>/80% 2 10 2 6m30s
删除掉原来的HPA和deployment:
[root@vms201 deployment_practise]# kubectl delete -f web1.yaml
deployment.apps "web1" deleted
[root@vms201 deployment_practise]# kubectl delete hpa web1
horizontalpodautoscaler.autoscaling "web1" deleted
修改web1.yaml文件:设置资源限制,cpu为400m
[root@vms201 deployment_practise]# cat web1.yaml
apiVersion: apps/v1
kind: Deployment
metadata:creationTimestamp: nulllabels:app: web1name: web1
spec:replicas: 3selector:matchLabels:app: web1strategy: {}template:metadata:creationTimestamp: nulllabels:app: web1spec:containers:- image: nginxname: nginximagePullPolicy: IfNotPresentresources:requests:cpu: 400m
status: {}
创建deployment和hpa
[root@vms201 deployment_practise]# kubectl apply -f web1.yaml
deployment.apps/web1 created
[root@vms201 deployment_practise]# kubectl autoscale deployment web1 --min=2 --max=10 --cpu-percent=80
horizontalpodautoscaler.autoscaling/web1 autoscaled
可以看到,这里设置了cpu-percent=80,表示pod的cpu利用率超过了百分之80会自动扩容:
[root@vms201 deployment_practise]# kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
web1 Deployment/web1 0%/80% 2 10 3 70s
步骤3:创建SVC,做负载均衡
关于SVC的部分,后续笔记会补充。
[root@vms201 deployment_practise]# kubectl expose --name=svc1 deployment web1 --port=80
service/svc1 exposed
[root@vms201 deployment_practise]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
svc1 ClusterIP 10.109.167.135 <none> 80/TCP 8s
如上,SVC已经关联到了deployment上,其地址为10.109.167.135。
步骤4:测试deployment的环境
安装压力测试包:
yum install httpd-tools -y
向SVC地址发送数据做压力测试:
ab -t 600 -n 1000000 -c 1000 http://10.109.167.135/index.html
其中,各个参数的含义:
-n在测试会话中所执行的请求个数。默认时,仅执行一个请求。
-c一次产生的请求个数。默认是一次一个。
-t测试所进行的最大秒数
查看hpa状况:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
web1 Deployment/web1 64%/80% 2 10 6 14m
可以看到目前已经自动拓展到了6个副本,每个副本的CPU使用率平均为64%。当压力测试完成,CPU利用率下降后,pod数会减少,但是不会立即减少,为了防止流量再次增大,默认是5分钟。5分钟后进行查看:
[root@vms201 ~]# kubectl top pods --use-protocol-buffers
NAME CPU(cores) MEMORY(bytes)
web1-65bd67cbf8-594pf 0m 5Mi
web1-65bd67cbf8-6pskt 0m 5Mi
五、K8s镜像更换(升级):
对镜像进行升级,可以保证deployment中的部分副本进行进行升级,等升级完成后剩下的副本才继续升级,保证稳定性。(升级的过程本质是删除掉现有的pod,然后用新镜像创建新的pod)
方式1:直接修改deployment的文件:
首先将镜像拓展为6个,方便做测试:
[root@vms201 ~]# kubectl edit hpa web1
horizontalpodautoscaler.autoscaling/web1 edited
[root@vms201 ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
web1-65bd67cbf8-2t4m5 1/1 Running 0 13s
web1-65bd67cbf8-594pf 1/1 Running 1 39m
web1-65bd67cbf8-6pskt 1/1 Running 1 28m
web1-65bd67cbf8-9l2lw 1/1 Running 0 13s
web1-65bd67cbf8-h4jql 1/1 Running 0 13s
web1-65bd67cbf8-shchn 1/1 Running 0 13s
修改deployment的yaml文件,找到其中的镜像名称修改为nginx:1.9,并且将maxSurge设置为2,maxUnavailable设置为2。
[root@vms201 ~]# kubectl edit deployments.apps web1
deployment.apps/web1 edited
maxSurge:在升级过程中一次升级几个(可以是数字或百分比)
maxUnavailable:在升级过程中,一次性删除多少个pod(可以是数字或者百分比)
可以看到,已经升级完成,升级的时间不同:
[root@vms201 ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
web1-d845d59bb-64zx7 1/1 Running 0 35s
web1-d845d59bb-79vrp 1/1 Running 0 48s
web1-d845d59bb-gzlkq 1/1 Running 0 65s
web1-d845d59bb-hbnzk 1/1 Running 0 65s
web1-d845d59bb-jcf5r 1/1 Running 0 65s
web1-d845d59bb-pdmns 1/1 Running 0 65s
利用describe查看是否更新成功:
[root@vms201 ~]# kubectl describe pod web1-d845d59bb-64zx7 | grep imageNormal Pulled 3m58s kubelet Container image "nginx:1.9" already present on machine
方式2: 使用命令行方式
kubectl set image deploy deploy名 容器名=镜像名 --record
重新将nginx镜像替换为latest版本:
[root@vms201 ~]# kubectl set image deploy web1 nginx=nginx:latest --record
deployment.apps/web1 image updated
查看deployment的历史记录:
[root@vms201 ~]# kubectl rollout history deployment web1
deployment.apps/web1
REVISION CHANGE-CAUSE
1 <none>
2 <none>
3 kubectl set image deploy web1 nginx=nginx:latest --record=true
可以看到revision3上由于我们加上了–record参数,记录了所做的操作。
恢复到指定的版本:
[root@vms201 ~]# kubectl rollout undo deployment web1 --to-revision=2
deployment.apps/web1 rolled back
恢复到版本2,也就是nginx:1.9的版本。
参考资料:
1.《老段CKA课程》
2. https://blog.csdn.net/lixinkuan328/article/details/103993274
九、K8s deployment相关操作相关推荐
- K8s Docker 相关操作指令
文章目录 1 Docker镜像删除的多种方法 2 Docker常见问题 3 K8s节点驱逐 4 Centos7 修改Docker Root Dir 5 K8s 重新生成token并加入集群 6 K8s ...
- K8s系列之:Deployment应用实战和Deployment相关命令整理
K8s系列之:Deployment应用实战和Deployment相关命令整理 一.Pod和Controller关系 二.Deployment应用场景 三.创建deployment的yaml文件 四.根 ...
- Kubernetes:3步排查K8S Deployment故障
目录 Kubernetes中部署一个应用程序 3步排查K8S Deployment故障 1. 故障排查Pod 常见的Pod错误 启动错误包括: 运行时错误包括: ImagePullBackOff Cr ...
- 2021年大数据HBase(五):HBase的相关操作JavaAPI方式
全网最详细的大数据HBase文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 前言 HBase的相关操作-JavaAPI方式 一.需求说明 ...
- 2021年大数据HBase(四):HBase的相关操作-客户端命令式!【建议收藏】
全网最详细的大数据HBase文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 前言 HBase的相关操作-客户端命令式 1.进入HBase ...
- 详解k8s deployment的滚动更新
k8s deployment的滚动更新 一.知识准备 ● 本文详细探索deployment在滚动更新时候的行为 二.环境准备 组件 版本 OS Ubuntu 18.04.1 LTS docker 18 ...
- oracle decode_错过血亏!一文搞懂Oracle锁相关视图及相关操作
本文主要研究锁的相关视图,以及锁的相关操作,通过视图查锁的问题. 一.v$transaction视图 第一个视图是v$transaction,就是Oracle数据库所有活动的事务数,所有活动的事务每一 ...
- 错过血亏!一文搞懂Oracle锁相关视图及相关操作
本文主要研究锁的相关视图,以及锁的相关操作,通过视图查锁的问题. 一.v$transaction视图 第一个视图是v$transaction,就是Oracle数据库所有活动的事务数,所有活动的事务每一 ...
- OpenShift 4 之 Image Registry、Image 和 ImageStream 概念和相关操作
<OpenShift 4.x HOL教程汇总> OpenShift 4 之 Image Registry.Image 和 ImageStream 概念和相关操作 概念篇 1. Contai ...
- Java String类的相关操作
Java String类的相关操作 一.如何遍历字符串 //法一 String str="hello world"; for(int i=0;i<str.length();i ...
最新文章
- 14条改善jquery代码的建议
- 前端怎么通过后台来判断已读状态_类目图片支持商家后台设置 | 前端设计
- Node初学(一)require方法
- 为什么牛在天上飞 因为有人在地上吹 谈高德地图说日活过亿
- xcode:关于Other Linker Flags
- 年薪 50w 难吗?分享我的 2 个捷径
- Confluence 6 为发送邮件配置服务器
- Avalonia跨平台入门第二十二篇之人脸检测
- js实现文字从右滚动到左边代码循环滚动实例
- 使用 | Java使用WebMagic 爬取网站
- Java 中的异常处理
- line java_java – Line Rasterization / 4-bresenham
- 《Hadoop海量数据处理:技术详解与项目实战(第2版)》一第2章 环境准备
- 人人商城删除后台菜单“小程序”
- Chaos Mesh介绍
- 我们到底是万物之灵? 还是另一种昆虫?
- MYSQL中,in、limt、升降序、count的用法
- 开心一刻:邪恶的小明
- Spring源码解析-bean实例化
- js正则表达式 URL格式匹配详解