Istio实践(1)- 环境搭建及应用部署

1. Istio简介

Istio是最初由IBM,Google和Lyft开发的服务网格的开源实现。它可以透明地分层到分布式应用程序上,并提供服务网格的所有优点,例如流量管理,安全性和可观察性。
它旨在与各种部署配合使用,例如本地部署,云托管,Kubernetes容器以及虚拟机上运行的服务程序。尽管Istio与平台无关,但它经常与Kubernetes平台上部署的微服务一起使用。
从根本上讲,Istio的工作原理是以Sidcar的形式将Envoy的扩展版本作为代理布署到每个微服务中

image

2. 环境准备与安装

本文使用现有的k3s集群环境,使用rancher2.6.3管理工具安装Istio,比较方便,当然你也可以使用k8s的环境进行安装,方法请自行查找
进入Rancher管理工具界面,点击“集群工具”,分别安装Istio与Monitoring,我这里已安装完毕,点击安装后,等待安装成功即可

image

安装Istio工具,可以选择想安装的组件,这里勾上Jaeger跟踪

image

安装成功后,点击Istio工具菜单,即可进入Istio工具界面

image

3. Istio组件-VirtualService(虚拟服务)

VirtualService中文名称虚拟服务,是istio中一个重要的资源, 它定义了一系列针对指定服务的流量路由规则。每个路由规则都针对特定协议的匹配规则。如果流量符合这些特征,就会根据规则发送到服务注册表中的目标服务(或者目标服务的子集或版本)。
VirtualService和k8s service的区别
如果没有 Istio virtual service,仅仅使用 k8s service 的话,那么只能实现最基本的流量负载均衡转发,但是就不能实现类似按百分比来分配流量等更加复杂、丰富、细粒度的流量控制了。

4. Istio组件-目标规则 (Destination Rule)

目标规则(Destination Rule)是 Istio 重要的资源对象之一,它不能独自使用,必须跟 Virtual Service 共同发挥作用,作用是将流量标记分组并路由到具体服务。
Destination Rule 还可以做什么?
通常在生产场景下,用使用 Destination Rule 对用户进行身份、地址位置等条件的识别后的流量路由,例如部分用户优先享用新版本,则可以通过HTTP Header附加相关的字段进行识别,路由到新版本的服务上。或者在版本更新的时候,使用灰度发布,对新旧版本标记子集,按照不同的负载百分比进行调整逐步迭代。

5. Istio应用部署实战

  • 应用准备:使用以前springbootapp镜像,xjk27400861/springbootapp:42与xjk27400861/springbootapp:43两个镜像,部署两个版本的应用
  • 创建命名空间,springistiodemo,在k3s集群的任意一个节点执行
    命令:
      sudo kubectl create namespace springistiodemo
    

    image

  • 自动注入(给命名空间打指定标签,启用自动注入)
      sudo kubectl label namespace springistiodemo istio-injection=enabled
    

    image

  • 查看标签状态
      sudo kubectl get ns springistiodemo --show-labels
    

    image

  • 禁用自动注入命令
      sudo kubectl label namespace springistiodemo istio-injection=disabled –overwrite
    

    image

  • 启用命名空间,自动注入后,rancher界面显示按钮为:禁用Istio自动注入

    image

  • 手动注入方式,(其他安装方式),rancher暂未找到执行istioctl命令的窗口
      sudo istioctl kube-inject -f springbootapp-2nodes.yaml | sudo kubectl apply -f -
    
  • 新建springbootapp-2nodes.yaml文件,执行命令部署应用
      sudo kubectl create -f springbootapp-2nodes.yaml -n springistiodemo
    
  • springbootapp-2nodes.yaml文件内容,2个版本的服务,分别为v1和v2

    image
    image

  • 稍等片刻,可以看到两个服务创建完成

    image

  • 创建及部署目标规则springbootapp-destination.yaml
      sudo kubectl apply -f springbootapp-destination.yaml -n springistiodemo
    

    image

  • GateWay创建,供外网访问
      sudo kubectl apply -f springbootapp-vs-v1.yaml -n springistiodemo
    

    image

  • 创建及部署默认路由springbootapp-vs-v1.yaml,访问都访问v1版本服务
      sudo kubectl apply -f springbootapp-vs-v1.yaml -n springistiodemo
    

    image

  • 输入命令:sudo kubectl get svc istio-ingressgateway -n istio-system,查看端口映射,发现31380端口对应80端口

    image

  • 通过k3s主机ip+端口/method,访问api,http://192.168.231.133:31380/hello or http://192.168.231.134:31380/hello, 可以看到结果都被转到v1版本上:

    image

  • 查看kiali界面,查看调用路径,namespace选择2个istio-system和springistiodemo,发现通过ingressgateway访问的服务都定位在了v1版本上

    image

  • 也可以通过在istio-ingressgateway的service中,添加端口映射,映射到应用上,可以不用80端口;例如:加端口映射8066-8080-31386,同时gateway的yaml文件,number属性改为8066,即可通过31386端口,访问服务(http://ip:31386

    image