在Kubernetes中部署网站的综合指南

news/2024/5/20 13:00:34/文章来源:https://blog.csdn.net/M2l0ZgSsVc7r69eFdTj/article/details/108819460

最近,我们做了一个把Grofers的所有服务迁移到Kubernetes上的决定。

Grofers是杂货领域印度最大的低价在线超市,成立于2013年12月01日,由Albinder Dhindsa和Saurabh Kumar创立,总部位于印度德里的卫星城市Gurugram。其主要提供各种类别的产品,如杂货、水果和蔬菜、美容和保健、家庭护理、婴儿护理、宠物护理、面包和肉类以及海鲜等产品。

在迁移前端网站到Kubernetes上的过程中,我们发现默认的滚动更新部署策略并不如理想中那么好,所以我们不得不使用蓝绿策略来代替(后面会详细讨论)。

对于那些想要做同样迁移工作的人,这篇博客可以作为一个指南,因为当前缺乏这块主题相关的资源,所以这可以节省他们的时间和精力。

首先我们会介绍一些基础知识,然后一步一步的介绍怎么实现,最后再通过运行负载测试来考察不同策略的效果。

什么是Kubernetes?

Kubernetes是一个开放源代码的容器编排系统,用于自动化应用程序的部署,扩展和管理。

我不会介绍Kubernetes所有的基础知识(可以在这里查看其它好的资源[1])。这篇文章中我只会介绍两个非常常见的部署策略。

第一个是蓝绿策略。对于部署单页面网站应用(网站资源使用版本控制),推荐使用该策略。

另一个是滚动更新策略,它可能是Kubernetes中最常用的策略了并且也是Grofers所有后端服务正在使用的策略。

蓝绿策略vs滚动更新

滚动更新

滚动更新通过用新的Pod逐渐替换旧的Pod进行部署。

如上图所示,中间黄色菱形是负载均衡器服务,它负责把流量分发到Pod(应用程序的单实例)。

所以在任何时间,你的应用都可能同时存在新旧版本的Pod。

蓝绿策略

蓝绿策略创建一个全新的部署,它和旧的实例处于并行状态。然后配置负载均衡器,让其把流量切到新的部署实例上,同时停止转发流量到旧的部署实例上。最后删除旧的部署实例。

Grofers使用什么部署策略?

由于我们的后端服务都是无状态的,因此滚动更新策略在这里更有意义,因为它提供了更快的部署和分阶段部署的能力。

但是对于我们的网站,我们发现滚动更新策略不是一个零停机(zero-downtime)策略。原因有两个:

  • 如果蓝绿两种Pod同时存在(滚动更新策略的情况),那么在为版本化资源提供服务时会出现问题。在新的部署中与index.html对应的资源可能不存在于运行在旧的部署中的容器中。下图可以很直观的解释这种情况。

  • 我们还有一个和前端服务一起运行的小型Node.js API服务。所以基本上这是我们网站运行的整体情况。现在假设我们在Node服务上增加一个新的API端点(Endpoint)。对于滚动更新部署,运行在新的部署上面的前端代码中的路由不存在于运行在旧的部署上面的后端服务上。

原因 #1,解释

显而易见,我们需要运行仅包含一个版本的Pod的部署,而不是同时运行两个版本(在滚动更新的情况下)。

蓝绿色部署策略是我们部署网站的必由之路。接下来,我们将深入研究一些代码,并研究如何实现它。

详细指南

我们的想法是使用最新的绿色版本部署新部署(我们使用git commit hash进行版本控制)。

然后等到它启动并且运行后,我们再更新服务,让它指向这个新的部署实例,最后删除旧的部署实例。

部署代码段

---
apiVersion: apps/v1
kind: Deployment
metadata:name: w3g-xxxxxxxlabels:app: w3gversion: "xxxxxxx"

服务代码段

apiVersion: v1
kind: Service
spec:type: LoadBalancerselector:app: w3gversion: "xxxxxxx"

Makefile代码段

kube_swap_blue_green:$(eval BlueVersion=$(shell kubectl get service ${KUBE_APP_NAME} -o=jsonpath='{.spec.selector.version}' -n ${ENV_KUBE_NAMESPACE}))$(eval GreenVersion=${LATEST_GIT_COMMIT_ID})kubectl get deployment ${KUBE_APP_NAME}-${BlueVersion} -o=yaml -n ${ENV_KUBE_NAMESPACE} | sed -e "s/${BlueVersion}/${GreenVersion}/g" | kubectl apply -f - -n ${ENV_KUBE_NAMESPACE}kubectl rollout status deployment/${KUBE_APP_NAME}-${GreenVersion} -n ${ENV_KUBE_NAMESPACE}kubectl get service ${KUBE_APP_NAME} -o=yaml -n ${ENV_KUBE_NAMESPACE} | sed -e "s/${BlueVersion}/${GreenVersion}/g" | kubectl apply -f - -n ${ENV_KUBE_NAMESPACE}kubectl delete deployment ${KUBE_APP_NAME}-${BlueVersion} -n ${ENV_KUBE_NAMESPACE}

