云原生初体验:在K8s上部署Springboot应用

%云原生初体验:在K8s上部署Springboot应用-猿站网-插图

你会不会对“云原生”很有兴趣,却不知道从何入手?

本文会在window环境下,构建一套基于k8s的istio环境,并且通过skaffold完成镜像的构建和项目部署到集群环境。其实对于实验环境有限的朋友们,完全可以在某里云上,按量付费搞3台”突发性能实例“,玩一晚,也就是杯咖啡钱。

好吧,让我开始吧!

执行流程

整体流程的话,如下图所示,通过 Skaffold+jib 将开发的应用打包成镜像,提交到本地仓库,并且将应用部署到集群中。k8s中部署2个pod,模拟应用不同的版本,并且配置访问权重20%:80%。

%云原生初体验:在K8s上部署Springboot应用-1猿站网-插图

环境选择

我之前有文章详细介绍过minikube。本次实验,开始的时候,我就一直沉溺在使用kind的便捷上,而且直接可以在docker上部署集群,可以说非常方便。但是由于我对K8S的理解并不足够,导致后面遇到了很多问题,所以,在这里建议新上手的小伙伴,还是使用minikube吧。k3s和RKE都需要多台虚拟机,碍于机器性能,这种方案暂时不考虑了。

下面表格,对比了minikube、kind、k3s 部署环境,以及支持情况,方便大家选择。

@nbsp; minikube kind k3s runtime VM container native supported architectures AMD64 AMD64 AMD64, ARMv7, ARM64 supported container runtimes Docker,CRI-O,containerd,gvisor Docker Docker, containerd startup time initial/following 5:19 / 3:15 2:48 / 1:06 0:15 / 0:15 memory requirements 2GB 8GB (Windows, MacOS) 512 MB requires root? no no yes (rootless is experimental) multi-cluster support yes yes no (can be achieved using containers) multi-node support no yes yes project page https://minikube.sigs.k8s.io/ https://kind.sigs.k8s.io/ https://k3s.io/

[1] 表格引用自:http://jiagoushi.pro/minikube-vs-kind-vs-k3s-what-should-i-use

docker desktop 没有特殊要求。其他的自己用的顺手就好,还是需要特别说一下minikube,别用最新的coredns一直都拉不下来,除非你的魔法,可以完全搞定,否则,还是用阿里编译的minikube版本吧,别跟自己较劲,别问我为什么…

我用的版本罗列在下面了:

➜@nbsp;~@nbsp;istioctl@nbsp;version@nbsp; client@nbsp;version:@nbsp;1.10.2@nbsp; control@nbsp;plane@nbsp;version:@nbsp;1.10.2@nbsp; data@nbsp;plane@nbsp;version:@nbsp;1.10.2@nbsp;(10@nbsp;proxies)@nbsp; @nbsp; ➜@nbsp;~@nbsp;minikube@nbsp;version@nbsp; minikube@nbsp;version:@nbsp;v1.18.1@nbsp; commit:@nbsp;511aca80987826051cf1c6527c3da706925f7909@nbsp; @nbsp; ➜@nbsp;~@nbsp;skaffold@nbsp;version@nbsp; v1.29.0@nbsp;

环境搭建

使用minikube创建集群

使用 hyperv 作为引擎 , 内存 8192M cup 4核,不能再少了,否则拉不起来 istio。

➜@nbsp;~@nbsp;minikube@nbsp;start@nbsp;@nbsp;–image-mirror-country=cn@nbsp;–registry-mirror=https://hq0igpc0.mirror.aliyuncs.com@nbsp;–vm-driver=@quot;hyperv@quot;@nbsp;–memory=8192@nbsp;–cpus=4@nbsp;–hyperv-virtual-switch=@quot;minikubeSwitch@quot;@nbsp;–image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers@nbsp;

还要在 hyperv里创建一个虚拟路由,这里我构建了一个内部网络,这样可以通过设置网卡的ip,将内部网络的网段固定下来,否则,每次重启都会变化ip。

%云原生初体验:在K8s上部署Springboot应用-2猿站网-插图

配置让内部网络,共享访问互联网。

%云原生初体验:在K8s上部署Springboot应用-3猿站网-插图

启动成功:

