在过去的十年中,Wayfair严重依赖其自主开发其工程产品的售票系统,和运营需求。第一季度开始到2020年,Wayfair决定在Projecthub(Atlassian的吉拉),从而提供一系列强大的功能,在一个单一平台全部统一规范。集装箱吉拉环境是在同行业中相对新鲜的做法,我们必须在定制吉拉的码头工人形象符合我们的需要有新的突破。另一种学习的过程是我们的预置型K8S集群上这个第三方应用程序作为一个有状态组的部署。

Projecthub平台启用了以下功能-

  1. Scrums和看板板
  2. 服务台队列
  3. 电子邮件发出创作
  4. 项目管理,路线图,甘特图
  5. 动态和可定制的进气形式
  6. 自服务自动化规则和脚本
  7. API和集成(Slack, Github,谷歌,其他内部/第三方工具等)
  8. 开箱即用的报告/自定义报告
  9. ITSM和CMDB功能
  10. 自定义插件开发SDK
  11. 还有很多

系统注意事项

在这篇文章中,我们将探讨技术设计选择,走进了吉拉的设置和部署。即进入系统设置的关键因素:

  1. 高可用性- - - - - -提供特定可用性级别(在Jira的例子中是对应用程序的访问)的策略。自动纠正和故障转移是高可用性计划的一部分。
  2. 性能- 具有高性能的网页和端点与可接受的响应时间。
  3. 可扩展性-能力规模立即没有重复和昂贵的管理任务。使成千上万的用户和数百万的问题。
  4. 监控-能够查看,查询,并设置警报在系统日志监测和调试的目的。

在评估了Jira系统的需求并回顾了Wayfair在负载、使用和所需特性方面的具体需求之后,在Wayfair的on-prem Kubernetes集群上托管的容器上运行Jira成为最优化的解决方案。Kubernetes是一个开源平台,它跨网络硬件资源集群编排容器运行时系统。这种策略为我们提供了对Projecthub平台的微调控制和自治权,以及基础设施即代码范例带来的一系列其他好处。

我们为Projecthub平台运行Jira DC(数据中心)版本。这里是规格

在容器和k8上运行Jira的好处

使用k8s模型有以下好处-

容器环境

泊坞窗容器图像是一个轻量级的,独立的软件,包括运行的应用程序所需的所有可执行程序包:代码,运行时,系统工具,系统库和设置相反的虚拟化硬件堆栈与虚拟机的方法,容器虚拟化在操作系统层面,与直接运行在操作系统内核之上的多个容器。这意味着,容器是更为轻巧的:它们共享的操作系统内核,启动速度更快,并使用比引导整个操作系统内存的一小部分

Atlassian Jira的官方docker镜像运行在基于linux的(容器操作系统)上openjdk8基地图片。对于Projecthub,我们创建了一个自定义的Wayfair特定docker镜像,它从官方的Atlassian docker镜像扩展而来。

高可用性

Jira DC版实现经由主动群集和自动故障转移的高可用性。随着主动群集,每个Projecthub荚本质上是一个活跃的吉拉实例,这是能够服务请求。如果一个吊舱失败/模具,负载均衡器会自动故障转移到剩余的活动荚会话。大多数用户不会注意到任何停机时间,因为他们会从失败的吊舱被自动引导到积极的吊舱他们的下一个请求。

自动恢复

一个K8S的主要优势是高弹性和自我修复。分离舱具有一restartPolicy包含可能值的字段总是,onFailure处,从来没有。默认值为Always。如果我们的任何Jira安装在一个指定吊舱死亡,k8s旋转另一个“Jira吊舱”作为替代,无需人工干预。

因此,吉拉的最小数量在我们的生产集群复制品/荚始终保持恒定的,即使在断电无需停机或性能下降。

声明性配置(下文代码)

