Kubernetes中怎么部署应用
这期内容当中小编将会给大家带来有关Kubernetes中怎么部署应用,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。
通过Eclipse构建一个Spring Boot项目以下简称demo,其中连接mysql的property文件application-k8s.properties内容如下:
spring.datasource.url=jdbc:mysql://${MYSQL_SERVICE_HOST:127.0.0.1}:${MYSQL_SERVICE_PORT:3306}/${MYSQL_DATABASE:demo}spring.datasource.username=${MYSQL_ROOT_USER:root}spring.datasource.password=${MYSQL_ROOT_PASSWORD:123456}spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driverspring.jpa.database-platform=org.hibernate.dialect.MySQL5Dialectspring.jpa.database=MYSQL#Showornotlogforeachsqlqueryspring.jpa.show-sql=true#Hibernateddlauto(create,create-drop,update)spring.jpa.hibernate.ddl-auto=update
我们通过环境变量来指定数据库的连接参数,其中:
鸿蒙官方战略合作共建——HarmonyOS技术社区
MYSQL_SERVICE_HOST:mysql的hostname或者IP地址
MYSQL_SERVICE_PORT:mysql的端口号
MYSQL_DATABASE:连接mysql的数据库名
MYSQL_ROOT_USER:mysql的root用户名
MYSQL_ROOT_PASSWORD:mysql的root用户名密码
将demo打包成jar文件,并且用Dockerfile制作成Docker Image上传到私有Registry。
打包jar文件
mvnpackage-Dmaven.test.skip=trueINFO]Scanningforprojects...[INFO][INFO]--------------------------<com.example:demo>--------------------------[INFO]Buildingdemo0.0.1[INFO]--------------------------------[jar]---------------------------------[INFO][INFO]---maven-resources-plugin:3.1.0:resources(default-resources)@demo---[INFO]Using'UTF-8'encodingtocopyfilteredresources.[INFO]Copying4resources[INFO]Copying0resource[INFO][INFO]---maven-compiler-plugin:3.8.0:compile(default-compile)@demo---[INFO]Nothingtocompile-allclassesareuptodate[INFO][INFO]---maven-resources-plugin:3.1.0:testResources(default-testResources)@demo---[INFO]Notcopyingtestresources[INFO][INFO]---maven-compiler-plugin:3.8.0:testCompile(default-testCompile)@demo---[INFO]Notcompilingtestsources[INFO][INFO]---maven-surefire-plugin:2.22.1:test(default-test)@demo---[INFO]Testsareskipped.[INFO][INFO]---maven-jar-plugin:3.1.1:jar(default-jar)@demo---[INFO]Buildingjar:/Users/xiaobaoqiang/workspace/demo/spring-boot/target/demo.jar[INFO][INFO]---spring-boot-maven-plugin:2.1.3.RELEASE:repackage(repackage)@demo---[INFO]Replacingmainartifactwithrepackagedarchive[INFO]------------------------------------------------------------------------[INFO]BUILDSUCCESS[INFO]------------------------------------------------------------------------[INFO]Totaltime:1.731s[INFO]Finishedat:2019-03-31T12:33:52+08:00[INFO]------------------------------------------------------------------------
Dockerfile如下:
#baseimageFROMdaocloud.io/java:8#MAINTAINERMAINTAINERxiaobaoqiang@163.com#adddemo.jartodockertmpfolderADD./demo.jar/tmp#rundemo.jarpackageCMD["java","-jar","/tmp/demo.jar"]EXPOSE9999
制作Docker镜像
dockerbuild-t10.0.0.10:5000/app/demo:v2.0.SendingbuildcontexttoDockerdaemon44.18MBStep1/5:FROMdaocloud.io/java:8--->d23bdf5b1b1bStep2/5:MAINTAINERxiaobaoqiang@163.com--->Usingcache--->6a8e7ffcb8b7Step3/5:ADD./demo.jar/tmp--->11bc5f618c77Removingintermediatecontainerc3942d277805Step4/5:CMDjava-jar/tmp/demo.jar--->Runninginf877685bb056--->cb08fcc6b0a1Removingintermediatecontainerf877685bb056Step5/5:EXPOSE9999--->Runningin86a145142954--->189f73beb27aRemovingintermediatecontainer86a145142954Successfullybuilt189f73beb27a
查看Docker镜像
dockerimagesREPOSITORYTAGIMAGEIDCREATEDSIZE10.0.0.10:5000/app/demov2.0189f73beb27aAboutanhourago687MB
将制作好的Docker镜像push到私有Registry
dockerpush10.0.0.10:5000/app/demo:v2.0Thepushreferstoarepository[10.0.0.10:5000/app/demo]6a6b9dbfc663:Pushed35c20f26d188:Pushedc3fe59dd9556:Pushed6ed1a81ba5b6:Pusheda3483ce177ce:Pushedce6c8756685b:Pushed30339f20ced0:Pushed0eb22bfb707d:Pusheda2ae92ffcd29:Pushedv2.0:digest:sha256:7296321564a7ace0bf1f2e8099fb7e0e01610efec5e1d1fec0c877b236bc0f5fsize:2212
到此,我们的demo镜像已经准备就绪,下面开始准备mysql镜像。
由于国外的Docker Hub网速比较慢,我们从国内的Docker Hub拉取一个mysql的镜像到本地
dockerpulldaocloud.io/library/mysql:5.7.4
将mysql镜像打tag,并且push到我们的私有Registry
dockertagdaocloud.io/library/mysql:5.7.410.0.0.10:5000/library/mysql:5.7.4dockerpush10.0.0.10:5000/library/mysql:5.7.4Thepushreferstoarepository[10.0.0.10:5000/library/mysql]5f70bf18a086:Pushed903c114b758c:Pushedc8c909bc9ac1:Pushed6f19f89d53b4:Pushed6e82deab235b:Pushedca60b5cb617c:Pushedac906c9ec95d:Pushed4c816744690c:Pushed5.7.4:digest:sha256:afe1630e8c9bd318a5e72b2536c2daacb96b8135cc2c6d3465262b5c7b7d1831size:3846
到此,我们mysql的镜像也准备就绪,下面开始部署我们的demo应用和mysql
创建mysql的部署yaml文件mysql-deployment.yaml
apiVersion:v1kind:Servicemetadata:name:mysqllabels:app:mysqlspec:ports:-port:3306selector:app:mysqlclusterIP:None---apiVersion:apps/v1#fork8sversionsbefore1.9.0useapps/v1beta2andbefore1.8.0useextensions/v1beta1kind:Deploymentmetadata:name:mysqllabels:app:mysqlspec:selector:matchLabels:app:mysqltemplate:metadata:labels:app:mysqlspec:containers:-image:10.0.0.10:5000/library/mysql:5.7.4name:mysqlenv:-name:MYSQL_ROOT_PASSWORDvalue:"123456"-name:MYSQL_DATABASEvalue:"demo"livenessProbe:tcpSocket:port:3306ports:-containerPort:3306name:mysql
通过环境变量初始化了一些参数:
鸿蒙官方战略合作共建——HarmonyOS技术社区
MYSQL_ROOT_PASSWORD为mysql的root密码
MYSQL_DATABASE为mysql启动后默认创建的数据库
创建demo应用部署的yaml文件demo-mysql-k8s.yaml
#-------------------DemoDeployment-------------------#kind:DeploymentapiVersion:apps/v1metadata:labels:name:demoname:demospec:selector:matchLabels:app:demotemplate:metadata:labels:app:demospec:containers:-name:demoimage:10.0.0.10:5000/app/demo:v2.0ports:-containerPort:9999protocol:TCPenv:-name:MYSQL_SERVICE_HOSTvalue:'172.18.45.2'-name:MYSQL_SERVICE_PORTvalue:"3306"-name:MYSQL_DATABASEvalue:"demo"-name:MYSQL_ROOT_USERvalue:"root"-name:MYSQL_ROOT_PASSWORDvalue:"123456"livenessProbe:httpGet:scheme:HTTPpath:/service/v1/demoport:9999initialDelaySeconds:30timeoutSeconds:30---#-------------------DemoService-------------------#kind:ServiceapiVersion:v1metadata:labels:name:demoname:demospec:ports:-port:9900targetPort:9999selector:app:demo
通过环境变量初始化了一些参数,这些参数与application-k8s.properties中的环境变量名对应,其中MYSQL_SERVICE_HOST是mysql部署后的enpoint IP地址。
通过kubectl命令行开始部署
kubectlapply-fmysql-deployment.yamlservice/mysqlcreateddeployment.apps/mysqlcreated
查看mysql的endpoint IP地址
kubectlgetserviceNAMETYPECLUSTER-IPEXTERNAL-IPPORT(S)AGEkubernetesClusterIP172.10.12.1<none>443/TCP63dmysqlClusterIPNone<none>3306/TCP121mkubectldescribeservicemysqlName:mysqlNamespace:defaultLabels:app=mysqlAnnotations:kubectl.kubernetes.io/last-applied-configuration:{"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"labels":{"app":"mysql"},"name":"mysql","namespace":"default"},"spec":{"c...Selector:app=mysqlType:ClusterIPIP:NonePort:<unset>3306/TCPTargetPort:3306/TCPEndpoints:172.18.45.2:3306SessionAffinity:NoneEvents:<none>
可以看到mysql的enpoint IP地址是172.18.45.2,端口号是3306。
部署demo应用
kubectlapply-fdemo-mysql-k8s.yamldeployment.apps/democreatedservice/democreatedkubectlgetpodsNAMEREADYSTATUSRESTARTSAGEdemo-d4cd5bfdd-8qpfw1/1Running03smysql-6f76465564-j8dq21/1Running060m
查看demo启动的日志
kubectllogsdemo-d4cd5bfdd-8qpfw._________/\\/___'_____(_)______\\\\(()\___|'_|'_||'_\/_`|\\\\\\/___)||_)|||||||(_||))))'|____|.__|_||_|_||_\__,|////=========|_|==============|___/=/_/_/_/::SpringBoot::(v2.1.3.RELEASE)2019-03-3103:55:08.236INFO1---[main]com.example.demo.DemoApplication:StartingDemoApplicationv0.0.1ondemo-d4cd5bfdd-8qpfwwithPID1(/tmp/demo.jarstartedbyrootin/)2019-03-3103:55:08.245INFO1---[main]com.example.demo.DemoApplication:Thefollowingprofilesareactive:k8s2019-03-3103:55:09.149INFO1---[main].s.d.r.c.RepositoryConfigurationDelegate:BootstrappingSpringDatarepositoriesinDEFAULTmode.2019-03-3103:55:09.204INFO1---[main].s.d.r.c.RepositoryConfigurationDelegate:FinishedSpringDatarepositoryscanningin51ms.Found1repositoryinterfaces.2019-03-3103:55:09.516INFO1---[main]trationDelegate$BeanPostProcessorChecker:Bean'org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration'oftype[org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration$$EnhancerBySpringCGLIB$$eb5e36c]isnoteligibleforgettingprocessedbyallBeanPostProcessors(forexample:noteligibleforauto-proxying)2019-03-3103:55:09.782INFO1---[main]o.s.b.w.embedded.tomcat.TomcatWebServer:Tomcatinitializedwithport(s):9999(http)2019-03-3103:55:09.807INFO1---[main]o.apache.catalina.core.StandardService:Startingservice[Tomcat]2019-03-3103:55:09.807INFO1---[main]org.apache.catalina.core.StandardEngine:StartingServletengine:[ApacheTomcat/9.0.16]2019-03-3103:55:09.814INFO1---[main]o.a.catalina.core.AprLifecycleListener:TheAPRbasedApacheTomcatNativelibrarywhichallowsoptimalperformanceinproductionenvironmentswasnotfoundonthejava.library.path:[/usr/java/packages/lib/amd64:/usr/lib/x86_64-linux-gnu/jni:/lib/x86_64-linux-gnu:/usr/lib/x86_64-linux-gnu:/usr/lib/jni:/lib:/usr/lib]2019-03-3103:55:09.881INFO1---[main]o.a.c.c.C.[Tomcat].[localhost].[/]:InitializingSpringembeddedWebApplicationContext2019-03-3103:55:09.881INFO1---[main]o.s.web.context.ContextLoader:RootWebApplicationContext:initializationcompletedin1593ms2019-03-3103:55:10.129INFO1---[main]o.hibernate.jpa.internal.util.LogHelper:HHH000204:ProcessingPersistenceUnitInfo[name:default...]2019-03-3103:55:10.179INFO1---[main]org.hibernate.Version:HHH000412:HibernateCore{5.3.7.Final}2019-03-3103:55:10.180INFO1---[main]org.hibernate.cfg.Environment:HHH000206:hibernate.propertiesnotfound2019-03-3103:55:10.284INFO1---[main]o.hibernate.annotations.common.Version:HCANN000001:HibernateCommonsAnnotations{5.0.4.Final}2019-03-3103:55:10.444INFO1---[main]com.zaxxer.hikari.HikariDataSource:HikariPool-1-Starting...2019-03-3103:55:20.542INFO1---[main]com.zaxxer.hikari.HikariDataSource:HikariPool-1-Startcompleted.2019-03-3103:55:20.551INFO1---[main]org.hibernate.dialect.Dialect:HHH000400:Usingdialect:org.hibernate.dialect.MySQL5DialectHibernate:createtabledemo_users(idintegernotnull,birth_daydatetime,create_datedatetime,emailvarchar(255),namevarchar(255),sexinteger,primarykey(id))engine=MyISAMHibernate:createtablehibernate_sequence(next_valbigint)engine=MyISAMHibernate:insertintohibernate_sequencevalues(1)2019-03-3103:55:20.984INFO1---[main]j.LocalContainerEntityManagerFactoryBean:InitializedJPAEntityManagerFactoryforpersistenceunit'default'2019-03-3103:55:21.315WARN1---[main]aWebConfiguration$JpaWebMvcConfiguration:spring.jpa.open-in-viewisenabledbydefault.Therefore,databasequeriesmaybeperformedduringviewrendering.Explicitlyconfigurespring.jpa.open-in-viewtodisablethiswarning2019-03-3103:55:21.408INFO1---[main]pertySourcedRequestMappingHandlerMapping:MappedURLpath[/v2/api-docs]ontomethod[publicorg.springframework.http.ResponseEntity<springfox.documentation.spring.web.json.Json>springfox.documentation.swagger2.web.Swagger2Controller.getDocumentation(java.lang.String,javax.servlet.http.HttpServletRequest)]2019-03-3103:55:21.504INFO1---[main]o.s.s.concurrent.ThreadPoolTaskExecutor:InitializingExecutorService'applicationTaskExecutor'2019-03-3103:55:21.801INFO1---[main]d.s.w.p.DocumentationPluginsBootstrapper:Contextrefreshed2019-03-3103:55:21.821INFO1---[main]d.s.w.p.DocumentationPluginsBootstrapper:Found1customdocumentationplugin(s)2019-03-3103:55:21.844INFO1---[main]s.d.s.w.s.ApiListingReferenceScanner:Scanningforapilistingreferences2019-03-3103:55:22.118INFO1---[main]o.s.b.w.embedded.tomcat.TomcatWebServer:Tomcatstartedonport(s):9999(http)withcontextpath''2019-03-3103:55:22.119INFO1---[main]com.example.demo.DemoApplication:StartedDemoApplicationin14.323seconds(JVMrunningfor14.62)
通过日志可以看到我们的demo应用已经连接到mysql数据库,我们的demo应用启动正常。
验证
通过Kubernetes的proxy访问我们的demo的health check
kubectlproxy--address='0.0.0.0'--disable-filter=true&curlhttp://10.0.0.10:8001/api/v1/namespaces/default/services/demo/proxy/service/v1/demo{"author":"xiaobaoqiang","title":"thisisademo","version":"1.0"}
通过restful api向数据库写入测试数据
curl-XPOST"http://10.0.0.10:8001/api/v1/namespaces/default/services/demo/proxy/service/v1/user"-H"accept:application/json"-H"Content-Type:application/json"-d"{\"birthDay\":\"2019-03-31T04:03:43.259Z\",\"createDate\":\"2019-03-31T04:03:43.259Z\",\"email\":\"A1@test.com\",\"name\":\"A1\",\"sex\":0}"successcurl-XPOST"http://10.0.0.10:8001/api/v1/namespaces/default/services/demo/proxy/service/v1/user"-H"accept:application/json"-H"Content-Type:application/json"-d"{\"birthDay\":\"2019-03-31T04:03:43.259Z\",\"createDate\":\"2019-03-31T04:03:43.259Z\",\"email\":\"B2@test.com\",\"name\":\"B2\",\"sex\":1}"success
通过restful api查询刚才写入的数据
curl-XGET"http://10.0.0.10:8001/api/v1/namespaces/default/services/demo/proxy/service/v1/users"-H"accept:application/json"[{"id":1,"name":"A1","email":"A1@test.com","sex":0,"birthDay":"2019-03-31T04:03:43.000+0000","createDate":"2019-03-31T04:03:43.000+0000"},{"id":2,"name":"B2","email":"B2@test.com","sex":1,"birthDay":"2019-03-31T04:03:43.000+0000","createDate":"2019-03-31T04:03:43.000+0000"}]
可以看到已经查询到刚才写入的测试数据。
通过命令行查看数据库的数据
kubectlgetpodNAMEREADYSTATUSRESTARTSAGEdemo-d4cd5bfdd-8qpfw1/1Running07m54smysql-6f76465564-j8dq21/1Running067mkubectlexec-itmysql-6f76465564-j8dq2bashroot@mysql-6f76465564-j8dq2:/usr/local/mysql#mysql-uroot-pEnterpassword:WelcometotheMySQLmonitor.Commandsendwith;or\g.YourMySQLconnectionidis422Serverversion:5.7.4-m14MySQLCommunityServer(GPL)Copyright(c)2000,2014,Oracleand/oritsaffiliates.Allrightsreserved.OracleisaregisteredtrademarkofOracleCorporationand/oritsaffiliates.Othernamesmaybetrademarksoftheirrespectiveowners.Type'help;'or'\h'forhelp.Type'\c'toclearthecurrentinputstatement.mysql>mysql>showdatabases;+--------------------+|Database|+--------------------+|information_schema||demo||mysql||performance_schema|+--------------------+4rowsinset(0.00sec)mysql>usedemo;ReadingtableinformationforcompletionoftableandcolumnnamesYoucanturnoffthisfeaturetogetaquickerstartupwith-ADatabasechangedmysql>showtables;+--------------------+|Tables_in_demo|+--------------------+|demo_users||hibernate_sequence|+--------------------+2rowsinset(0.00sec)mysql>select*fromdemo_users;+----+---------------------+---------------------+-------------+------+------+|id|birth_day|create_date|email|name|sex|+----+---------------------+---------------------+-------------+------+------+|1|2019-03-3104:03:43|2019-03-3104:03:43|A1@test.com|A1|0||2|2019-03-3104:03:43|2019-03-3104:03:43|B2@test.com|B2|1|+----+---------------------+---------------------+-------------+------+------+2rowsinset(0.00sec)
通过mysql命令行我们可以看到刚才的测试数据已经保存到数据库中。
上述就是小编为大家分享的Kubernetes中怎么部署应用了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注亿速云行业资讯频道。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。