➜@nbsp;istio-1.10.2@nbsp;minikube@nbsp;start@nbsp; @nbsp;Microsoft@nbsp;Windows@nbsp;10@nbsp;Pro@nbsp;10.0.19042@nbsp;Build@nbsp;19042@nbsp;上的@nbsp;minikube@nbsp;v1.18.1@nbsp; @nbsp;minikube@nbsp;1.20.0@nbsp;is@nbsp;available!@nbsp;Download@nbsp;it:@nbsp;https://github.com/kubernetes/minikube/releases/tag/v1.20.0@nbsp; @nbsp; @nbsp;根据现有的配置文件使用@nbsp;hyperv@nbsp;驱动程序@nbsp; @nbsp;Starting@nbsp;control@nbsp;plane@nbsp;node@nbsp;minikube@nbsp;in@nbsp;cluster@nbsp;minikube@nbsp; @nbsp;Restarting@nbsp;existing@nbsp;hyperv@nbsp;VM@nbsp;for@nbsp;@quot;minikube@quot;@nbsp;…@nbsp; @nbsp;正在@nbsp;Docker@nbsp;20.10.3@nbsp;中准备@nbsp;Kubernetes@nbsp;v1.20.2…@nbsp; @nbsp;Verifying@nbsp;Kubernetes@nbsp;components…@nbsp; @nbsp;@nbsp;▪@nbsp;Using@nbsp;image@nbsp;registry.cn-hangzhou.aliyuncs.com/google_containers/storage-provisioner:v4@nbsp;(global@nbsp;image@nbsp;repository)@nbsp; @nbsp;@nbsp;▪@nbsp;Using@nbsp;image@nbsp;registry.hub.docker.com/kubernetesui/dashboard:v2.1.0@nbsp; @nbsp;@nbsp;▪@nbsp;Using@nbsp;image@nbsp;registry.hub.docker.com/kubernetesui/metrics-scraper:v1.0.4@nbsp; @nbsp;@nbsp;▪@nbsp;Using@nbsp;image@nbsp;registry.cn-hangzhou.aliyuncs.com/google_containers/metrics-server-amd64:v0.2.1@nbsp;(global@nbsp;image@nbsp;repository)@nbsp; @nbsp;Enabled@nbsp;addons:@nbsp;metrics-server,@nbsp;storage-provisioner,@nbsp;dashboard,@nbsp;default-storageclass@nbsp; @nbsp;Done!@nbsp;kubectl@nbsp;is@nbsp;now@nbsp;configured@nbsp;to@nbsp;use@nbsp;@quot;minikube@quot;@nbsp;cluster@nbsp;and@nbsp;@quot;default@quot;@nbsp;namespace@nbsp;by@nbsp;default@nbsp;

部署 istio

创建 istio-system 的命名空间

kubectl@nbsp;create@nbsp;namespace@nbsp;istio-system@nbsp;

安装 istio

istioctl@nbsp;manifest@nbsp;apply@nbsp;–set@nbsp;profile=demo@nbsp;

安装完成后,执行命令 kubectl get svc -n istio-system

➜@nbsp;~@nbsp;kubectl@nbsp;get@nbsp;svc@nbsp;-n@nbsp;istio-system@nbsp; NAME@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;TYPE@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;CLUSTER-IP@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;EXTERNAL-IP@nbsp;@nbsp;@nbsp;PORT(S)@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;AGE@nbsp; istio-egressgateway@nbsp;@nbsp;@nbsp;ClusterIP@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;10.105.31.73@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@lt;none@gt;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;80/TCP,443/TCP@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;8d@nbsp; istio-ingressgateway@nbsp;@nbsp;@nbsp;LoadBalancer@nbsp;@nbsp;@nbsp;10.103.61.73@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@lt;pending@gt;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;15021:31031/TCP,80:31769/TCP,443:30373/TCP,31400:31833/TCP,15443:32411/TCP@nbsp;@nbsp;@nbsp;8d@nbsp; istiod@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;ClusterIP@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;10.110.109.205@nbsp;@nbsp;@nbsp;@lt;none@gt;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;15010/TCP,15012/TCP,443/TCP,15014/TCP@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;8d@nbsp;

部署 bookinfo

部署 bookinfo demo 验证环境

