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实现动态弹性伸缩 动态的回滚和滚动更新相关推荐

  1. 基于S32K的油门踏板检测项目(基于CAN的Bootloader覆盖升级、回滚升级)

    文章目录 项目概述 要求 Bootloader介绍 原理设计 功能设计 硬件设计 软件设计 主机 主机流程 Xmodem协议 代码 从机 从机流程 升级方案 区域划分 Boot链接文件修改 APP A ...

  2. mysql更新数据能回滚吗_mysql更新数据能回滚吗?如何实现呢?

    不熟悉使用mysql数据库的朋友们,可能会对其有非常多的小问题,例如说,mysql更新数据可以回滚吗?我们应该如何去实现呢? 操作数据库时候难免会因为"大意"而误操作,需要快速恢复 ...

  3. oracle一个循环中回滚继续,oracle回滚段

    http://hi.baidu.com/ipeipei/blog/item/34f84316f7126d4a20a4e950.html 1. 概述 本文主要从回滚段的原理,分配和使用,以及回滚段的相关 ...

  4. ansible 发部署nginx以及更新、回滚

    ansible 发部署nginx以及更新.回滚 ansible 和 saltstack 一样都是基于 Python 开发的,是比 puppet 和 saltstack 更轻量级的运维自动化工具. 一: ...

  5. java 对线程进行事务控制_Java 多线程事务回滚 ——多线程插入数据库时事务控制...

    背景 日常项目中,经常会出现一个场景,同时批量插入数据库数据,由于逻辑复杂或者其它原因,我们无法使用sql进行批量插入.串行效率低,耗时长,为了提高效率,这个时候我们首先想到多线程并发插入,但是如何控 ...

  6. Win11 22H2怎么退回之前版本?Win11回滚Win10系统教程(三种方法)

    最近,新的Windows11 22H2正式版已经推送了,有不少更新到新系统的朋友出现了问题,想要退回之前的系统版本,本文就针对Win11 22H2怎么退回之前版本的问题,带来了三种Win11回滚Win ...

  7. 冯柯《我的ORACLE笔记二:关于回滚段》接力来袭!

    感谢大家对此文的关注!我们的活动还在继续中~您对文章内容有任何疑问时,欢迎您点击原文链接,填写阅读反馈表.我们不仅会邀请作者来回答问题,还会从中抽取一位粉丝赠送精美礼品一份哦~ <我的ORACL ...

  8. k8s核心技术-Controller(Deployment)控制器对pod的管理实现_升级回滚和弹性伸缩---K8S_Google工作笔记0030

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 这个应用的升级和回滚很好理解,之前咱们创建nginx的pod的时候,没有 指定版本,就默认部署的是 ...

  9. K8S实战集训第一课 Ansible自动化部署k8s、弹性伸缩、Helm包管理、k8s网络模型介绍

    Ansible自动化部署K8S集群 一.Ansible自动化部署K8S集群 1.1 Ansible介绍 Ansible是一种IT自动化工具.它可以配置系统,部署软件以及协调更高级的IT任务,例如持续部 ...

最新文章

  1. git tag 功能笔记
  2. vue-cli3.0使用及配置(部分)
  3. Python tarfile模块(压缩解压tar)
  4. 关于企业软件资质申请流程以及时间规划(二)——软件登记测试
  5. LFM算法详解和实战
  6. 正阅读微信小说分销系统-视频教程-4.数据统计 包含图文教程
  7. 「秘」那些管UI小姐姐要来的网站
  8. 商业银行的设立与组织形式-单一银行制、分支银行制、持股公司制、连锁银行制、代理银行制...
  9. 大话西游中的这些经典元素,注意到没?
  10. studio 3t连接linux上的MongoDB
  11. 前端整理 —— 公司项目开发
  12. 看看你在古代是什么学历?(附真题)
  13. 网页设计基础学习(一)
  14. 22.redis和py_redis
  15. weex高性能list解析
  16. 同一台 win10 服务器跑多个 wiki(包括 DokuWiki、django-wiki)
  17. 深度linux桌面卸载wps,安装,卸载WPS-office报错,如何解决?
  18. CSS3中使用calc()设置浏览器宽度和高度减去固定值的写法
  19. 到此一游:在微软参加Visual C++深度体验圆桌会议
  20. 李飞飞又有新动向,斯坦福 AI 实验室由 Christopher Manning 接棒

热门文章

  1. 修改RDP 3389 端口
  2. 请注意了!你的APP可能有下架风险,途牛同程携程等多款App登黑榜!
  3. 仿生蛇形机器人01、Dynamixel MX-64AR舵机控制例程的使用【Python 1.0协议】
  4. 计算hash值的方法
  5. Wstrict aliasing报错
  6. 《英雄本色》幕后故事:徐克和吴宇森两大宗师各导演一部半
  7. 匿名内部类和匿名对象
  8. 国庆出游大家有什么好的帐篷品牌推荐
  9. 去除数组中的重复的值 C#
  10. UTF—8与UTF—8(无bom)格式