在K8S一切是表示该系统的期望状态(相对于一系列的传统方法的说明)的声明性配置对象。作为一个例子,考虑运行吉拉DC实例3个副本的任务。随着势在必行配置和传统的虚拟机,这将是,跑A,跑B,跑C然而,用声明的结构,仅仅是“副本= 3”。用户错误是可以避免的,因为一切都是脚本化的。

可扩展性

随着K8S,我们可以立即扩展,不必重复管理任务。通过我们的头盔图表,吉拉应用和环境中存在的代码,所以他们是通过自动化立即重现性。缩放可以通过手动的一行变化码展开时或经由HPA和指标如资源利用率,没有自动来实现。的请求等从理论上讲,我们可以还通过简单kubectl命令实现手动缩放 -kubectl规模statefulset projecthub -replicas = 8

零停机时间部署和升级

吉拉是有状态的应用程序。对于Projecthub我们使用StatefulSet用RollingUpdate策略,这是一种自动更新策略。这保证了Jira pods的有序创建。

  • 对于具有N个一个StatefulSet复制品,当吊舱正在部署,它们依次从{0..N-1}创建,为了。
  • 当Pods被删除时,它们将从{N-1..0}以相反的顺序终止。

由于K8S基于不可变的基础设施,为吉拉部署和升级,我们只是建立一个新的集装箱图像与新的标签和部署。豆荚删除和重新创建(与新版本),并以相反次序顺序一次一个。因此,在任何时候,只有一个荚下来,而剩下的人仍然可以请求提供服务。这使得零停机时间为我们展开时与升级。

Jira配置

Atlassian的官方docker图像提供了一组我们可以利用的box环境变量。通过在掌舵图中设置这些env变量,我们可以自动配置Jira应用程序。部署的大多数方面都可以以这种方式配置。例如,DB连接字符串如DB类型、DB驱动程序选择、DB jdbc url、用户名、密码、最大连接池大小、JVM最小/最大内存等都是env变量。

健康检查

Kubernetes提供了关键机制,允许我们监视Jira容器的运行状况,并在出现故障时重新启动它们:探测和重启策略。探针(活性和准备状态)是可执行的操作,检查指定的条件是否满足。pod的重启策略为失败的容器指定操作。

Projecthub的就绪探测确保容器已经准备好开始接受流量。当一个Pod的Jira DC容器准备好时,它就被认为准备好了。

Projecthub的活跃度探头验证我们的应用程序仍在运行,如果它注意到什么是错将重新启动陷入困境的吊舱。我们可以指定一个端点击中多久检查它。

日志记录和监控

我们有如下的记录和地方监测装置 -

  1. 通过Kibana日志

所有从Kubernetes运行的应用程序日志被运到我们的Kibana集群。根据日志的方式产生,他们被送到两个不同的位置。

使用标准Wayfair日志库的应用程序日志被分发到各自的Kibana集群中。这些日志位于:https://kibanaapplog.csnzoo.com/

Jira容器STDOUT/STDERR日志被发送到Kubernetes特定的Kibana集群。这些日志位于:https://kibanak8s.csnzoo.com/

2.资源监控

Grafana是一个强大的数据可视化UI,它允许用户使用各种后端数据源构建丰富的仪表板。Projecthub利用Grafana监视一般运行状况和资源,如cpu、ram使用情况、pod带宽等。

  1. 通过Datadog的性能指标和警报

APM(应用性能监控)提供应用程序跟踪,所以你可以看到一个请求移动通过你的服务,从前端至后端的DB /缓存层。在Wayfair,我们使用DataDog的APM使用全栈跟踪来测量Projecthub。发送Projecthub度量到普罗米修斯,然后被DataDog部署刮走。

下面给出的性能仪表板Projecthub的快照。

Slack通知也配置为提醒我们系统上可能出现的退化和中断。

  1. DB通过Solarwinds的监控

在Wayfair,我们使用太阳风来监控数据库的运行状况和使用情况。solarwind允许我们看到挂起的进程、内存使用、长时间的数据库调用、查询执行的太频繁等等。它可以让我们深入到10分钟,日视图和调试DB的性能区间。