执行命令

kubectl@nbsp;label@nbsp;namespace@nbsp;default@nbsp;istio-injection=enabled@nbsp; @nbsp; kubectl@nbsp;apply@nbsp;-f@nbsp;samples/bookinfo/platform/kube/bookinfo.yaml@nbsp;

等待pod都启动起来以后,添加bookinfo网络配置,用于访问 kubectl apply -f .samplesookinfo etworkingookinfo-gateway.yaml

➜@nbsp;istio-1.10.2@nbsp;kubectl@nbsp;apply@nbsp;-f@nbsp;.samplesookinfo etworkingookinfo-gateway.yaml@nbsp; @nbsp; gateway.networking.istio.io/bookinfo-gateway@nbsp;created@nbsp; @nbsp; virtualservice.networking.istio.io/bookinfo@nbsp;created@nbsp;

使用命令查看service : kubectl get services

➜@nbsp;~@nbsp;kubectl@nbsp;get@nbsp;services@nbsp; NAME@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;TYPE@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;CLUSTER-IP@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;EXTERNAL-IP@nbsp;@nbsp;@nbsp;PORT(S)@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;AGE@nbsp; callme-service@nbsp;@nbsp;@nbsp;NodePort@nbsp;@nbsp;@nbsp;@nbsp;10.106.26.24@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@lt;none@gt;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;8080:30101/TCP@nbsp;@nbsp;@nbsp;8d@nbsp; details@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;ClusterIP@nbsp;@nbsp;@nbsp;10.110.253.19@nbsp;@nbsp;@nbsp;@lt;none@gt;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;9080/TCP@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;8d@nbsp; kubernetes@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;ClusterIP@nbsp;@nbsp;@nbsp;10.96.0.1@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@lt;none@gt;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;443/TCP@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;8d@nbsp; productpage@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;ClusterIP@nbsp;@nbsp;@nbsp;10.96.246.175@nbsp;@nbsp;@nbsp;@lt;none@gt;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;9080/TCP@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;8d@nbsp; ratings@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;ClusterIP@nbsp;@nbsp;@nbsp;10.99.234.109@nbsp;@nbsp;@nbsp;@lt;none@gt;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;9080/TCP@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;8d@nbsp; reviews@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;ClusterIP@nbsp;@nbsp;@nbsp;10.103.177.123@nbsp;@nbsp;@nbsp;@lt;none@gt;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;9080/TCP@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;8d@nbsp;

查看pods状态 kubectl get pods

➜@nbsp;~@nbsp;kubectl@nbsp;get@nbsp;pods@nbsp; NAME@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;READY@nbsp;@nbsp;@nbsp;STATUS@nbsp;@nbsp;@nbsp;RESTARTS@nbsp;@nbsp;@nbsp;AGE@nbsp; callme-service-v1-76dd76ddcc-znb62@nbsp;@nbsp;@nbsp;2/2@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;Running@nbsp;@nbsp;@nbsp;0@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;4h59m@nbsp; callme-service-v2-679db76bbc-m4svm@nbsp;@nbsp;@nbsp;2/2@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;Running@nbsp;@nbsp;@nbsp;0@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;4h59m@nbsp; details-v1-79f774bdb9-qk9q8@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;2/2@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;Running@nbsp;@nbsp;@nbsp;8@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;8d@nbsp; productpage-v1-6b746f74dc-p4xcb@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;2/2@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;Running@nbsp;@nbsp;@nbsp;8@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;8d@nbsp; ratings-v1-b6994bb9-dlvjm@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;2/2@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;Running@nbsp;@nbsp;@nbsp;8@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;8d@nbsp; reviews-v1-545db77b95-sgdzq@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;2/2@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;Running@nbsp;@nbsp;@nbsp;8@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;8d@nbsp; reviews-v2-7bf8c9648f-t6s8z@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;2/2@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;Running@nbsp;@nbsp;@nbsp;8@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;8d@nbsp; reviews-v3-84779c7bbc-4p8hv@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;2/2@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;Running@nbsp;@nbsp;@nbsp;8@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;8d@nbsp;

查看集群ip 以及 端口

