车里雅宾斯克的南桥和Kubernetes的Bitrix

在车里雅宾斯克,举行了Sysadminka系统管理员会议,最后,他们就如何在Kubernetes中使用1C-Bitrix上的应用程序的解决方案作了报告。


Bitrix,Kubernetes,Ceph-很棒的组合吗?


我将告诉您我们如何将所有这些整合在一起。


走吧



米塔普于4月18日在车里雅宾斯克举行。 您可以在Timepad中阅读有关我们的mitap的内容,并在YouTube观看


如果您想通过报告或作为听众来找我们-欢迎来到Wellcome,请致信vadim.isakanov@gmail.com和Telegram t.me/vadimisakanov。


我的报告


Kubernetes Bitrix报告视频


滑梯


Kubernetes Southbridge 1.0解决方案中的Bitrix


我将按照在会议上所做的那样,以“针对Kubernetes中的虚拟对象”的格式讨论我们的解决方案。 但我想至少在Wikipedia文章级别上,您会知道Bitrix,Docker,Kubernetes,Ceph这两个词。


您对Kubernetes中的Bitrix有什么了解?


在Internet上,关于Kubernetes中Bitrix上应用程序的操作的信息很少。
我只找到这样的材料:


Qsoft的Alexander Serbul,1C-Bitrix和Anton Tuzlukov的报告:



我建议听。


Habré上的用户Serkyron开发自己的解决方案。
我也找到了这样的解决方案


III ...实际上。


我警告您,我们没有使用上面的链接检查解决方案的质量:-)
顺便说一下,在准备我们的解决方案时,我与Alexander Serbul进行了交谈,当时他的报告还没有,所以在我的幻灯片中有“ Bitrix不使用Kubernetes”项。


但是已经有很多现成的Docker映像供Bitrix在Docker中工作: https ://hub.docker.com/search?q=bitrix&type=image


这足以在Kubernetes中创建完整的Bitrix解决方案吗?
不行 有很多问题需要解决。


Kubernetes中Bitrix有什么问题?


首先-Dockerhub现成的映像不适合Kubernetes


如果我们要构建一个微服务架构(通常在Kubernetes中需要),则需要将Kubernetes中的应用程序划分为多个容器,并确保每个容器都执行一个小功能(并且做得很好)。 为什么只有一个? 简而言之-更简单,更可靠。
如果要更真实,请查看本文和视频,请访问: https : //habr.com/en/company/southbridge/blog/426637/


Dockerhub中的Docker映像主要基于“多合一”原理构建,因此我们仍然必须自己动手甚至从头开始创建映像。


其次-网站代码是从管理面板中编辑的


我们在网站上创建了一个新部分-代码已更新(添加了具有新部分名称的目录)。


从管理面板更改了组件属性-代码已更改。


Kubernetes“默认”不知道如何使用它,容器必须是无状态的。


原因:群集中的每个容器(子)仅处理部分流量。 如果仅在一个容器(底部)中更改代码,则在不同的窗格中,代码将不同,站点将以不同的方式工作,站点的不同版本将显示给不同的用户。 你不能那样生活。


第三-您需要解决部署问题


如果我们有一个整体和一个“经典”服务器,那么一切都非常简单:我们部署一个新的代码库,迁移数据库,将流量切换到新版本的代码。 切换立即发生。
如果我们在Kubernetes中有一个网站,它被锯成微服务,那么会有许多带有代码的容器。 您需要使用新版本的代码来收集容器,将其替换为旧的容器,正确执行数据库迁移,并且最好对访问者隐式地进行。 幸运的是,Kubernetes在这方面为我们提供了帮助,它支持整个不同类型的部署云。


第四-您需要解决静态存储的问题


如果您的站点仅重10 GB,并且完全将其部署在容器中,则将获得重10 GB的容器,这些容器将永远被部署。
您需要将站点中最“繁重”的部分存储在容器之外,而问题出在如何正确执行


