基于k8s实现动态弹性伸缩 动态的回滚和滚动更新
K8S:
K8S是一个使用 Docker 容器进行编排的系统,主要围绕 pods 进行工作。 Pods 是 k8s 生态中最小的调度单位,可以包含一个或多个容器。
k8s是一个开源的容器集群管理系统,可以实现容器集群的自动化部署、自动扩缩容、维护等功能。
pod生命周期:创建 —>> 发布 —>> 更新 —>> 回滚 —>> 删除
今天用一个小例子实现一下k8s的动态弹性伸缩 动态的回滚和滚动更新,及负载均衡的功能。
构建 namespace
touch namespase.yaml
vim namespase.yaml
apiVersion: v1 #类型为Namespace
kind: Namespace #类型为Namespace
metadata:name: ssx-nginx-ns #命名空间名称labels:name: lb-ssx-nginx-ns
k8s的创建命令:
kubectl create
如果不存在则创建,如果存在,则报错
kubectl apply
如果不存在则创建,如果存在,则更新
kubectl create -f namespase.yaml
查看空间:
kubectl get ns
前四个是系统默认的,最后是一个是我们新增的。
创建pod控制器(deployment)yaml配置文件
kubernetes通过Deployment和ReplicaSet(rs)管理多个Pod。
touch deployment.yaml
vim deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:labels:app: nginx #为该Deployment设置key为app,value为nginx的标签name: ssx-nginx-dmnamespace: ssx-nginx-ns
spec:replicas: 2 #副本数selector: #标签选择器,与上面的标签共同作用matchLabels: #选择包含标签app:nginx的资源app: nginxtemplate: #这是选择或创建的Pod的模板metadata: #Pod的元数据labels: #Pod的标签,上面的selector即选择包含标签app:nginx的Podapp: nginxspec: #期望Pod实现的功能(即在pod中部署)containers: #生成container,与docker中的container是同一种- name: ssx-nginx-cimage: nginx:latest #使用镜像nginx: 创建container,该container默认80端口可访问ports:- containerPort: 80 # 开启本容器的80端口可访问
kubectl create -f deployment.yaml
如果不指定命名空间就会去查默认的命名空间,所以最好带上命名空间 -n 自己的空间。
查看所有pod
kubectl get pod -n ssx-nginx-ns
根据配置文件中 replicas: 2 #副本数 参数这里看到我们启动了两个容器。
kubectl describe:查看特定资源或资源组的详细信息
kubectl describe pods ssx-nginx-dm-d9cd6595-6wnz2 -n ssx-nginx-ns
Pod启动成功以后 k8s内部会分配一个ip,只能内部访问,外部无法访问.
创建service(ymal方式创建)
默认创建的pod是只能对内访问的,所以需要创建一个对外的访问端口,创建一个service其实就是暴露对外的访问端口
touch service.yaml
vim service.yaml
apiVersion: v1
kind: Service
metadata:labels:app: nginxname: ssx-nginx-svnamespace: ssx-nginx-ns
spec:ports:- port: 9000 #我暂时不理解,这个设置 明明没用到?name: ssx-nginx-lastprotocol: TCPtargetPort: 80 # 容器nginx对外开放的端口 上面的dm已经指定了nodePort: 31090 #外网访问的端口selector:app: nginxtype: NodePort
kubectl create -f service.yaml
查看:
kubectl get services、 kubectl get svc 都是一样的效果.
kubectl get svc -n ssx-nginx-ns
访问:
curl 10.108.93.169:9000
动态弹性伸缩 动态的回滚和滚动更新
对于kubernetes来说Pod是资源调度最小单元,kubernetes主要的功能就是管理多个Pod,Pod中可以包含一个或多个容器,而kubernetes是如可管理多个Pod的呢?对,没错,就是通过控制器,比如Deployment和ReplicaSet(rs)。
弹性伸缩pod 自我修复和负载均衡
查看副本数:
kubectl get deployments -n ssx-nginx-ns
增加副本:
命令语法:
scale [–resource-version=version] [–current-replicas=count] --replicas=COUNT (-f FILENAME | TYPE NAME)
kubectl scale deployments/ssx-nginx-dm --replicas=3 -n ssx-nginx-ns
查看deployments 数:
kubectl get deployments -n ssx-nginx-ns
通过 kubectl get pods -n ssx-nginx-ns 可以看到当前的 Pod 也增加到了 3 个:每次请求发送到不同的 Pod,3 个副本轮训处理,这样就实现了负载均衡。
删除一个pod
kubectl delete po ssx-nginx-dm-d9cd6595-s2pv4 -n ssx-nginx-ns
因为 Kubernetes 是声明式 API,所以删掉了之后,Pod API 对象就与预期的不一致了,所以会自动重新创建 Pod 保持与预期一致:
但是如果ReplicaSet 管理的 Pod 对象很多的话,那么要一个个手动删除,会很麻烦,所以可以使用:
kubectl delete replicaset {rs_name} -n {namespace}
要 scale down 也很方便,下面将删除一个副本(副本数变为 1)
kubectl scale deployments/ssx-nginx-dm --replicas=1 -n ssx-nginx-ns
Rolling Update(灰度发布和回滚)
Rolling Update 会边启动新的 Pod 边停止旧的 Pod,比如 replicas 是 3,然后有一个 Service 连着这三个 Pod,那么在做 Rolling Update 的时候,会先启动一个新版本的 Pod,并且这个 Pod 也会连上 Service,然后停掉其中一个旧的 Pod,再启动新版本的 Pod,再停止旧的 Pod,如此循环,直到 3 个 Pod 都是新版的为止。
更新镜像的语法
可以不用使用yml配置文件, 直接替换镜像版本:
kubectl set image deployment =
去搜一个nginx的版本,其他镜像也是同理,选择你需要的版本。
kubectl set image deployment/ssx-nginx-dm ssx-nginx-c=nginx:1.14.0 -n ssx-nginx-ns
通过 kubectl get pods 可以观察滚动更新的过程,可以看到 老版本nginx版本 的 Pod 被逐个删除,同时启动了新的 1.14.0版本的 Pod。
回滚到上一个版本:
kubectl rollout deployment/ssx-nginx-dm -n ssx-nginx-ns
也可以使用 --revision参数指定某个历史版本:
kubectl rollout undo deployment/ssx-nginx-dm --to-revision=2 -n ssx-nginx-ns
如果想知道历史版本镜像,可以通过这个命令:
kubectl rollout history deployment/ssx-nginx-dm -n ssx-nginx-ns
项目下线,即删除对应deployment与service资源:
kubectl delete deployment nginx
kubectl delete svc nginx
基于k8s实现动态弹性伸缩 动态的回滚和滚动更新相关推荐
- 基于S32K的油门踏板检测项目(基于CAN的Bootloader覆盖升级、回滚升级)
文章目录 项目概述 要求 Bootloader介绍 原理设计 功能设计 硬件设计 软件设计 主机 主机流程 Xmodem协议 代码 从机 从机流程 升级方案 区域划分 Boot链接文件修改 APP A ...
- mysql更新数据能回滚吗_mysql更新数据能回滚吗?如何实现呢?
不熟悉使用mysql数据库的朋友们,可能会对其有非常多的小问题,例如说,mysql更新数据可以回滚吗?我们应该如何去实现呢? 操作数据库时候难免会因为"大意"而误操作,需要快速恢复 ...
- oracle一个循环中回滚继续,oracle回滚段
http://hi.baidu.com/ipeipei/blog/item/34f84316f7126d4a20a4e950.html 1. 概述 本文主要从回滚段的原理,分配和使用,以及回滚段的相关 ...
- ansible 发部署nginx以及更新、回滚
ansible 发部署nginx以及更新.回滚 ansible 和 saltstack 一样都是基于 Python 开发的,是比 puppet 和 saltstack 更轻量级的运维自动化工具. 一: ...
- java 对线程进行事务控制_Java 多线程事务回滚 ——多线程插入数据库时事务控制...
背景 日常项目中,经常会出现一个场景,同时批量插入数据库数据,由于逻辑复杂或者其它原因,我们无法使用sql进行批量插入.串行效率低,耗时长,为了提高效率,这个时候我们首先想到多线程并发插入,但是如何控 ...
- Win11 22H2怎么退回之前版本?Win11回滚Win10系统教程(三种方法)
最近,新的Windows11 22H2正式版已经推送了,有不少更新到新系统的朋友出现了问题,想要退回之前的系统版本,本文就针对Win11 22H2怎么退回之前版本的问题,带来了三种Win11回滚Win ...
- 冯柯《我的ORACLE笔记二:关于回滚段》接力来袭!
感谢大家对此文的关注!我们的活动还在继续中~您对文章内容有任何疑问时,欢迎您点击原文链接,填写阅读反馈表.我们不仅会邀请作者来回答问题,还会从中抽取一位粉丝赠送精美礼品一份哦~ <我的ORACL ...
- k8s核心技术-Controller(Deployment)控制器对pod的管理实现_升级回滚和弹性伸缩---K8S_Google工作笔记0030
技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 这个应用的升级和回滚很好理解,之前咱们创建nginx的pod的时候,没有 指定版本,就默认部署的是 ...
- K8S实战集训第一课 Ansible自动化部署k8s、弹性伸缩、Helm包管理、k8s网络模型介绍
Ansible自动化部署K8S集群 一.Ansible自动化部署K8S集群 1.1 Ansible介绍 Ansible是一种IT自动化工具.它可以配置系统,部署软件以及协调更高级的IT任务,例如持续部 ...
最新文章
- git tag 功能笔记
- vue-cli3.0使用及配置(部分)
- Python tarfile模块(压缩解压tar)
- 关于企业软件资质申请流程以及时间规划(二)——软件登记测试
- LFM算法详解和实战
- 正阅读微信小说分销系统-视频教程-4.数据统计 包含图文教程
- 「秘」那些管UI小姐姐要来的网站
- 商业银行的设立与组织形式-单一银行制、分支银行制、持股公司制、连锁银行制、代理银行制...
- 大话西游中的这些经典元素,注意到没?
- studio 3t连接linux上的MongoDB
- 前端整理 —— 公司项目开发
- 看看你在古代是什么学历?(附真题)
- 网页设计基础学习(一)
- 22.redis和py_redis
- weex高性能list解析
- 同一台 win10 服务器跑多个 wiki(包括 DokuWiki、django-wiki)
- 深度linux桌面卸载wps,安装,卸载WPS-office报错,如何解决?
- CSS3中使用calc()设置浏览器宽度和高度减去固定值的写法
- 到此一游:在微软参加Visual C++深度体验圆桌会议
- 李飞飞又有新动向,斯坦福 AI 实验室由 Christopher Manning 接棒