➜@nbsp;~@nbsp;kubectl@nbsp;get@nbsp;po@nbsp;-l@nbsp;istio=ingressgateway@nbsp;-n@nbsp;istio-system@nbsp;-o@nbsp;jsonpath={.items[0].status.hostIP}@nbsp; 192.168.137.115@nbsp; @nbsp; @nbsp; @nbsp; ➜@nbsp;istio-1.10.2@nbsp;kubectl@nbsp;get@nbsp;svc@nbsp;istio-ingressgateway@nbsp;-n@nbsp;istio-system@nbsp; @nbsp; NAME@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;TYPE@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;CLUSTER-IP@nbsp;@nbsp;@nbsp;EXTERNAL-IP@nbsp;PORT(S)@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;AGE@nbsp; @nbsp; istio-ingressgateway@nbsp;LoadBalancer@nbsp;@nbsp;10.110.228.32@nbsp;@lt;pending@gt;@nbsp;@nbsp;@nbsp;15021:32343/TCP,80:30088/TCP,443:31869/TCP,31400:32308/TCP,15443:32213/TCP@nbsp;3m17s@nbsp;

于是访问地址: http://192.168.137.115:31769/productpage

%云原生初体验:在K8s上部署Springboot应用-4猿站网-插图

我们 bookinfo 就部署成功了。接下来我们创建应用

构建应用

%云原生初体验:在K8s上部署Springboot应用-5猿站网-插图

构建一个普通的springboot工程,添加编译插件,这里我们使用了本地的docker仓库存储镜像

@lt;build@gt;@nbsp; @nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@lt;plugins@gt;@nbsp; @nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@lt;plugin@gt;@nbsp; @nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@lt;groupId@gt;org.springframework.boot@lt;/groupId@gt;@nbsp; @nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@lt;artifactId@gt;spring-boot-maven-plugin@lt;/artifactId@gt;@nbsp; @nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@lt;executions@gt;@nbsp; @nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@lt;execution@gt;@nbsp; @nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@lt;goals@gt;@nbsp; @nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@lt;goal@gt;build-info@lt;/goal@gt;@nbsp; @nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@lt;goal@gt;repackage@lt;/goal@gt;@nbsp; @nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@lt;/goals@gt;@nbsp; @nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@lt;/execution@gt;@nbsp; @nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@lt;/executions@gt;@nbsp; @nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@lt;/plugin@gt;@nbsp; @nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@lt;plugin@gt;@nbsp; @nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@lt;groupId@gt;com.google.cloud.tools@lt;/groupId@gt;@nbsp; @nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@lt;artifactId@gt;jib-maven-plugin@lt;/artifactId@gt;@nbsp; @nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@lt;version@gt;3.1.1@lt;/version@gt;@nbsp; @nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@lt;configuration@gt;@nbsp; @nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@lt;to@gt;@nbsp; @nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@lt;image@gt;127.0.0.1:9001/${project.artifactId}:${project.version}@lt;/image@gt;@nbsp; @nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@lt;auth@gt;@nbsp; @nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@lt;username@gt;@nbsp; @nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;xxx@nbsp; @nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@lt;/username@gt;@nbsp; @nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@lt;password@gt;@nbsp; @nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;xxx@nbsp; @nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@lt;/password@gt;@nbsp; @nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@lt;/auth@gt;@nbsp; @nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@lt;/to@gt;@nbsp; @nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@lt;allowInsecureRegistries@gt;true@lt;/allowInsecureRegistries@gt;@nbsp; @nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@lt;/configuration@gt;@nbsp; @nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@lt;/plugin@gt;@nbsp; @nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@lt;/plugins@gt;@nbsp; @nbsp;@nbsp;@lt;/build@gt;@nbsp;

构建一个简单的rest,现实一个构建名称,以及配置的一个版本号

@Autowired@nbsp; BuildProperties@nbsp;buildProperties;@nbsp; @Value(@quot;${VERSION}@quot;)@nbsp; private@nbsp;String@nbsp;version;@nbsp; @nbsp; @GetMapping(@quot;/ping@quot;)@nbsp; public@nbsp;String@nbsp;ping()@nbsp;{@nbsp; @nbsp;@nbsp;@nbsp;LOGGER.info(@quot;Ping:@nbsp;name={},@nbsp;version={}@quot;,@nbsp;buildProperties.getName(),@nbsp;version);@nbsp; @nbsp;@nbsp;@nbsp;return@nbsp;@quot;Im@nbsp;callme-service@nbsp;@quot;@nbsp;+@nbsp;version;@nbsp; }@nbsp;

