k8s istio 集成 多版本应用服务 和 网格监测

说明

博客文章地址:https://blog.taoluyuan.com/posts/istio-getting-started/
本主要是内容:

  1. 使用 istioctl 安装 istio
  2. 采用 istio 官方提供 的 应用bookinfo,实现多版本的服务应用部署
  3. istio 网关 gateway,vs,dr 的基本使用
  4. 利用监测工具 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配置组合安装文档

  1. 采用 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
  1. 给命名空间添加标签,指示 在 default命名空间 部署应用的时候,自动注入 Envoy
kubectl label namespace default istio-injection=enabled
  1. 安装的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 个红色星形图标来显示评分信息。

    k8s istio 集成 多版本应用服务 和 网格监测_第1张图片

安装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,方便大家查看

验证安装的服务

  1. 上面的命令会启动全部的四个服务,其中也包括了 reviews 服务的三个版本(v1、v2 以及 v3)
  2. 确认 service和pod 都启动成功
kubectl get services
kubectl get pods
  1. 确认bookinfo 接口服务 是否正常
kubectl exec -it $(kubectl get pod -l app=ratings -o jsonpath='{.items[0].metadata.name}') -c ratings -- curl productpage:9080/productpage | grep -o ".*"

上面命令步骤为:

  1. 通过 kubectl get pod -l app=ratings -o jsonpath=‘{.items[0].metadata.name}’ 获取到 ratings 服务的pod名称
  2. 通过 kubectl exec -it $(…) -c ratings 进入到 ratings 容器中
  3. 通过 curl productpage:9080/productpage 来访问 productpage 服务,并且通过 grep -o “.*” 来查看返回的页面的title,如果返回有值,说明服务正常
  4. 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           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 替换成自己的
k8s istio 集成 多版本应用服务 和 网格监测_第2张图片
如官网所说,多刷新几次应用的页面,就会 看到 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

k8s istio 集成 多版本应用服务 和 网格监测_第3张图片

使用 jaeger 监控网格

使用以下命令打开 jaeger,会自动打开浏览器

istioctl dashboard jaeger

k8s istio 集成 多版本应用服务 和 网格监测_第4张图片

使用 grafana 监控网格

使用以下命令打开 prometheus,会自动打开浏览器

istioctl dashboard grafana

k8s istio 集成 多版本应用服务 和 网格监测_第5张图片

总结

istio 部署多版本应用 和 可视化网格监控 已完成
文字有点多,但是操作起来很简单,我将所有的 yaml 文件都放在了仓库中github k8s-istio-practice,将所有的命令都写在了 makefile 中,只需要执行以下:

  1. 安装 istio
make install-istio
  1. 部署 bookinfo 应用
make install-bookinfo
  1. 部署网关和路由
make install-bookinfo-gateway
  1. 修改 istio-ingressgateway 为 NodePort
    执行以下命令 修改 istio-ingressgateway 为 NodePort,并且将 port: 80 映射为 port: 30080
kubectl edit svc istio-ingressgateway -n istio-system
  1. 访问 bookinfo 服务
    通过 k8s 节点的 ip 和 port 来访问 bookinfo 服务了,需要将ip,prot 替换成自己的
  http://192.168.31.180:30080/productpage
  1. 通过 监测工具监控网格
  • 安装 istio Telemetry Addons
make install-telemetry-addons
  • 打开 kiali
istioctl dashboard kiali

你可能感兴趣的:(kubernetes,istio,java)