运维(39)通过KubeSphere部署SpringBoot
DevOps
demo源码见:https:gitee。comzhengqingyajavaworkspace
基于kubesphere3。2。1
自动检出(Checkout)代码、测试、分析、构建、部署并发布
在这里插入图片描述一、创建DevOps项目
在这里插入图片描述
在这里插入图片描述二、DevOps凭证1、gitee仓库认证giteeauth
在这里插入图片描述2、阿里云docker仓库认证aliyundockerregistryauth
在这里插入图片描述3、k8s凭证kubeconfigauthk8s权限配置文件catroot。kubeconfig
在这里插入图片描述
将内容中的https:lb。kubesphere。local:6443https:指定IP:6443,不然之后部署可能会出现问题。。。
在这里插入图片描述
最终
在这里插入图片描述三、maven配置阿里云中央仓库
平台管理集群管理default配置配置字典ksdevopsagent
在这里插入图片描述
编辑设置
在这里插入图片描述mirrors!国内中央仓库的配置阿里云中央仓库mirroridnexusaliyunidmirrorOfcentralmirrorOfnameNexusaliyunnameurlhttp:maven。aliyun。comnexuscontentgroupspublicurlmirrormirrors
在这里插入图片描述四、k8s项目配置阿里云docker仓库认证aliyundockerregistryauth
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述也可通过命令查看凭证kubectlgetsecretsnmyproject五、创建流水线
在这里插入图片描述
在这里插入图片描述
进入后可以点击编辑流水线,提供了一些模板
在这里插入图片描述
ex:第一步拉取代码
在这里插入图片描述
这里自己点着玩吧,很简单。。。根据自己的需求去定制即可。。。
在这里插入图片描述六、其它Jenkinsfilepipeline{agent{node{labelmaven}}environment{DOCKERREGISTRYAUTHaliyundockerregistryauthDOCKERREGISTRYregistry。cnhangzhou。aliyuncs。comDOCKERREGISTRYNAMESPACEzhengqingyaAPPDOCKERIMAGE{DOCKERREGISTRY}{DOCKERREGISTRYNAMESPACE}{APPNAME}:{BRANCHNAME}PROJECTGITURLhttps:gitee。comzhengqingyatest。gitAPPNAMEtestBRANCHNAMEmasterISSKIPBUILDfalseJAVAOPTSXX:UseG1GCXms100mXmx100mDserver。port8080}parameters{string(name:BRANCHNAME,defaultValue:master,description:git分支名)choice(name:ISSKIPBUILD,choices:〔false,true〕,description:是否跳过构建,直接部署)choice(name:SERVICENAMES,choices:〔test,system,all〕,description:请选择要构建的服务,支持单个服务发布或全部服务发布)}stages{stage(参数验证){agentnonesteps{container(maven){shecho分支:{BRANCHNAME}echo是否跳过构建,直接部署(tips:适用于之前已经进行过构建打包的情景):{ISSKIPBUILD}echoapp镜像:{APPDOCKERIMAGE}echo构建运行ID:{BUILDNUMBER}echoJAVAOPTS:{JAVAOPTS}}}}stage(拉取代码){agentnonesteps{container(maven){git(credentialsId:giteeauth,url:{PROJECTGITURL},branch:{BRANCHNAME},changelog:true,poll:false)shlsal}}}stage(项目编译){agentnonesteps{container(maven){shmvncleanpackageDmaven。test。skiptrueshlsal}}}stage(docker镜像构建推送){agentnonesteps{container(maven){shcptarget。jardockershcddockerlsechoapp镜像:{APPDOCKERIMAGE}dockerbuildfDockerfilet{APPDOCKERIMAGE}。nocachewithCredentials(〔usernamePassword(credentialsId:{DOCKERREGISTRYAUTH},passwordVariable:DOCKERPASSWORD,usernameVariable:DOCKERUSERNAME,)〕){shechoDOCKERPASSWORDdockerloginDOCKERREGISTRYuDOCKERUSERNAMEpasswordstdinshdockerpush{APPDOCKERIMAGE}shecho镜像推送成功:{APPDOCKERIMAGE}shlsal}}}}stage(发布到k8s){agentnonesteps{container(maven){shlsalwithCredentials(〔kubeconfigFile(credentialsId:kubeconfigauth,variable:KUBECONFIG)〕){envsubst:将相关参数传给该yml文件shenvsubstk8sk8sdeploy。ymlkubectlapplyf}}}}}}k8sdeploy。yml定义工作负载apiVersion:appsv1kind:Deployment无状态部署metadata:name:{APPNAME}namespace:myprojectTODO命名空间labels:app:{APPNAME}spec:replicas:3TODO3个副本strategy:rollingUpdate:由于replicas为3,则整个升级,pod个数在24个之间maxSurge:1滚动升级时会先启动1个podmaxUnavailable:1滚动升级时允许的最大Unavailable的pod个数selector:matchLabels:app:{APPNAME}template:metadata:labels:app:{APPNAME}spec:imagePullSecrets:name:aliyundockerregistryauthTODO提前在项目下配置访问阿里云仓库的账号密码containers:name:{APPNAME}image:{APPDOCKERIMAGE}TODO镜像地址imagePullPolicy:Alwaysenv:环境变量name:JAVAOPTSvalue:{JAVAOPTS}ports:name:httpcontainerPort:8080protocol:TCPCPU内存限制resources:limits:cpu:300mmemory:600Mi就绪探针readinessProbe:httpGet:path:actuatorhealthport:8080timeoutSeconds:10failureThreshold:30periodSeconds:5定义服务apiVersion:v1kind:Servicemetadata:name:{APPNAME}TODO服务名namespace:myprojectTODO命名空间spec:selector:app:{APPNAME}TODOlabelselector配置,将选择具有label标签的Pod作为管理type:ClusterIP访问方式ClusterIPNodePortports:name:http端口名称port:8080protocol:TCP端口协议,支持TCP和UDP,默认TCPtargetPort:8080nodePort:666TODO当typeNodePort时对外开放端口sessionAffinity:None是否支持sessionk8syaml在线编写工具https:k8syaml。com报错ERROR:java。lang。RuntimeException:io。kubernetes。client。openapi。ApiException:java。net。UnknownHostException:lb。kubesphere。local:Nameorservicenotknown
在这里插入图片描述DeploytoKubernetes14。66s失败StartingKubernetesdeploymentLoadingconfiguration:homejenkinsagentworkspacedevopstestp5hshtestk8sk8sdeploy。ymlERROR:ERROR:java。lang。RuntimeException:io。kubernetes。client。openapi。ApiException:java。net。UnknownHostException:lb。kubesphere。local:Nameorservicenotknownhudson。remoting。ProxyException:java。lang。RuntimeException:io。kubernetes。client。openapi。ApiException:java。net。UnknownHostException:lb。kubesphere。local:Nameorservicenotknownatcom。microsoft。jenkins。kubernetes。wrapper。ResourceManager。handleApiExceptionExceptNotFound(ResourceManager。java:180)atcom。microsoft。jenkins。kubernetes。wrapper。V1ResourceManagerDeploymentUpdater。getCurrentResource(V1ResourceManager。java:213)atcom。microsoft。jenkins。kubernetes。wrapper。V1ResourceManagerDeploymentUpdater。getCurrentResource(V1ResourceManager。java:201)atcom。microsoft。jenkins。kubernetes。wrapper。ResourceManagerResourceUpdater。createOrApply(ResourceManager。java:93)atcom。microsoft。jenkins。kubernetes。wrapper。KubernetesClientWrapper。handleResource(KubernetesClientWrapper。java:289)atcom。microsoft。jenkins。kubernetes。wrapper。KubernetesClientWrapper。apply(KubernetesClientWrapper。java:256)atcom。microsoft。jenkins。kubernetes。command。DeploymentCommandDeploymentTask。doCall(DeploymentCommand。java:172)atcom。microsoft。jenkins。kubernetes。command。DeploymentCommandDeploymentTask。call(DeploymentCommand。java:124)atcom。microsoft。jenkins。kubernetes。command。DeploymentCommandDeploymentTask。call(DeploymentCommand。java:106)athudson。remoting。UserRequest。perform(UserRequest。java:212)athudson。remoting。UserRequest。perform(UserRequest。java:54)athudson。remoting。Request2。run(Request。java:369)athudson。remoting。InterceptingExecutorService1。call(InterceptingExecutorService。java:72)atjava。util。concurrent。FutureTask。run(FutureTask。java:266)atjava。util。concurrent。ThreadPoolExecutor。runWorker(ThreadPoolExecutor。java:1149)atjava。util。concurrent。ThreadPoolExecutorWorker。run(ThreadPoolExecutor。java:624)athudson。remoting。Engine1。lambdanewThread0(Engine。java:93)atjava。lang。Thread。run(Thread。java:748)Suppressed:hudson。remoting。ChannelCallSiteStackTrace:RemotecalltoJNLP4connectconnectionfrom10。233。70。14310。233。70。143:51962athudson。remoting。Channel。attachCallSiteStackTrace(Channel。java:1800)athudson。remoting。UserRequestExceptionResponse。retrieve(UserRequest。java:357)athudson。remoting。Channel。call(Channel。java:1001)athudson。FilePath。act(FilePath。java:1160)atcom。microsoft。jenkins。kubernetes。command。DeploymentCommand。execute(DeploymentCommand。java:68)atcom。microsoft。jenkins。kubernetes。command。DeploymentCommand。execute(DeploymentCommand。java:45)atcom。microsoft。jenkins。azurecommons。command。CommandService。runCommand(CommandService。java:88)atcom。microsoft。jenkins。azurecommons。command。CommandService。execute(CommandService。java:96)atcom。microsoft。jenkins。azurecommons。command。CommandService。executeCommands(CommandService。java:75)atcom。microsoft。jenkins。azurecommons。command。BaseCommandContext。executeCommands(BaseCommandContext。java:77)atcom。microsoft。jenkins。kubernetes。KubernetesDeploy。perform(KubernetesDeploy。java:42)atcom。microsoft。jenkins。azurecommons。command。SimpleBuildStepExecution。run(SimpleBuildStepExecution。java:54)atcom。microsoft。jenkins。azurecommons。command。SimpleBuildStepExecution。run(SimpleBuildStepExecution。java:35)atorg。jenkinsci。plugins。workflow。steps。SynchronousNonBlockingStepExecution。lambdastart0(SynchronousNonBlockingStepExecution。java:47)atjava。util。concurrent。ExecutorsRunnableAdapter。call(Executors。java:511)atjava。util。concurrent。FutureTask。run(FutureTask。java:266)atjava。util。concurrent。ThreadPoolExecutor。runWorker(ThreadPoolExecutor。java:1149)atjava。util。concurrent。ThreadPoolExecutorWorker。run(ThreadPoolExecutor。java:624)。。。1moreCausedby:hudson。remoting。ProxyException:io。kubernetes。client。openapi。ApiException:java。net。UnknownHostException:lb。kubesphere。local:Nameorservicenotknownatio。kubernetes。client。openapi。ApiClient。execute(ApiClient。java:898)atio。kubernetes。client。openapi。apis。AppsV1Api。readNamespacedDeploymentWithHttpInfo(AppsV1Api。java:7299)atio。kubernetes。client。openapi。apis。AppsV1Api。readNamespacedDeployment(AppsV1Api。java:7275)atcom。microsoft。jenkins。kubernetes。wrapper。V1ResourceManagerDeploymentUpdater。getCurrentResource(V1ResourceManager。java:210)。。。16moreCausedby:hudson。remoting。ProxyException:java。net。UnknownHostException:lb。kubesphere。local:Nameorservicenotknownatjava。net。Inet4AddressImpl。lookupAllHostAddr(NativeMethod)atjava。net。InetAddress2。lookupAllHostAddr(InetAddress。java:929)atjava。net。InetAddress。getAddressesFromNameService(InetAddress。java:1324)atjava。net。InetAddress。getAllByName0(InetAddress。java:1277)atjava。net。InetAddress。getAllByName(InetAddress。java:1193)atjava。net。InetAddress。getAllByName(InetAddress。java:1127)atokhttp3。Dns。lambdastatic0(Dns。java:39)atokhttp3。internal。connection。RouteSelector。resetNextInetSocketAddress(RouteSelector。java:171)atokhttp3。internal。connection。RouteSelector。nextProxy(RouteSelector。java:135)atokhttp3。internal。connection。RouteSelector。next(RouteSelector。java:84)atokhttp3。internal。connection。ExchangeFinder。findConnection(ExchangeFinder。java:187)atokhttp3。internal。connection。ExchangeFinder。findHealthyConnection(ExchangeFinder。java:108)atokhttp3。internal。connection。ExchangeFinder。find(ExchangeFinder。java:88)atokhttp3。internal。connection。Transmitter。newExchange(Transmitter。java:169)atokhttp3。internal。connection。ConnectInterceptor。intercept(ConnectInterceptor。java:41)atokhttp3。internal。http。RealInterceptorChain。proceed(RealInterceptorChain。java:142)atokhttp3。internal。http。RealInterceptorChain。proceed(RealInterceptorChain。java:117)atokhttp3。internal。cache。CacheInterceptor。intercept(CacheInterceptor。java:94)atokhttp3。internal。http。RealInterceptorChain。proceed(RealInterceptorChain。java:142)atokhttp3。internal。http。RealInterceptorChain。proceed(RealInterceptorChain。java:117)atokhttp3。internal。http。BridgeInterceptor。intercept(BridgeInterceptor。java:93)atokhttp3。internal。http。RealInterceptorChain。proceed(RealInterceptorChain。java:142)atokhttp3。internal。http。RetryAndFollowUpInterceptor。intercept(RetryAndFollowUpInterceptor。java:88)atokhttp3。internal。http。RealInterceptorChain。proceed(RealInterceptorChain。java:142)atokhttp3。internal。http。RealInterceptorChain。proceed(RealInterceptorChain。java:117)atokhttp3。RealCall。getResponseWithInterceptorChain(RealCall。java:221)atokhttp3。RealCall。execute(RealCall。java:81)atio。kubernetes。client。openapi。ApiClient。execute(ApiClient。java:894)。。。19moreApicallfailedwithcode0,detailedmessage:nullKubernetesdeploymentendedwithHasError解决:
kubesphere3。2。1流水线调整第一步:替换kubernetesDeploy部署方式
https:github。comkubespherewebsitepull2098stage(发布到k8s){agentnonesteps{container(maven){废弃。。。kubernetesDeploy(enableConfigSubstitution:true,deleteResource:false,kubeconfigId:kubeconfigauth,configs:k8s)改为下面这种方式withCredentials(〔kubeconfigFile(credentialsId:kubeconfigauth,variable:KUBECONFIG)〕){envsubst:将相关参数传给该yml文件shenvsubstk8sk8sdeploy。ymlkubectlapplyf}}}}第二步:修改DevOps凭证kubeconfig
将内容中的https:lb。kubesphere。local:6443https:指定IP:6443
在这里插入图片描述
最终发布成功
在这里插入图片描述
今日分享语句:天再高又怎样,踮起脚尖就更接近阳光。