创建 skaffold.xml 用于给 skafflod 编译镜像,提交集群使用

apiVersion:@nbsp;skaffold/v2alpha1@nbsp; kind:@nbsp;Config@nbsp; build:@nbsp; artifacts:@nbsp; @nbsp;@nbsp;-@nbsp;image:@nbsp;127.0.0.1:9001/callme-service@nbsp; @nbsp;@nbsp;@nbsp;@nbsp;jib:@nbsp;{}@nbsp; tagPolicy:@nbsp; @nbsp;@nbsp;gitCommit:@nbsp;{}@nbsp;

创建k8s的部署描述k8s/deployment.yml,以及service用于访问

apiVersion:@nbsp;apps/v1@nbsp; kind:@nbsp;Deployment@nbsp; metadata:@nbsp; name:@nbsp;callme-service-v1@nbsp; spec:@nbsp; replicas:@nbsp;1@nbsp; selector:@nbsp; @nbsp;@nbsp;matchLabels:@nbsp; @nbsp;@nbsp;@nbsp;@nbsp;app:@nbsp;callme-service@nbsp; @nbsp;@nbsp;@nbsp;@nbsp;version:@nbsp;v1@nbsp; template:@nbsp; @nbsp;@nbsp;metadata:@nbsp; @nbsp;@nbsp;@nbsp;@nbsp;labels:@nbsp; @nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;app:@nbsp;callme-service@nbsp; @nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;version:@nbsp;v1@nbsp; @nbsp;@nbsp;spec:@nbsp; @nbsp;@nbsp;@nbsp;@nbsp;containers:@nbsp; @nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;-@nbsp;name:@nbsp;callme-service@nbsp; @nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;image:@nbsp;127.0.0.1:9001/callme-service@nbsp; @nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;imagePullPolicy:@nbsp;IfNotPresent@nbsp; @nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;ports:@nbsp; @nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;-@nbsp;containerPort:@nbsp;8080@nbsp; @nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;env:@nbsp; @nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;-@nbsp;name:@nbsp;VERSION@nbsp; @nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;value:@nbsp;@quot;v1@quot;@nbsp; @nbsp; apiVersion:@nbsp;apps/v1@nbsp; kind:@nbsp;Deployment@nbsp; metadata:@nbsp; name:@nbsp;callme-service-v2@nbsp; spec:@nbsp; replicas:@nbsp;1@nbsp; selector:@nbsp; @nbsp;@nbsp;matchLabels:@nbsp; @nbsp;@nbsp;@nbsp;@nbsp;app:@nbsp;callme-service@nbsp; @nbsp;@nbsp;@nbsp;@nbsp;version:@nbsp;v2@nbsp; template:@nbsp; @nbsp;@nbsp;metadata:@nbsp; @nbsp;@nbsp;@nbsp;@nbsp;labels:@nbsp; @nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;app:@nbsp;callme-service@nbsp; @nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;version:@nbsp;v2@nbsp; @nbsp;@nbsp;spec:@nbsp; @nbsp;@nbsp;@nbsp;@nbsp;containers:@nbsp; @nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;-@nbsp;name:@nbsp;callme-service@nbsp; @nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;image:@nbsp;127.0.0.1:9001/callme-service@nbsp; @nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;imagePullPolicy:@nbsp;IfNotPresent@nbsp; @nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;ports:@nbsp; @nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;-@nbsp;containerPort:@nbsp;8080@nbsp; @nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;env:@nbsp; @nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;-@nbsp;name:@nbsp;VERSION@nbsp; @nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;value:@nbsp;@quot;v2@quot;@nbsp; @nbsp; apiVersion:@nbsp;v1@nbsp; kind:@nbsp;Service@nbsp; metadata:@nbsp; name:@nbsp;callme-service@nbsp; labels:@nbsp; @nbsp;@nbsp;app:@nbsp;callme-service@nbsp; spec:@nbsp; type:@nbsp;NodePort@nbsp; ports:@nbsp; -@nbsp;port:@nbsp;8080@nbsp; @nbsp;@nbsp;name:@nbsp;http@nbsp; @nbsp;@nbsp;nodePort:@nbsp;30101@nbsp; selector:@nbsp; @nbsp;@nbsp;app:@nbsp;callme-service@nbsp;