我们使用make在CI/CD管道中进行构建和部署。无论你使用哪种工具,步骤都是相同的。

首先,获取蓝色版本(以前使用的git commit hash),可以通过查询已经运行的服务以获取其正在使用的部署版本。

$(eval BlueVersion=$(shell kubectl get service ${KUBE_APP_NAME} -o=jsonpath='{.spec.selector.version}' -n ${ENV_KUBE_NAMESPACE}))

绿色版本不过是最新的git commit hash。

$(eval GreenVersion=${LATEST_GIT_COMMIT_ID})

接下来,我们得到当前的部署,通过将蓝色版本替换为绿色版本来对其进行更改。

kubectl get deployment ${KUBE_APP_NAME}-${BlueVersion} -o=yaml -n ${ENV_KUBE_NAMESPACE} | sed -e "s/${BlueVersion}/${GreenVersion}/g" | kubectl apply -f - -n ${ENV_KUBE_NAMESPACE}

然后,我们等待绿色部署完成,然后再继续。

kubectl rollout status deployment/${KUBE_APP_NAME}-${GreenVersion} -n ${ENV_KUBE_NAMESPACE}

再接下来,我们获取当前服务并将其配置为使用绿色版本而不是蓝色版本。

kubectl get service ${KUBE_APP_NAME} -o=yaml -n ${ENV_KUBE_NAMESPACE} | sed -e "s/${BlueVersion}/${GreenVersion}/g" | kubectl apply -f - -n ${ENV_KUBE_NAMESPACE}

最后,我们删除旧的蓝色版本。

kubectl delete deployment ${KUBE_APP_NAME}-${BlueVersion} -n ${ENV_KUBE_NAMESPACE}

以上就是全部操作。

下一步计划?

这就是我们使用蓝绿色部署策略为网站实现零停机时间部署的方式。

下一篇博客中,我们会深入探讨怎么样对我们网站进行负载测试以及验证不同的策略。

我们将使用JMeter之类的工具以及Selenium WebDriver插件来并行打开多个浏览器客户端(目前为止仅支持Firefox),并在进行新部署时进行负载测试。我们还将执行一个简单的操作,例如单击一个对话框,查看在滚动更新和蓝绿部署过程中遇到了多少故障。

敬请关注。

相关链接:

  1. https://dev.to/adipolak/kubernetes-and-virtual-kubelet-in-a-nutshell-gn4

原文链接:https://lambda.grofers.com/a-comprehensive-guide-to-deploying-a-website-in-kubernetes-c5829bfa4519

DDD实战演练工作坊

DDD实战演练工作坊将于2020年10月17日在北京开课。DDD全过程工作坊将以事件风暴为纵贯线,以领域场景为横切面,驱动从战略设计到战术设计的全生命周期的完整开发过程。内容涵盖事件风暴、限界上下文、上下文映射、角色构造型、场景驱动设计和测试驱动开发。整个工作坊围绕一个全真案例进行演练,实践具有实操价值的领域驱动设计方法。点击下方图片或者阅读原文链接查看详情。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_777394.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

教你用 Docker 搭建网站

2013 年发布至今, Docker 一直广受瞩目,被认为可能会改变软件行业。但是,许多人并不清楚 Docker 到底是什么,要解决什么问题,好处又在哪里?本文就来详细解释,帮助大家理解它,还带有简…

网站标题前的小logo

原因:每个浏览器访问服务器的时候会自动发送一个GET 请求,地址是:/favicon.ico 如果不处理,则只会在浏览器标题前添加一个文本类的图标 前提:有现有的图标favicon.ico,且按开发规范存放在static/img/下 解…

ASP.NET 网站路径

使用网站中的资源时,通常必须指定资源的路径。例如,您可以使用 URL 路径引用页面中的图像文件或网站中其他位置处的页面的 URL。同样,Web 应用程序中的代码可以使用基于服务器的文件的物理文件路径对文件进行读写操作。ASP.NET 提供用于引用资…

帅的一坨,不转不行。优雅实用web标准网站设计欣赏

文章来源于我非常喜爱的Smashing Magazine。网站不支持图片外链接,如果看不到图片请访问原文地址:http://www.smashingmagazine.com/2007/07/04/inspiration-package-usable-elegant-inspiring-design-showcase/以下是原文: Inspiration Pack…

js入门·表单元素(select下拉列表)制作二级联动菜单和网站导航

对于脚本来说,最复杂的表单元素对象就是select了,他是一个复合对象,包含OPTION对象数组的对象 演示一:导航,这个多见于网站友情链接 请选择您要去的网站天轰穿系列教程博客园CSDN演示二:地区二级无刷新联动菜单&#x…

关系网成网络盈利模式 LinkedIn网站探秘

