有关kubernetes部署的问题

问题描述 投票:0回答:2

我们希望实现以下目标:

  • Magento商店在Google Kubernet上运行
  • 通过配置文件进行部署(例如stage.yaml,live.yaml)等。
  • PHP 7.2
  • MySQL 5.6 / MariaDB
  • Redis的
  • nginx的:高山
  • HTTPS
  • Magento和MySQL的持续量索赔

我现在正在学习kubernetes几周,但我正在努力解决一些设计概念,并提出了一些基本问题。

我首先尝试使用docker-compose,而不是通过Dockerfiles构建docker图像,偶然发现了helm和kubectl。现在我遇到了建筑吊舱和建筑部署。现在我知道很多不同的东西,但是现实生活中的例子或一些最佳实践知识将会受到赞赏。谷歌很棒......但似乎不只有一种方式。

1. Regarding Pods

我明白,pod应该能够轻松更换/销毁/重新创建......

有没有更好的POD配置 - 如nginx容器 - php容器 - mysql容器 - redis容器编辑:正如我刚刚读到的那样,pods共享一个IP地址所以在这里包含mysql或redis是没有意义的,对吧?

或更好的一个pod与 - mysql容器和一个容器的容器 - nginx - php

另一个带有 - redis容器

2. Mounting a persistent volume claim or a remote webroot like /var/www/html locally to work on.

本地webroot的内容来自git repo。

3. Handling of type: pod vs. type:deployment

我可以创建一个yaml文件来定义我的pod中的容器(类型:pod)。但我也可以定义deployment.yaml(类型:部署)。

我是否必须在deployment.yaml中引用我的pod.yaml,或者部署是否包括所有pod配置并替换pod.yaml?

deployment kubernetes google-kubernetes-engine
2个回答
2
投票

关于豆荚。您可以创建一个包含所需内容的窗格。但那将是非常肥胖的豆荚。请记住,pod仅在一个节点上运行,不能在一个节点上部分运行一个pod,而在另一个节点上部分运行pod。一个pod仅在一个节点上运行。这意味着从可扩展性的角度来看,许多小型播放器比一个大型播放器要好。许多小容器通常也在节点之间提供更均匀的资源和负载分配。

此外,当您更新pod中的一个容器时 - 整个pod将重新启动。因此,如果您在同一个窗格中有应用程序和数据库 - 如果您更新应用程序代码 - 数据库也将重新启动。不酷,嗯?

但在某些情况下,在一个吊舱中运行几个容器可能是合理的。请记住,pod中的所有容器共享网络地址和localhost。因此,pod中的容器具有非常低的网络延迟。

pod中的容器也可以在彼此之间共享卷。这在某些情况下也很重要。

持久卷您无法将Git存储库装入pod。好吧,至少那不是你应该做的。您应该将您的webroot打包到Docker镜像中并在Kubernetes中运行它。这应该由Jenkins完成,它可以在提交的基础上构建。

或者,如果要在部署副本之间共享文件,则可以将文件放在共享持久卷上。这也是可能的,您必须找到可以在多个pod之间共享的所谓的ReadWriteMany卷,如NFS或GlusterFS。


1
投票

通过配置文件进行部署(例如stage.yaml,live.yaml)等。

我发现Helm可以很好地解决这个问题。可以在YAML文件中使用相应的一组“值”部署头盔“图表”,这些“图表”可用于配置整个部署的各个部分。

Helm的一个有用的部分是有a standard library of charts。如果您说需要MySQL,可以使用helm install stable/mysql并获得预先打包的安装,而无需担心有状态集,持久卷等的具体细节。

您将此处建议的所有内容打包到一个图表中,该图表将包含用于不同Kubernetes部分的多个(模板化)YAML文件。

处理类型:pod与类型:部署

部署将创建一些(可配置的)pod的相同副本。部署规范中的pod规范包含它需要的所有详细信息。部署YAML替换现有的pod YAML。

您通常不直接创建pod。特别是升级生命周期可能有点棘手,而且部署可以为您完成所有艰苦的工作。

拥有像POD这样的POD配置会更好吗?

请记住,事情的一般操作是部署将创建一些pod的副本。当您拥有该软件的更新版本时,您可以将其推送到Docker映像存储库并更改部署规范中的映像标记。 Kubernetes将使用新的pod规范启动pod的额外副本,然后销毁旧版本。

这里有两条基本规则:

  1. 如果组件的生命周期不同,则它们需要处于不同的部署中。例如,您不希望在更新代码时销毁数据库,因此这些需要在单独的部署中。
  2. 如果副本数量不同,则需要进行不同的部署。您的主要服务可能需要3或5个副本,具体取决于负载; nginx只是路由HTTP消息,可能只需要1或3;数据库无法复制,只能使用1。

在您显示的设置中,我将有四个单独的部署,分别用于MySQL,Redis,nginx代理和主应用程序。

webroot的内容来自git repo。

最简单的方法是将其构建为图像,可能是nginx图像。

如果它是“大”(大小为千兆字节),你可能会发现在Kubernetes之外的某个地方完全托管这个静态内容会更有用。任何有静态文件托管的东西都可以正常工作。

据我所知,在没有编写容器的情况下将任意内容复制到持久卷中的方法并不简单。


你的问题根本没有提到Kubernetes服务。这些是核心,你应该阅读它们。特别是在您的应用程序与两个数据存储进行通信的情况下,它将直接引用服务而不是MySQL pod。

根据您的环境,还可以考虑在Kubernetes之外托管数据库的可能性。它们的生命周期与您的应用程序容器非常不同:您永远不想停止数据库,并且您真的不希望意外删除数据库的托管存储。您可能会发现使用裸机数据库设置或使用托管数据库设置更容易,更安全。 (我个人的经验主要是使用AWS,你可以使用RDS作为MySQL实例,使用Elasticache for Redis,使用S3作为上面讨论的静态文件托管。)

© www.soinside.com 2019 - 2024. All rights reserved.