创建 istio描述文件 k8sistio-rules.yaml

apiVersion:@nbsp;networking.istio.io/v1beta1@nbsp; kind:@nbsp;DestinationRule@nbsp; metadata:@nbsp; name:@nbsp;callme-service-destination@nbsp; spec:@nbsp; host:@nbsp;callme-service@nbsp; subsets:@nbsp; @nbsp;@nbsp;-@nbsp;name:@nbsp;v1@nbsp; @nbsp;@nbsp;@nbsp;@nbsp;labels:@nbsp; @nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;version:@nbsp;v1@nbsp; @nbsp;@nbsp;-@nbsp;name:@nbsp;v2@nbsp; @nbsp;@nbsp;@nbsp;@nbsp;labels:@nbsp; @nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;version:@nbsp;v2@nbsp; #@nbsp;trafficPolicy:@nbsp;#@nbsp;—@nbsp;enable@nbsp;for@nbsp;adding@nbsp;circuit@nbsp;breaker@nbsp;into@nbsp;DestinationRule@nbsp; #@nbsp;@nbsp;@nbsp;connectionPool:@nbsp; #@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;http:@nbsp; #@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;http1MaxPendingRequests:@nbsp;1@nbsp; #@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;maxRequestsPerConnection:@nbsp;1@nbsp; #@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;maxRetries:@nbsp;0@nbsp; #@nbsp;@nbsp;@nbsp;outlierDetection:@nbsp; #@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;consecutive5xxErrors:@nbsp;3@nbsp; #@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;interval:@nbsp;30s@nbsp; #@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;baseEjectionTime:@nbsp;1m@nbsp; #@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;maxEjectionPercent:@nbsp;100@nbsp; @nbsp; apiVersion:@nbsp;networking.istio.io/v1beta1@nbsp; kind:@nbsp;VirtualService@nbsp; metadata:@nbsp; name:@nbsp;callme-service-route@nbsp; spec:@nbsp; hosts:@nbsp; @nbsp;@nbsp;-@nbsp;callme-service@nbsp; http:@nbsp; @nbsp;@nbsp;-@nbsp;route:@nbsp; @nbsp;@nbsp;@nbsp;@nbsp;-@nbsp;destination:@nbsp; @nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;host:@nbsp;callme-service@nbsp; @nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;subset:@nbsp;v2@nbsp; @nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;weight:@nbsp;80@nbsp; @nbsp;@nbsp;@nbsp;@nbsp;-@nbsp;destination:@nbsp; @nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;host:@nbsp;callme-service@nbsp; @nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;subset:@nbsp;v1@nbsp; @nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;weight:@nbsp;20@nbsp; @nbsp;@nbsp;@nbsp;@nbsp;retries:@nbsp; @nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;attempts:@nbsp;3@nbsp; @nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;retryOn:@nbsp;gateway-error,connect-failure,refused-stream@nbsp; @nbsp;@nbsp;@nbsp;@nbsp;timeout:@nbsp;0.5s@nbsp; #@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;fault:@nbsp;#@nbsp;—@nbsp;enable@nbsp;for@nbsp;inject@nbsp;fault@nbsp;into@nbsp;the@nbsp;route@nbsp; #@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;delay:@nbsp; #@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;percentage:@nbsp; #@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;value:@nbsp;33@nbsp; #@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;@nbsp;fixedDelay:@nbsp;3s@nbsp;

运行 skaffold 进行编译,提交镜像,并部署应用 skaffold run –tail

