一直对“云原生”很有兴趣,却不知道从何入手,最近刚好在研究服务网格,就顺便再夯实一下基础吧。
本文我们会在window环境下,构建一套基于k8s的istio环境,并且通过skaffold完成镜像的构建和项目部署到集群环境。其实对于实验环境有限的朋友们,完全可以在某里云上,按量付费搞3台”突发性能实例“,玩一晚,也就是杯咖啡钱。
执行流程
整体流程的话,如下图所示,通过 Skaffold+jib 将开发的应用打包成镜像,提交到本地仓库,并且将应用部署到集群中。k8s中部署2个pod,模拟应用不同的版本,并且配置访问权重20%:80%。
环境选择
之前的文章,有对 minikube 的介绍,本次实验,开始的时候,我一直沉溺在kind的便捷上,而且直接可以在docker上部署集群,但是由于我对K8S的理解并不足够,导致后面遇到了很多问题,所以,在这里建议新上手的小伙伴,还是使用minikube吧。简单大佬推荐使用RKE来部署,但是碍于机器性能,不能开启太多虚拟机,于是最后又换回了minikube。 k3s和RKE都需要多台虚拟机,这种方案暂时不考虑。
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 | minikube.sigs.k8s.io/ | kind.sigs.k8s.io/ | k3s.io/ |
docker desktop 没有特殊要求。其他的自己用的顺手就好,还是需要特别说一下minikube,别用最新的coredns一直都拉不下来,除非你的魔法,可以完全搞定,否则,还是用阿里编译的minikube版本吧,别跟自己较劲,别问我为什么…
我用的版本罗列在下面了:
1 | bash复制代码➜ ~ istioctl version |
环境搭建
使用minikube创建集群
使用 hyperv , 内存 8192 cup 4核, 不能再少了,否则拉不起来 istio
1 | bash复制代码➜ ~ minikube start --image-mirror-country='cn' --registry-mirror=https://hq0igpc0.mirror.aliyuncs.com --vm-driver="hyperv" --memory=8192 --cpus=4 --hyperv-virtual-switch="minikubeSwitch" --image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers |
还要在 hyperv里创建一个虚拟路由,这里我构建了一个内部网络,这样可以通过设置网卡的ip,将内部网络的网段固定下来,否则,每次重启都会变化ip
配置让内部网络,共享访问互联网
启动成功
1 | bash复制代码➜ istio-1.10.2 minikube start |
部署 istio
创建 istio-system 的命名空间
kubectl create namespace istio-system
安装 istio
istioctl manifest apply --set profile=demo
安装完成后,执行命令 kubectl get svc -n istio-system
1 | bash复制代码➜ ~ kubectl get svc -n istio-system |
部署 bookinfo
部署 bookinfo demo 验证环境
执行命令
1 | bash复制代码kubectl label namespace default istio-injection=enabled |
等待pod都启动起来以后,添加bookinfo网络配置,用于访问 kubectl apply -f .\samples\bookinfo\networking\bookinfo-gateway.yaml
1 | bash复制代码➜ istio-1.10.2 kubectl apply -f .\samples\bookinfo\networking\bookinfo-gateway.yaml |
使用命令查看service : kubectl get services
1 | bash复制代码➜ ~ kubectl get services |
查看pods状态 kubectl get pods
1 | bash复制代码➜ ~ kubectl get pods |
查看集群ip 以及 端口
1 | bash复制代码➜ ~ kubectl get po -l istio=ingressgateway -n istio-system -o 'jsonpath={.items[0].status.hostIP}' |
于是访问地址: http://192.168.137.115:31769/productpage
我们 bookinfo 就部署成功了。接下来我们创建应用
构建应用
构建一个普通的springboot工程,添加编译插件,这里我们使用了本地的docker仓库存储镜像
1 | xml复制代码<build> |
构建一个简单的rest,现实一个构建名称,以及配置的一个版本号
1 | java复制代码@Autowired |
创建 skaffold.xml 用于给 skafflod 编译镜像,提交集群使用
1 | yaml复制代码apiVersion: skaffold/v2alpha1 |
创建k8s的部署描述 k8s/deployment.yml
,以及service用于访问
1 | yaml复制代码apiVersion: apps/v1 |
创建 istio描述文件 k8s\istio-rules.yaml
1 | yaml复制代码apiVersion: networking.istio.io/v1beta1 |
运行 skaffold 进行编译,提交镜像,并部署应用 skaffold run --tail
1 | bash复制代码➜ callme-service git:(master) ✗ skaffold run --tail |
访问查看结果
致此,我们初级的环境搭建基本完成了,对应云原生,感觉懂了一点,好像又没有懂,需要理解的东西还有很多,这个系列也会持续下去,希望大家和我交流,也欢迎关注,转发。
参考链接;
piotrminkowski.com/2020/02/14/…
pklinker.medium.com/integrating…
本文转载自: 掘金