Service Mesh 在过去的一年的迅猛发展,各大厂商都在投入精力开发适合自己的产品。而对于小厂来说虽不能自己开发,但选择也有很多,Linkerd、Envoy、Istio 、Conduit (Linkerd 2.0),甚至是 Consul 都在开发 Service Mesh。当中 Istio 因为出身名门和优秀的设计在众星之中脱颖而出,社区纷纷站队表示支持,尤其是发布 1.0 版本以后,更是引来众多关注。
Istio 虽然可以脱离 Kubernetes 运行,但从官方投入的精力和社区上的资料,都是基于 Kubernetes,如果不想采坑,还是老老实实的折腾 Kubernetes 吧。蚂蚁金服的 Jimmy song 创建了一个 kubernetes-vagrant-centos-cluster 项目,可以帮助我们很容易的启动 Kubernetes 集群。唯一不足是启动时会比较耗资源,而 Docker 的新版本也同样支持了 Kubernetes,于是便有了这篇文章。
安装 Kubernetes
在 Docker 18.06.0 的增加对 Kubernetes 的正式支持(在之前的版本也有支持,只是非正式版本)
这里调整了 docker 的内存为 4GB,之前默认 2GB 运行 Kubernetes 感觉会很吃力(当部署完Istio 这一套发现 4 GB也很吃紧,改成 7GB 后电脑才不那么热...)。
找到 Kubernetes 选项,勾选 Enable 选择 Kubernetes,然后执行 Apply
我们会看到 Kubernetes 一直在 starting... ,此时 docker 正在下载镜像,殊不知在遥远的东方有一堵“墙”,下载需要的镜像越过墙才可以。
要相信这个世界上总会有人与你一样遇到相同的问题,于是这个人就写了一个 github 仓库。按照文档所说,我们需要配置一下国内的代理,然后执行下载镜像脚本,再重新启动 Kubernetes ,Kubernetes 就这样奇迹般的启动起来了。
安装 kubectl
kubectl 是 Kubernetes 的客户端
brew install kubernetes-cli
# 或者更新
brew upgrade kubernetes-cli
安装 Kubernetes dashboard
kubectl create -f https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml
启动 proxy
kubectl proxy
访问这里:http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/
如果是想玩玩单点的 Kubernetes 到这里就结束啦~
安装 Istio
先下载 Istio 最新版本
找个你心仪的地方解压,然后配置环境变量:
export PATH="$PATH:/解压的目录/istio-1.0.0/bin"
如果放在 .bash_profile
或者 .zshrc
文件中记得要 source 一下
source ~/.bash_profile
验证一下是否生效
istioctl version
安装 Istio
这里为了快速简单的搭建 Istio ,使用 helm 来帮助我们。
安装 Helm
Helm 是 Kubernetes 的包管理器
brew install kubernetes-helm
# 验证一下
helm version
然后我们安装 Istio 步骤
如果 Helm 版本小于 2.10.0 ,请通过 kubectl apply 安装 Istio,并等待几秒钟,以便在kube-apiserver 中提交CRD:
kubectl apply -f install/kubernetes/helm/istio/templates/crds.yaml
kubectl apply -f install/kubernetes/helm/istio/charts/certmanager/templates/crds.yaml
官方文档提供了安装几种方式,Option 1 使用 helm template
安装,可选的东西比较少。所以我们选择 Option 2。
注意:这2个选项是互斥的,只能二选一哦。
-
如果还没有为 Tiller 配置 service account,请配置一个:
kubectl create -f install/kubernetes/helm/helm-service-account.yaml
-
使用 service account 在您的集群中安装 Tiller
helm init --service-account tiller
-
安装 Istio
helm install install/kubernetes/helm/istio --name istio --namespace istio-system \ --set tracing.enabled=true \ --set kiali.enabled=true \ --set grafana.enabled=true
默认 tracing 、kiali 、grafana 并不会开启,这里需要在安装时手动 --set xxx.enabled=true
进行开启。配置说明可查看:install/kubernetes/helm/istio/README.md
PS: kiali pod 部署时会无法正常启动,不影响使用,后面我们会再提到。
部署 Bookinfo
我们来部署一个官方的 Bookinfo Examples,进入 istio 的目录
kubectl apply -f <(istioctl kube-inject -f samples/bookinfo/platform/kube/bookinfo.yaml)
确认一下 service 和 pod 是否正确启动了
kubectl get services
kubectl get pods
然后我们来创建网关
kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml
再 check 一下
istioctl get gateway
注意! 后面会和官方文档不太一样啦,官方会去获取 ingress 的 ip 和端口,我们使用的 Docker for Mac 不需要查看映射端口,在 Dashboard 上找到 namespace 选择为 istio-system ,就可以看到我们映射的端口。
激动人心的时刻到啦,访问这里:http://localhost/productpage
就可以看到 Bookinfo 的demo啦!
卸载
可以直接参考官方文档啦!
分布式跟踪-Jaeger
开启 Jaeger 网络映射
kubectl port-forward -n istio-system $(kubectl get pod -n istio-system -l app=jaeger -o jsonpath='{.items[0].metadata.name}') 16686:16686 &
访问 http://127.0.0.1:16686/
可以点开具体的一次Trace来查看链路情况
更多好玩的东西请参考官方文档
使用Grafana 查询指标
先看来看我们的 Prometheus和 Grafana 是否正常
kubectl -n istio-system get svc prometheus
kubectl -n istio-system get svc grafana
开启 Grafana 网络映射
kubectl -n istio-system port-forward $(kubectl -n istio-system get pod -l app=grafana -o jsonpath='{.items[0].metadata.name}') 3000:3000 &
访问 http://localhost:3000/d/LJ_uJAvmk/istio-service-dashboard?refresh=10s&orgId=1
更多好玩的东西请参考官方文档
kiali
kiali 目前还在开发当中,所以不能用于生产,在Istio 默认不被开启,不过玩玩还是可以的。前面提到 kiali 在部署的时候无法启动,查看了一下原因是拉取的镜像为docker.io/kiali/kiali:istio-release-1.0
,而Docker hub 中根本没有这个 Tag ...
所以抱着试试看的态度,在 Dashboard 手动改一下 tag 为 latest ,更新!
开启映射网络端口
kubectl port-forward -n istio-system $(kubectl get pod -n istio-system -l app=kiali -o jsonpath='{.items[0].metadata.name}') 20001:20001 &
访问:http://localhost:20001/
账号密码:admin/admin
看起来还是蛮酷的,更多细节可以参考 Kiali 官方文档
停止Kubernetes
在不需要的时候我们可以将Kubernetes 停止,以保证我们 Mac 的性能,在安装了太多的组件后会比较耗电。
一切都可以重来...
Docker for Mac 还提供了一个非常人性的功能——Reset
无论我们是安装过程出了问题还是需要做各种测试,只需要轻轻点击 【Reset Kubernetes cluster】一切就重新开始。
总结
Istio 的 example 还有很多可以玩的,比如限流、故障注入、retry 等等,后面有机会再和大家分享。教程类的文章总有时效性,尤其像发展迅猛的Istio ,所以如果有安装失败的同学可以给我留言,反正我也不会改的。
今天就到这里啦,谢谢大家。
我的博客即将搬运同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=2bvwm2k9kftw0