当前位置: 首页 > 科技观察

在本地开发中使用Kubernetes

时间:2023-03-22 00:24:33 科技观察

【编者按】本文介绍一款解决Kubenetes应用本地开发痛点的工具——Skaffold。作者通过实例向大家展示了整个使用过程,值得参考。在过去的几年里,我在我共同创立的Node.js咨询公司RisingStack和GoDaddy的生产中大规模使用了Kubernetes。最常见的挑战之一是缺乏使开发人员能够在本地而不是在真正的Kubernetes集群上开发服务的适当工具。实际上,这意味着开发人员在开发或生产之外运行本地实例,这远非理想:如果不在本地运行这些服务,调试就会变得非常具有挑战性。就在几天前,我接触到了Skaffold,这是一个旨在促进Kubernetes应用程序持续开发的命令行工具。在本文中,我将向您展示如何借助Skaffold和Kubernetes开发Node.js应用程序。Skaffold是一个命令行工具,旨在促进Kubernetes应用程序的持续开发。您可以在本地迭代应用程序源代码,然后将其部署到本地或远程Kubernetes集群。Skaffold处理构建、上传和应用程序部署工作流。它是通用的,可用于自动化环境,例如CI/CD管道,以实现相同的工作流程,并作为将应用程序迁移到生产环境时的工具。——Skaffold官方文档在实践中,Skaffold可以:检测代码变化,自动构建,上传部署自动更新镜像的标签,让你不再需要手动修改Kubernetesmanifest文件来构建/部署/上传不同的应用一次,所以微服务支持开发和生产环境是完全没问题的,只需运行一次清单,或者持续观察变化为了简单起见,我选择了Minikube)确保安装了kubectl安装后确保安装了Docker以上依赖项,访问Skaffold发布页面,下载适合您系统的版本,并将其添加到PATH。使用Skaffold开发Node.js应用程序让我们开始开发一个简单的Node.js应用程序——没有魔法,只是一个基于Express的愚蠢的HTTP服务器:constexpress=require('express')constapp=express()app.get('/',function(req,res){res.json({status:'ok'})})app.listen(3000,err=>{if(err){throwerr}console.log('serverislistening')})接下来,创建一个Dockerfile来容器化应用程序:FROMnode:8.10.0-alpineWORKDIR/usr/src/appCOPYpackage.json.COPYpackage-lock.json.RUNnpminstallCOPY..EXPOSE3000CMDnodeindex.js用于在Kubernetes中运行对于这个应用程序,我们创建一个部署并通过服务公开部署。为此,我使用:#k8s-app.ymlapiVersion:extensions/v1beta1kind:Deploymentmetadata:name:node-appspec:replicas:1template:metadata:labels:app:node-appspec:containers:-name:node-appimage:IMAGE_NAMEports:-containerPort:3000---apiVersion:v1kind:Servicemetadata:name:node-applabels:app:node-appspec:selector:app:node-appports:-port:3000protocol:TCPnodePort:30003type:LoadBalancer现在可以通过dockerbuild.命令创建容器化应用程序。但是,这种方式只会构建镜像,不会在Kubernetes集群中运行容器。这就需要Skaffold的帮助了。Skaffold使用YAML来描述工作流。对于上述应用程序,该文件将如下所示:#skaffold.yamlapiVersion:skaffold/v1alpha1kind:Configbuild:artifacts:-imageName:node-appworkspace:.local:{}deploy:kubectl:manifests:-paths:-k8s-app.ymlparameters:IMAGE_NAME:node-app如您所见,配置文件有两个主要部分:构建部分和部署部分。在构建部分,我们可以定义我们想要创建的构建(主要是Docker镜像),在部署部分,我们可以定义我们想要在Kubernetes中看到的资源(例如服务或部署)。paths数组告诉SkaffoldKubernetes清单所在的位置。通过参数,您可以将变量注入到清单中。更多细节请参考Skaffold注解示例。通过以上步骤,你已经完成了Skaffold的配置。如果您已经使用Kubernetes部署应用程序,那么您可以轻松地重用您的Dockerfile和Kubernetes清单,只需编写Skaffold的yaml文件即可。在运行Skaffold之前,需要启动Minikube(使用minikubestart),然后运行Skaffold:skaffolddevStartingbuild...FoundminikubeorDockerforDesktopcontext,usinglocaldockerdaemon.SendingbuildcontexttoDockerdaemon2.014MBStep1/8:FROMnode:8.6.0-alpine--->b7e15c83cdafORKStepWDIRK2/8:usr/src/app--->Usingcache--->e4cf80f4e3d6Step3/8:COPYpackage.json.--->Usingcache--->78f285cee4cbStep4/8:COPYpackage-lock.json.--->Usingcache--->52c2cc2364feStep5/8:RUNnpminstall--->Usingcache--->f773a4b93a4bStep6/8:COPY..--->b0cc2a87fe89Step7/8:EXPOSE3000--->Runningincd4d940ddaff--->e2f558c9f067Step8/8:CMDnodeindex.js--->Runningin4ff7252ba2-->5b62e8667662Successfullybuilt5b62e8667662Successfullytagged71dba0517e741b4c8a11728cf905fe84:latestSuccessfullytaggednode-app:5b62e86676627e49417af333b8da588b728bd3c9e5d777f6db5565d0e7a91015Buildcomplete.Startingdeploy...Deployingk8s-app.yml...Deploycomplete.[node-app-5d4df6585b-r87lknode-app]serverislistening一旦修改你的文件,Skaffold会自动将其重新部署到Kubernetes,您可以通过执行minikubeservice[service-name]来访问您的服务。在我们的示例中,它是minikube服务节点应用程序。这将打开您的默认浏览器并访问您刚刚部署的Node.js应用程序。希望本教程能帮助大家节省开发Kubernetes服务的时间,本人也是Skaffold新手,如有遗漏请在评论中留言!您可以从我的GitHub查看整个示例项目。