Istio简介和安装

服务网格作为新一代的微服务架构,相比于侵入式代码实现微服务,将服务治理功能下沉到了基础设施层。Istio是目前最流行的开源服务网格实现,用于连接、监视和保护k8s集群中的容器。Istio的核心特性包括流量管理、可观察性和安全配置。

尽管Istio号称支持多种环境,但基本还是得基于k8s来搭建,本篇笔记我们学习如何在k8s集群上安装和使用Istio服务网格。

Istio服务网格

传统的微服务解决方案如SpringCloud等,服务治理(服务发现、熔断、超时、限流)功能是在业务代码工程中集成SDK实现的,这种设计其实是存在缺点的:侵入式设计,SDK耦合了业务代码工程;受限于语言和框架,不灵活。

而新一代的微服务架构「服务网格」,则是将服务治理功能下沉到了基础设施层(如图所示),图中每个业务服务旁边都有一个SideCar,我们的业务服务不再需要直接通信了,无需实现服务发现、熔断、超时、限流等诸多功能,只需专注业务逻辑开发即可,服务治理相关的功能都由SideCar接管,实现了服务治理和业务逻辑的解耦,所有的SideCar即组成了一个服务网格

Istio是目前比较流行的服务网格实现。从架构设计上,Istio服务网格可以分为两个部分:

控制平面:控制平面负责管理和配置SideCar,从而实现流量管理等诸多功能。

数据平面:数据平面由一组SideCar组成,SideCar由Envoy代理实现,负责代理业务服务的网络流量。

当然,服务网格架构虽然看起来很美好,但也不是完全没有缺点。目前如Istio等实现真正使用起来还是会遇到一些问题:

  1. 极高的使用成本:服务本身需要容器化部署,Istio本身也会占用一定的资源
  2. 极高的学习成本:Kubernetes和Istio中有大量新的概念需要开发人员了解
  3. 成倍增长的调用链路:SideCar代理模式让系统的调用链路变得更长,给系统凭空增加了至少一倍的复杂度
  4. 低下的性能表现:由于调用链路变长,控制平面性能不佳等问题,迁移到Istio系统性能会有所下降

Istio环境搭建

安装istioctl命令行工具

istioctl是管理Istio服务网格的命令行工具,具体安装前,我们需要安装该工具。根据官方文档,我们可以使用如下命令下载istioctl的预编译可执行文件:

curl -L https://istio.io/downloadIstio | sh -

下载完成后,我们会得到一个文件夹,其中bin目录包含istioctl的可执行二进制文件,我们可以将其加入环境变量。

验证安装成功:

istioctl version

安装Istio

Istio提供了许多组默认的配置文件,我们学习阶段可以直接部署demo这个配置组,并基于它进行修改。

istioctl install --set profile=demo -y

我们可以执行如下命令查看安装内容的部署文件:

istioctl profile dump demo

安装附加组件

除了Istio本体,我们通常还需要安装以下附加组件:

Kiali:Kiali提供了一个图形化界面,用于观察和配置Istio组件。

Prometheus:Prometheus是一个开源的监控系统,Istio对其进行了集成,用来收集监控数据。

Grafana:Grafana是一个数据可视化工具,用于以图表形式展示Prometheus收集的数据。

Jaeger:Jaeger是一个分布式链路跟踪系统,Istio集成了Jaeger实现应用流量的跟踪。Jaeger采集的链路跟踪数据则又依赖于ElasticSearch或kafka作为后端存储,对于这些周边组件本篇笔记就不再介绍了。

这些组件的资源清单文件都在Istio文件夹的samples/addons内,我们根据自身情况对其进行调整后,执行kubectl apply -f部署命令即可安装。

开启自动SideCar注入

前面介绍过服务网格的数据平面是基于SideCar实现的,Istio中我们的业务服务都需要基于SideCar实现服务治理。Istio支持对如下例子配置的k8s命名空间自动注入SideCar:

apiVersion: v1
kind: Namespace
metadata:
  name: dev
  labels:
    istio-injection: enabled

这里我们创建了一个名为dev的例子命名空间,同时为命名空间加了一个特殊的标签istio-injectionenabled,Istio会根据该标签,对命名空间下部署的服务自动进行SideCar注入。

安装使用MetalLB

我们知道k8s本身没有实现负载均衡LB,Service的LoadBalancer模式一般只支持公有云。不过最近出现了MetalLB工具,它能够让我们在本地环境下体验LoadBalancer模式,便于我们观察学习。

MetalLB有若干种工作模式,我们实验环境可以使用Layer2模式,该模式下,MetalLB会在选定节点上响应LB地址段的ARP请求,从而实现流量转发(当然这其实并没有起到负载均衡的作用,只是作为一个模拟的体验)。

部署配置文件:https://raw.githubusercontent.com/google/metallb/v0.8.3/manifests/metallb.yaml

使用MetalLB,除了部署文件我们还需要一个ConfigMap配置:

apiVersion: v1
kind: ConfigMap
metadata:
  namespace: metallb-system
  name: config
data:
  config: |
    address-pools:
    - name: default
      protocol: layer2
      addresses:
      - 192.168.1.130-192.168.1.159

addresses指定一个k8s集群同网段的地址段,供LB为LoadBalancer模式的Service分配地址。这样部署完成后,MetalLB会自动监测集群中LoadBalancer模式的Service,对符合条件的Service进行地址分配,同时在外部网络进行ARP广播占据IP地址,此时我们的LoadBalancer模式的istio-ingressgateway就能正常使用了。

Istio部署实例

Istio中有很多抽象的概念,安装好Istio环境后,建议结合例子来学习。下面的示例程序包括4个SpringBoot微服务工程,1个Vue前端工程,对应工程的Dockerfile及k8s部署文件,以及部署到Istio所需的虚拟服务和网关资源配置。

https://gitee.com/gacfox/demo-onlineshop

作者:Gacfox
版权声明:本网站为非盈利性质,文章如非特殊说明均为原创,版权遵循知识共享协议CC BY-NC-ND 4.0进行授权,转载必须署名,禁止用于商业目的或演绎修改后转载。
Copyright © 2017-2024 Gacfox All Rights Reserved.
Build with NextJS | Sitemap