➜@nbsp;callme-service@nbsp;git:(master)@nbsp;✗@nbsp;skaffold@nbsp;run@nbsp;–tail@nbsp; Generating@nbsp;tags…@nbsp; @nbsp; -@nbsp;127.0.0.1:9001/callme-service@nbsp;-@gt;@nbsp;127.0.0.1:9001/callme-service:e9c731f-dirty@nbsp; @nbsp;@nbsp;Checking@nbsp;cache…@nbsp; -@nbsp;127.0.0.1:9001/callme-service:@nbsp;Found@nbsp;Locally@nbsp; @nbsp;@nbsp;Starting@nbsp;test…@nbsp; @nbsp;@nbsp;Tags@nbsp;used@nbsp;in@nbsp;deployment:@nbsp; -@nbsp;127.0.0.1:9001/callme-service@nbsp;-@gt;@nbsp;127.0.0.1:9001/callme-service:60f1bf39367673fd0d30ec1305d8a02cb5a1ed43cf6603e767a98dc0523c65f3@nbsp; @nbsp;@nbsp;Starting@nbsp;deploy…@nbsp; -@nbsp;deployment.apps/callme-service-v1@nbsp;configured@nbsp; -@nbsp;deployment.apps/callme-service-v2@nbsp;configured@nbsp; -@nbsp;service/callme-service@nbsp;configured@nbsp; -@nbsp;destinationrule.networking.istio.io/callme-service-destination@nbsp;configured@nbsp; -@nbsp;virtualservice.networking.istio.io/callme-service-route@nbsp;configured@nbsp; @nbsp;@nbsp;Waiting@nbsp;for@nbsp;deployments@nbsp;to@nbsp;stabilize…@nbsp; -@nbsp;deployment/callme-service-v1:@nbsp;waiting@nbsp;for@nbsp;init@nbsp;container@nbsp;istio-init@nbsp;to@nbsp;start@nbsp; @nbsp;@nbsp;-@nbsp;pod/callme-service-v1-76dd76ddcc-znb62:@nbsp;waiting@nbsp;for@nbsp;init@nbsp;container@nbsp;istio-init@nbsp;to@nbsp;start@nbsp; -@nbsp;deployment/callme-service-v2:@nbsp;waiting@nbsp;for@nbsp;init@nbsp;container@nbsp;istio-init@nbsp;to@nbsp;start@nbsp; @nbsp;@nbsp;-@nbsp;pod/callme-service-v2-679db76bbc-m4svm:@nbsp;waiting@nbsp;for@nbsp;init@nbsp;container@nbsp;istio-init@nbsp;to@nbsp;start@nbsp; -@nbsp;deployment/callme-service-v2@nbsp;is@nbsp;ready.@nbsp;[1/2@nbsp;deployment(s)@nbsp;still@nbsp;pending]@nbsp; -@nbsp;deployment/callme-service-v1@nbsp;is@nbsp;ready.@nbsp; @nbsp;@nbsp;Deployments@nbsp;stabilized@nbsp;in@nbsp;45.671@nbsp;seconds@nbsp;

访问查看结果

%云原生初体验:在K8s上部署Springboot应用-6猿站网-插图

致此,我们初级的环境搭建基本完成了,对应云原生,感觉懂了一点,好像又没有懂,需要理解的东西还有很多,这个系列也会持续下去,希望大家和我交流,也欢迎关注,转发。

参考链接;

https://piotrminkowski.com/2020/02/14/local-java-development-on-kubernetes/

https://pklinker.medium.com/integrating-a-spring-boot-application-into-an-istio-service-mesh-a55948666fd

https://blog.csdn.net/xixingzhe2/article/details/88537038

https://blog.csdn.net/chenleiking/article/details/86716049

原文地址:https://mp.weixin.qq.com/s/2_Uh7zLlYwlUBDoMTJ97Pw

声明: 猿站网有关资源均来自网络搜集与网友提供,任何涉及商业盈利目的的均不得使用,否则产生的一切后果将由您自己承担! 本平台资源仅供个人学习交流、测试使用 所有内容请在下载后24小时内删除,制止非法恶意传播,不对任何下载或转载者造成的危害负任何法律责任!也请大家支持、购置正版! 。本站一律禁止以任何方式发布或转载任何违法的相关信息访客发现请向站长举报,会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。本网站的资源部分来源于网络,如有侵权烦请发送邮件至:2697268773@qq.com进行处理。
服务器资讯

浙江云计算数据中心项目开工:阿里、杭钢合建,总投资 158 亿元

2023-3-11 9:12:41

服务器资讯

网络游戏服务器使用什么配置合适呢?

2023-3-11 9:16:51

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索