说明
博客文章地址:https://blog.taoluyuan.com/posts/istio-getting-started/
本主要是内容:
- 使用 istioctl 安装 istio
- 采用 istio 官方提供 的 应用bookinfo,实现多版本的服务应用部署
- istio 网关 gateway,vs,dr 的基本使用
- 利用监测工具 prometheus,grafana,jaeger 查看 istio 的监控数据
文章提到的yaml,也是istio官方提供的,整理后单独放到github github k8s-istio-practice
根目录 makefile 集成了相关命令,你们可以直接通过 makefile 安装 service,gateway,vs,dr,监控,以实现跟文章一样的效果
istio
官方文档:https://istio.io/latest/zh/docs/
安装
参考官方安装文档:官方demo配置组合安装文档
- 采用 demo 配置组合,它包含了一组专为测试准备的功能集合
curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.17.2 sh - && \
cd istio-1.17.2 && \
export PATH=$PWD/bin:$PATH && \
istioctl install --set profile=demo
- 给命名空间添加标签,指示 在 default命名空间 部署应用的时候,自动注入 Envoy
kubectl label namespace default istio-injection=enabled
- 安装的istio相关资源在 istio-system 命名空间下,可以通过以下查看安装的资源
k get all -n istio-system
bookinfo 应用程序
bookinfo 架构及介绍
bookinfo 由四个单独的微服务构成 ,以下是官方对bookinfo的介绍,也可以直接看官方文档 istio-bookinfo
这个应用模仿在线书店的一个分类,显示一本书的信息。 页面上会显示一本书的描述,书籍的细节(ISBN、页数等),以及关于这本书的一些评论。
Bookinfo 应用分为四个单独的微服务:
- productpage. 这个微服务会调用 details 和 reviews 两个微服务,用来生成页面。
- details. 这个微服务中包含了书籍的信息。
- reviews. 这个微服务中包含了书籍相关的评论。它还会调用 ratings 微服务。
- ratings. 这个微服务中包含了由书籍评价组成的评级信息。
reviews 微服务有 3 个版本:
-
v1 版本不会调用 ratings 服务
-
v2 版本会调用 ratings 服务,并使用 1 到 5 个黑色星形图标来显示评分信息。
-
v3 版本会调用 ratings 服务,并使用 1 到 5 个红色星形图标来显示评分信息。
安装bookinfo
官方提示安装 bookinfo的命令
kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml
bookinfo.yaml 的istio 源码地址在 bookinfo
我将同名文件 bookinfo.yaml 下载后, 放到了本仓库的根目录 可以在 本地
执行
kubectl apply -f ./bookinfo.yaml
或者 make
make install-bookinfo
文章后面关于 yaml 的文件,我都会将官方的yaml下载到本地,演示也是用本地的yaml,方便大家查看
验证安装的服务
- 上面的命令会启动全部的四个服务,其中也包括了 reviews 服务的三个版本(v1、v2 以及 v3)
- 确认 service和pod 都启动成功
kubectl get services
kubectl get pods
- 确认bookinfo 接口服务 是否正常
kubectl exec -it $(kubectl get pod -l app=ratings -o jsonpath='{.items[0].metadata.name}') -c ratings -- curl productpage:9080/productpage | grep -o "<title>.*</title>"
上面命令步骤为:
- 通过 kubectl get pod -l app=ratings -o jsonpath=‘{.items[0].metadata.name}’ 获取到 ratings 服务的pod名称
- 通过 kubectl exec -it $(…) -c ratings 进入到 ratings 容器中
- 通过 curl productpage:9080/productpage 来访问 productpage 服务,并且通过 grep -o “
.* ” 来查看返回的页面的title,如果返回有值,说明服务正常 - bookinfo.yam 的 service port 里面定义了 9080,所以可以通过 productpage:9080/productpage 来访问 productpage 服务
注意:
源码,bookinfo里面调用是用的短名称,建议您在生产环境中指定完全限定的主机名,比如 productpage.default.svc.cluster.local
对外开放bookinfo 服务
Service 的默认类型是 ClusterIP,目前 bookinfo 只是集群内部的服务,外部无法访问
需要创建一个 Gateway 和 VirtualService 来对外开放服务
安装 Gateway 和 VirtualService
kubectl apply -f ./bookinfo-gateway.yaml
或者 make
make install-bookinfo-gateway
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: bookinfo-gateway
spec:
selector:
istio: ingressgateway # use istio default controller
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- "*"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: bookinfo
spec:
hosts:
- "*"
gateways:
- bookinfo-gateway
http:
- match:
- uri:
exact: /productpage
- uri:
prefix: /static
- uri:
exact: /login
- uri:
exact: /logout
- uri:
prefix: /api/v1/products
route:
- destination:
host: productpage
port:
number: 9080
通过以下命令查看 Gateway 和 VirtualService 是否创建成功
kubectl get gateway
kubectl get virtualservice
可以看到 有一个 bookinfo-gateway 和 bookinfo 的 VirtualService
修改 istio-ingressgateway 为 NodePort
通过以下命令获取到 ingressgateway 的 ip
kubectl get svc istio-ingressgateway -n istio-system
istio-ingressgateway默认的服务类型是LoadBalancer,我是本地机器安装的k8s,修改 istio-ingressgateway type LoadBalancer 为 NodePort,port: 80 映射为 port: 30080
可以通过 nodeip:30080/productpage 来访问 bookinfo 服务
kubectl edit svc istio-ingressgateway -n istio-system
上面命令 会打开一个vim 编辑器,你需要修改 type 为 NodePort,并且将 修改 port: 80 映射为 port: 30080
查看修改结果
kubectl get svc istio-ingressgateway -n istio-system
显示类似为
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
istio-ingressgateway NodePort 10.43.249.207 <none> 15021:30177/TCP,80:30080/TCP,443:30068/TCP,31400:30163/TCP,15443:30184/TCP 43d
访问 bookinfo 服务
上面已经将 istio-ingressgateway 的type 设置为 NodePort,并且将 port: 80 映射为 port: 30080
可以直接通过 k8s 节点的 ip 和 port 来访问 bookinfo 服务了
我的集群ip是 192.168.31.180,所以可以通过 http://192.168.31.180:30080/productpage 访问bookinfo 服务,需要将ip,prot 替换成自己的
如官网所说,多刷新几次应用的页面,就会 看到 productpage 页面中会随机展示 reviews 服务的不同版本的效果(红色、黑色的星形或者没有显示)。reviews 服务出现这种情况是因为还没有使用 Istio 来控制版本的路由。
可视化网格监控
安装 istio Telemetry Addons
istion 和几个遥测应用都做了集成:kiali,jaeger,prometheus,grafana ,可以通过这些工具来监控 istio 的网格
istio Telemetry Addons相关源码位置在 istio Telemetry Addons
我将 istio Telemetry Addons 其中的 jaeger,prometheus,grafana,kiali 相关的yaml文件放在 仓库 addons 目录下,可以通过以下命令安装
kubectl apply -f ./addons
或者
make install-telemetry-addons
等待安装完成后,通过以下命令查看kiali 是否部署完成
kubectl rollout status deployment/kiali -n istio-system
istio 官方文档说,采样率默认是 1%,所以要想查看追踪数据在第一个跟踪可见之前,您需要发送至少 100 个请求。 使用以下命令向 productpage 服务发送 100 个请求,需要注意将ip,prot 替换成自己的
for i in `seq 1 100`; do curl -s -o /dev/null http://192.168.31.180:30080/productpage; done
或者 make,需要将makefile 中的GATEWAY_URL 替换成自己的
make send-100-request
使用 kiali 监控网格
使用以下命令打开 kiali,会自动打开浏览器
istioctl dashboard kiali
使用 jaeger 监控网格
使用以下命令打开 jaeger,会自动打开浏览器
istioctl dashboard jaeger
使用 grafana 监控网格
使用以下命令打开 prometheus,会自动打开浏览器
istioctl dashboard grafana
总结
istio 部署多版本应用 和 可视化网格监控 已完成
文字有点多,但是操作起来很简单,我将所有的 yaml 文件都放在了仓库中github k8s-istio-practice,将所有的命令都写在了 makefile 中,只需要执行以下:
- 安装 istio
make install-istio
- 部署 bookinfo 应用
make install-bookinfo
- 部署网关和路由
make install-bookinfo-gateway
- 修改 istio-ingressgateway 为 NodePort
执行以下命令 修改 istio-ingressgateway 为 NodePort,并且将 port: 80 映射为 port: 30080
kubectl edit svc istio-ingressgateway -n istio-system
- 访问 bookinfo 服务
通过 k8s 节点的 ip 和 port 来访问 bookinfo 服务了,需要将ip,prot 替换成自己的
http://192.168.31.180:30080/productpage
- 通过 监测工具监控网格
- 安装 istio Telemetry Addons
make install-telemetry-addons
- 打开 kiali
istioctl dashboard kiali