“人传人”的创业群体 2003年,从加州大学伯克利分校经济系毕业后,林文文开始了在加州联合银行的工作。今年7月,她决定转行做市场营销,然而由于缺乏相关的工作经验,她在几大求职网站上投的简历最终都石沉大海。 后来&am…

关于网站登录后的页面操作所携带的不同cookie值

对于课堂派网站,登录后的页面操作只需要携带PHPSESSID或者cookie中间那部分即可,两个都带也可,SERVERID不知道是干啥的,每次响应的都会变. 代码实现: cookie None class HttpRequest:def __init__(self,method,url,dataNone):self.methodmethodself.urlurlself.datadata# def …

新辰:共享是SEO的思维 用户是SEO的核心

大家都知道。SEO一直没有一个能够定义的核心。新辰知道全部的东西里面在互联网领域链接是非常重要的。所以新辰觉得做SEO就是把链接做好。因此,链接对于一个站点来说简单分能够分成两种。内部的链接和外部的链接。故内链和外链出来了。对于互联网来说。外链的作用比…

SSM重新开发计科院新闻网站

SSM重新开发计科院新闻网站 学号:201631062509 姓名:杨菓 1.什么是SSM SSM就是SpringSpringMVCMyBatis框架的整合。 1.1 Spring Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作…

Python爬虫框架Scrapy 学习笔记 2 ----- 爬取Mininova网站种子文件信息

1. 任务描述目标网站:http://www.mininova.org/yesterday/ 目标网站截图:-------------------------------------可以看到种子文件的列表,这些链接的url可以用正则表达式表示为: /tor/\d随便点一个进去,进入资源详情页&#xff1a…

教育局机关局域网站点上网指南

教育局机关局域网站点上网指南 1.什么是站点上网零维护?我们能实现这个目标吗? 站点上网零维护最少包括如下4个方面的因素:①机房无需人员值守;②上网线路和设备稳定畅通;③每个站点无需进行任何设置;④站点使用人员懂…

通过华为云搭建一个属于自己的小网站

出于个人兴趣,想搭建一个自己的网站玩玩。 先在华为云买个云服务器,由于是第一次玩,先买个windows server 2019版的,2核4G,以后弄熟了再上手linux吧。、 经过重置密码,设置安全组等简单配置后登录服务器主机…

微软发布IIS漏洞补丁,影响我国五分之一网站

2015年4月14日,微软发布月度例行安全公告,共释放出11项更新,一举修复包括Windows操作系统、IE浏览器、Office办公软件、.NET Framework、Server软件、Office Services和Web Apps在内的26个安全漏洞。在这11项更新中,有4项更新综合…

SEO的艺术(原书第2版)

《SEO的艺术(原书第2版)》基本信息原书名:The Art of SEO, Second Edition作者: Eric Enge Stephan Spencer Jessie Stricchiola Rand Fishkin译者: 姚军丛书名: O’Reilly精品图书系列出版社:机械工业出版社ISBN&…

为你的网站添加qq在线服务功能

最近要做一个网站,客户要求有在线服务,思来想去,最后决定用qq在线服务功能来实现。 说来也巧,我也是在其他很多网站上见到这个功能,所以就偷工减料地利用现有的东西来做的。 好了,不多说了,进入…

Web应用程序与Web网站在IIS中部署

Web应用程序与Web站点区别 在Visual Studio可以创建 Web 应用程序项目或网站项目。 每种项目类型各有优缺点,要选择可以满足需要的最佳项目类型,应了解各项目类型之间的差异。 创建项目之前,必须选择合适的项目类型,原因是从一种…

40款非常漂亮的 HTML5 CSS3 网站模板免费下载欣赏

HTML5 作为下一代网页语言,加入中众多更具语义的标签,例如video、audio、section、article、header 和 nav 等。而 CSS3 作为 CSS 的下一代版本,同样引入了很多很酷的属性,以前很多需要 JavaScript 才能实现的复杂效果&#xff0c…

网站如何集成支付宝!原来要给钱的

转:http://gavin-chen.iteye.com/blog/257864 刚在Javaeye看到一篇文章,关于网站集成支付宝的,正是我之前想了解的,不过作者写得有些零乱,解释也不太清楚,代码格式更是看着郁闷,待以后有空消化消…

回顾一下我所做过的网站

1998年,上大学之后开始学习计算机和编程,课堂上零零碎碎地学了一些Basic、Fortran、Matlab。喜欢上编程之后,决定做一个严肃的程序员,又自学了C和C。 2001年,上网有一段时间之后,对做网页产生了兴趣&#x…

[转]html5构建触屏网站之网站尺寸探讨

http://www.jb51.net/html5/70095.html 本文分为两个部分,第一部分讨论跨平台网站的可行性,第二部分讨论viewport是如何设置的 开发跨平台网站? 靠标签的自适应宽高实现多尺寸通用!? 标签宽高可以自适应没错&#xff0…