我们的决定中没有什么


完整的微功能/微服务Bitrix代码没有被削减(因此注册是分开的,在线商店的模块是分开的,等等)。 我们将整个代码库存储在每个容器中。


我们也不会将库存储在Kubernetes中(不过我还是在Kubernetes中为开发人员环境(而不是生产环境)实现了基于库的解决方案)。


网站管理员仍然会注意到该网站可以在Kubernetes中运行。 “系统检查”功能无法正常运行,要从管理面板编辑站点代码,必须首先单击“我要编辑代码”按钮。


我们确定了问题,确定了实现微服务的必要性,目标很明确-获得一个可在Kubernetes中处理Bitrix应用程序的工作系统,同时保留Bitrix的功能和Kubernetes的优势。 我们开始执行。


建筑学


Web服务器(工作人员)有很多“工作”的壁炉。
一顶冠下(可能只有一个)。
一种从管理面板编辑站点代码的升级(也只需一项)。



我们解决问题:


  • 会话存储在哪里?
  • 在哪里存储缓存?
  • 在哪里存储静态变量,而不是在容器堆中放置千兆字节的静态变量
  • 数据库将如何工作?

Docker镜像


我们首先构建一个Docker映像。


理想的选择是拥有一个通用映像,在此基础上,我们可以同时获得工作区,带有括号的区和升级区。


我们就是这样拍的


它包括nginx,apache / php-fpm(可在汇编过程中选择),用于发送邮件的msmtp和cron。


组装图像时,该站点的完整代码库将复制到/ app目录(除了那些放在单独的共享存储中的部分)。


微服务,服务


工人炉膛:


  • Nginx + Apache / php-fpm + msmtp容器的容器
  • msmtp没有在单独的微服务中解决,Bitrix开始怨恨它无法直接发送邮件
  • 每个容器都有完整的代码库。
  • 禁止更改容器中的代码。

cron下:


  • 带有Apache,PHP,Cron的容器
  • 包括完整的代码库
  • 禁止更改容器中的代码

升级下:


  • Nginx + Apache / php-fpm + msmtp容器的容器
  • 没有禁止更改容器中的代码的禁令

会话存储


Bitrix缓存存储


更重要的是:我们存储密码,以连接到数据库到kubernetes机密邮件中的所有内容。 我们获得了奖励,密码仅对我们授予机密访问权限的人员可见,而对有权访问该项目代码库的每个人都不可见。


静态储存


您可以使用任何东西:ceph,nfs(但不建议在生产中使用nfs),来自“云”提供商的网络存储等。


该存储将需要通过容器连接到站点的/ upload /目录以及其他具有静态目录的目录。


资料库


为了简单起见,我们建议将基础移到Kubernetes之外。 Kubernetes的基础是一个单独的复杂任务,它将使电路变得更加复杂。


会话存储


我们使用memcached :)


它在存储会话,群集方面做得很好,并且在php中作为session.save_path本身受支持。 当我们用大量的Web服务器构建集群时,这种系统在经典的整体架构中已经被设计了很多次。 对于部署,我们使用头盔。


$ helm install stable/memcached --name session 

php.ini-图像设置中的此处设置用于在memcached中存储会话


我们使用环境变量通过memcached https://kubernetes.io/docs/tasks/inject-data-application/define-environment-variable-container/传输主机数据。
这使您可以在dev,stage,test,prod等环境中使用相同的代码(其中的内存缓存主机名称将有所不同,因此我们需要将会话的唯一主机名传输到每个环境)。
Bitrix缓存存储


我们需要一个故障安全存储,所有炉膛都可以在其中写入,并且可以从中读取。


我们还使用memcached。
Bitrix自己推荐此解决方案。


 $ helm install stable/memcached --name cache 

bitrix / .settings_extra.php-在Bitrix中,此处设置了我们存储缓存的位置


我们还使用环境变量。


克龙塔斯基


