Laravel是一个优秀的PHP应用程序开发框架。无论您是需要制作新想法的原型、开发MVP(最小可行产品),还是发布成熟的企业系统,Laravel都能促进所有开发任务和工作流程。如何部署应用程序是一个非常有选择性的问题。Vagrant非常适合设置类似于远程服务器的本地环境。但是,在生产环境中,您可能需要的不仅仅是Web主机和数据库。您可以为多个请求提供单独的服务。您还需要有适当的机制来确保应用程序始终在线并且服务器可以有效地进行负载平衡。在本文中,我将介绍如何在Kubernetes上搭建一个简单的Laravel应用环境。什么是Kubernetes?为什么要使用它?Kubernetes是谷歌发起的开源系统,旨在提高在集群环境中管理容器化应用程序的效率。有人将其称为容器编排平台,而Kubernetes并不是唯一的此类平台。与竞争对手相比,它仍然享有稳固且不断增长的声誉。更不用说一旦你习惯了它,它真的很容易使用。如果您仍然想知道为什么任何人都可以愉快地使用Kubernetes,答案很简单。Kubernetes可以更轻松地部署和管理多个项目所需的大量集群。将Laravel应用程序部署到Minikube正如我之前提到的,在本文中我将展示如何将一个简单的无状态Laravel应用程序部署到Kubernetes。我将详细说明此过程中涉及的步骤,同时解释您需要做某事的原因。此外,我还将展示如何快速扩展应用程序并使用IngressController使其可通过特定域名或IP访问。您可以在多个云平台上运行Kubernetes,例如GoogleCloudEngine和AmazonWebServices。在此示例中,您将使用Minikube运行您的应用程序,这是一种可以更轻松地在本地运行Kubernetes的工具。与Vagrant类似,Minikube只是一个包含Kubernetes运行时平台和Docker的虚拟机。如果你使用真正的Kubernetes,你需要使用Docker来部署你的应用程序,你需要将运行平台扩展到三个节点。应用程序我准备了一个简单的Laravel应用程序,您可以从GitHub克隆它。它只是一个全新的Laravel安装程序。因此,您可以使用本例中的演示程序,也可以自己创建一个新的Laravel程序。如果您使用本例中的演示程序,请按照以下命令将其克隆到项目目录中。cd/to/your/working/directorygitclonegit@github.com:learnk8s/laravel-kubernetes-demo.git。先决条件要实现这个例子,你需要在你的本地系统安装以下软件:1)Docker2)Kubectl3)Minikube如果你在Windows上安装以上软件有问题,请参考Windows10中Docker和Kubernetes入门,这是一个循序渐进的教程。Docker镜像Kubernetes部署容器化应用程序,因此首先您需要为示例应用程序创建一个Docker镜像。由于您在本示例中是在本地运行Minikube,因此您只能使用示例代码中的Dockerfile创建本地Docker镜像。FROMcomposer:1.6.5作为构建WORKDIR/appCOPY。/appRUNcomposerinstallFROMphp:7.1.8-apacheEXPOSE80COPY--from=build/app/appCOPYvhost.conf/etc/apache2/sites-available/000-default.confRUNchown-Rwww-data:www-data/app\&&a2enmodrewrite这个Dockerfile由两部分组成:第一部分扩展了一个PHPcomposer镜像,这样你就可以安装应用程序依赖项。第二部分创建一个图像,其中包含将为示例应用程序提供服务的Apache服务。在测试Docker镜像之前,您需要使用以下命令构建镜像:cd/to/your/project/directorydockerbuild-tyourname/laravel-kubernetes-demo。然后使用如下命令运行demo程序:dockerrun-ti\-p8080:80\-eAPP_KEY=base64:cUPmwHx4LXa4Z25HhzFiWCf7TlQmSqnt98pnuiHmzgY=\laravel-kubernetes-demo示例程序可以通过http://localhost:8080访问.在此安装中,容器是通用的,APP_KEY不是硬编码或共享的。在Minikube中创建镜像cd/to/your/project/directoryeval$(minikubedocker-env)dockerbuild-tyourname/laravel-kubernetes-demo。不要忘记执行上面的eval命令。要在虚拟机中创建镜像,需要执行上面的eval命令。您只需要在当前终端中执行一次该命令。部署映像现在示例应用程序映像已创建并在Minikube中可用,您可以继续部署它。我总是首先确保kubectl在正确的上下文中。在此示例中,上下文是Minikube。您可以使用以下命令快速切换上下文:kubectlconfiguse-contextminikube然后您可以部署容器镜像:kubectlrunlaravel-kubernetes-demo\--image=yourname/laravel-kubernetes-demo\--port=80\--image-pull-policy=IfNotPresent\--env=APP_KEY=base64:cUPmwHx4LXa4Z25HhzFiWCf7TlQmSqnt98pnuiHmzgY=上面的命令告诉kubectl从Docker镜像运行我们的示例程序。上述命令的第一个参数告诉kubectl如果镜像存在于本地,则不要从注册表(例如DockerHub)中拉取该镜像。请注意,您仍然需要登录到Docker以便kubectl检查图像是否是最新的。您可以通过运行以下命令看到为示例程序创建了一个Pod:kubectlgetpods此命令返回类似于以下内容的输出:NAMEREADYSTATUSRESTARTSAGELaravel-kubernetes-demo-7dbb9d6b48-q54wp1/1Running018mYou也可以使用Minikube的GUI控制面板来监控集群。GUI还有助于可视化大多数经常讨论的指标。查看仪表盘,执行下级命令:minikubedashboard或获取仪表盘的URL地址:minikubedashboard--url=true暴露一个服务至此,您已经创建了一个运行示例应用容器的deployment。在集群中运行的Pod具有动态IP。如果您使用该IP并直接将流量路由到那里,您可能需要在每次重新启动pod时更新路由表。事实上,每次部署或容器重新启动时,都会有一个新的IP与此Pod相关联。为避免手动管理IP地址的需要,您需要使用服务。服务充当Pod集合中的负载均衡器。因此,即使Pod的IP地址发生变化,服务始终指向该Pod。此外,由于该服务始终具有固定IP,因此您无需手动更新任何内容。您可以使用以下命令创建服务:kubectlexposedeploymentlaravel-kubernetes-demo--type=NodePort--port=80如果一切顺利,您应该会看到类似于以下内容的确认消息:service"laravel-kubernetes-demo"exposed执行以下命令:kubectlgetservices上面的命令显示了正在运行的服务列表。您还可以通过控制面板中的“服务”导航菜单查看正在运行的服务。显然,验证部署和服务公开的更令人兴奋的方法是在浏览器中运行示例应用程序。?要获取应用程序(服务)的URL地址,可以使用如下命令:minikubeservice--url=truelaravel-kubernetes-demo以上命令会输出IP地址和端口号,例如:http://192.168.99.101:31399或者直接在浏览器中启动程序:minikubeservicelaravel-kubernetes-demo不想错过接下来的故事、实验或提示。如果您喜欢这篇文章,请期待以后更多的文章。期待新内容直接发送到您的收件箱并提高您的Kubernetes专业知识。现在请订阅扩展,您已经成功在Kubernetes中部署了您的应用程序。是兴奋的。但是做这一切有什么意义呢?您刚刚在Pod中进行了部署,在节点上公开了Web服务。让我们再部署两个当前应用程序的实例。现在你知道你在哪里,执行以下命令来获取所需和现有Pod的列表:kubectlgetdeploymentNAMEDESIREDCURRENTUP-TO-DATEAVAILABLEAGElaravel-kubernetes-demo11157m上面的输出中,每一项是“1”。您想获得三个Pod。因此,我们使用如下命令进行伸缩:kubectlscale--replicas=3deployment/laravel-kubernetes-demodeployment"laravel-kubernetes-demo"scaled命令执行完毕。您已将第一个Pod复制到另外两个,从而为您提供了三个Pod来运行服务。您可以通过执行getdeployment来检查所有这些:kubectlgetdeploymentNAMEDESIREDCURRENTUP-TO-DATEAVAILABAGElaravel-kubernetes-demo333359m您还可以在控制面板的pods页面或服务页面中查看这些。现在,您正在使用三个Pod运行应用程序的三个实例。想象一下这个场景,你的应用越来越受欢迎。成千上万的访问者使用您的网页或软件。过去,您可能很难编写脚本来创建更多实例。但是在Kubernetes中,你可以快速扩展多个实例:kubectlscale--replicas=10deployment/laravel-kubernetes-demodeployment"laravel-kubernetes-demo"scaled你可以看到用Kubernetes扩展你的网站是多么方便。Ingress你已经实现了很好的功能,部署了应用程序并扩展了它。当你指向集群(Minikube)的IP地址和节点的端口号时,你已经可以在浏览器中看到正在运行的程序。现在,您将看到是否通过指定的URL访问应用程序,就像之前部署到云端一样。为了在Kubernetes中使用URL,您需要一个Ingress。Ingress是一组允许入站连接到Kubernetes集群的规则。Ingress是必要的,因为在Kubernetes中,Pod等资源只有在集群内和集群内可路由的IP地址。也就是说,它们不能进入或离开外部环境。我在演示应用程序源代码中包含了一个包含以下内容的ingress.yaml文件:apiVersion:extensions/v1beta1kind:Ingressmetadata:name:laravel-kubernetes-demo-ingressannotations:ingress.kubernetes.io/rewrite-target:/spec:backend:serviceName:default-http-serverservicePort:80rules:-host:laravel-kubernetes.demo-http:paths:-path:/backend:serviceName:laravel-kubernetes-demoservicePort:80您期望的位置InKubernetes资源文件的基本内容,该文件定义了一组用于路由入站流量的规则。laravel-kubernetes.demo的URL会指向应用运行所在的Service,就像之前laravel-kubernetes-demo被标记在8181端口一样。如果不集成Ingress资源,则无法使用Ingress控制器,因此您需要创建一个新控制器或使用现有控制器。本教程使用NginxIngress控制器来管理路由资源。Minikube(v0.14及更高版本)附带Nginx设置作为插件,您需要手动启用此插件:minikubeaddonsenableingress请注意,Minikube可能需要几分钟才能下载并安装Nginx作为Ingress路由控制器。启用Ingress插件后,您可以通过以下方式创建Ingress实例:kubectlcreate-fpath-to-your-ingress-file.yaml您可以通过以下命令验证并获取Ingress实例信息:kubectldescribeinglaravel-kubernetes-demo-ingress输出一些与配置相关的信息:名称:laravel-kubernetes-demo-ingress命名空间:默认地址:192.168.99.101默认后端:default-http-server:80(