在Kubernetes中执行crontab的方法有很多。


  • 带炉膛的独立部署
  • 用于执行crontask的cronjob(如果它是一个Web应用程序-使用wget https:// $ host $ cronjobname或工人炉膛之一内的kubectl exec等)

您可以争论最正确的方法,但是在这种情况下,我们选择了选项“将Pod与crontask分开部署”


怎么做:


  • 通过ConfigMap或通过config / addcron添加王冠
  • 在一种情况下,运行一个与worker sub相同的容器+允许在其中执行Crown任务
  • 使用相同的代码库,由于统一,容器的组装很简单

我们得到什么好处:


  • 我们在与开发环境相同的环境中使用crontaski(docker)
  • Krontaski无需为Kubernetes进行“重写”,它们的工作方式与以前相同,并且代码库相同
  • 王冠成员可以将具有提交权限的所有团队成员添加到生产分支,而不仅仅是管理员

南桥K8SDeploy模块和从管理面板编辑代码


我们在谈论升级吗?
以及如何将交通引向那里?
Hooray,我们在php中为此编写了一个模块:)这是Bitrix的经典小模块。 它尚未公开可用,但我们计划将其打开。
该模块在Bitrix中作为常规模块安装:



它看起来像这样:



它允许您设置一个cookie,该cookie可以标识站点管理员并允许Kubernetes发送要升级的流量。


更改完成后,您需要单击git push,代码更改将发送到git,然后系统将使用新版本的代码收集映像,并将其“滚动”到整个群集中,以替换旧的pod。


是的,这有点曲折,但同时,我们维护微服务架构,并且不要让Bitrix用户有机会通过管理面板更正代码。 最后,这是一个选项,您可以用其他方式解决编辑代码的问题。


舵图


为了在Kubernetes中构建应用程序,我们通常使用Helm软件包管理器。
对于我们在Kubernetes的Bitrix解决方案,我们的首席系统管理员Sergey Bondarev编写​​了一个特殊的Helm图表。


它构建了worker,ugrade,cron炉床,配置入口,服务,将变量从Kubernetes机密传递到炉床。


我们将代码存储在Gitlab中,并且还运行来自Gitlab的Helm程序集。


简而言之,看起来像这样


 $ helm upgrade --install project .helm --set image=registrygitlab.local/k8s/bitrix -f .helm/values.yaml --wait --timeout 300 --debug --tiller-namespace=production 

如果在部署过程中出现问题,Helm还允许您进行“无缝”回滚。 当您不必慌乱地“为ftp修复代码,因为产品已掉落”,而Kubernetes会自动执行它而又不会造成停机时,这真是太好了。


部署


是的,我们是Gitlab&Gitlab CI的粉丝,请使用它:)
当在项目存储库中提交到Gitlab时,Gitlab启动一个管道,该管道将部署新版本的环境。


阶段:


  • 构建(构建新的Docker映像)
  • 测试(测试)
  • 清理(​​删除测试环境)
  • 推送(发送到Docker注册表)
  • 部署(我们通过Helm在Kubernetes中部署应用程序)。


华友世纪,我们准备介绍它!
好吧,或者问问题,如果有的话。


那我们做了什么


从技术角度来看:


  • dockerized Bitrix;
  • 将Bitrix“切割”到容器中,每个容器执行最少的功能;
  • 实现容器的无状态状态;
  • 解决了在Kubernetes中更新Bitrix的问题;
  • Bitrix的所有功能继续起作用(几乎所有功能);
  • 在Kubernetes中进行了部署并在版本之间进行了回滚。

从业务角度来看:


  • 容错
  • Kubernetes工具(易于与Gitlab CI集成,无缝部署等);
  • 秘密密码(仅对那些直接授予密码访问权限的用户可见);
  • 在单个基础架构中创建其他环境(用于开发,测试等)非常方便。

Source: https://habr.com/ru/post/zh-CN456608/


All Articles