Istio入门(服务网格Service Mesh)安装简介

Istio简介

Istio:一个连接,管理和保护微服务的开放平台。

按照isito文档中给出的定义:

Istio提供一种简单的方式来建立已部署的服务的网络,具备负载均衡服务到服务认证监控等等功能,而不需要改动任何服务代码。简单的说,有了Istio,你的服务就不再需要任何微服务开发框架(典型如Spring Cloud,Dubbo),也不再需要自己手动实现各种复杂的服务治理功能(很多是Spring Cloud和Dubbo也不能提供的,需要自己动手)。只要服务的客户端和服务端可以进行简单的直接网络访问,就可以通过将网络层委托Istio,从而获得一系列的完备功能。可以近似的理解为:

Istio = 微服务框架 + 服务治理。

Istio的关键功能

HTTP/1.1,HTTP/2,gRPC和TCP流量的自动区域感知负载平衡和故障切换。

通过丰富的路由规则,容错和故障注入,对流行为的细粒度控制。

支持访问控制,速率限制和配额的可插拔策略层和配置API。

集群内所有流量的自动量度,日志和跟踪,包括集群入口和出口。

安全的服务到服务身份验证,在集群中的服务之间具有强大的身份标识。

服务网格

微服务架构可谓是当前软件开发领域的技术热点,它在各种博客、社交媒体和会议演讲上的出镜率非常之高,无论是做基础架构还是做业务系统的工程师,对微服务都相当关注,而这个现象与热度到目前为止,已经持续了近 5 年之久。

尤其是近些年来,微服务架构逐渐发展成熟,从最初的星星之火到现在的大规模的落地与实践,几乎已经成为分布式环境下的首选架构。微服务成为时下技术热点,大量互联网公司都在做微服务架构的落地和推广。同时,也有很多传统企业基于微服务和容器,在做互联网技术转型。

而在这个技术转型中,国内有一个趋势,以 Spring Cloud 与 Dubbo 为代表的微服务开发框架非常普及和受欢迎。然而软件开发没有银弹,基于这些传统微服务框架构建的应用系统在享受其优势的同时,痛点也越加明显。这些痛点包括但不限于以下几点:

  • 侵入性强。想要集成 SDK 的能力,除了需要添加相关依赖,往往还需要在业务代码中增加一部分的代码、或注解、或配置;业务代码与治理层代码界限不清晰。
  • 升级成本高。每次升级都需要业务应用修改 SDK 版本,重新进行功能回归测试,并且对每一台机器进行部署上线,而这对于业务方来说,与业务的快速迭代开发是有冲突的,大多不愿意停下来做这些与业务目标不太相关的事情。
  • 版本碎片化严重。由于升级成本高,而中间件却不会停止向前发展的步伐,久而久之,就会导致线上不同服务引用的 SDK 版本不统一、能力参差不齐,造成很难统一治理。
  • 中间件演变困难。由于版本碎片化严重,导致中间件向前演进的过程中就需要在代码中兼容各种各样的老版本逻辑,带着 “枷锁” 前行,无法实现快速迭代。
  • 内容多、门槛高。Spring Cloud 被称为微服务治理的全家桶,包含大大小小几十个组件,内容相当之多,往往需要几年时间去熟悉其中的关键组件。而要想使用 Spring Cloud 作为完整的治理框架,则需要深入了解其中原理与实现,否则遇到问题还是很难定位。
  • 治理功能不全。不同于 RPC 框架,Spring Cloud 作为治理全家桶的典型,也不是万能的,诸如协议转换支持、多重授权机制、动态请求路由、故障注入、灰度发布等高级功能并没有覆盖到。而这些功能往往是企业大规模落地不可获缺的功能,因此公司往往还需要投入其它人力进行相关功能的自研或者调研其它组件作为补充。

Service Mesh 服务网格

架构和概念

目的是解决系统架构微服务化后的服务间通信和治理问题。设计初衷是提供一种通用的服务治理方案。

Sidecar 在软件系统架构中特指边车模式。这个模式的灵感来源于我们生活中的边三轮:即在两轮摩托车的旁边添加一个边车的方式扩展现有的服务和功能。

sidecar

这个模式的精髓在于实现了数据面(业务逻辑)和控制面的解耦:原来两轮摩托车的驾驶者集中注意力跑赛道,边车上的领航员专注周围信息和地图,专注导航。

Service Mesh 这个服务网络专注于处理服务和服务间的通讯。其主要负责构造一个稳定可靠的服务通讯的基础设施,并让整个架构更为的先进和 Cloud Native。在工程中,Service Mesh 基本来说是一组轻量级的与应用逻辑服务部署在一起的服务代理,并且对于应用服务是透明的。

开源实现

第一代服务网格 Linkerd和Envoy

Linkerd 使用Scala编写,是业界第一个开源的service mesh方案。作者 William Morgan 是 service mesh 的布道师和践行者。Envoy 基于C++ 11编写,无论是理论上还是实际上,后者性能都比 Linkderd 更好。这两个开源实现都是以 sidecar 为核心,绝大部分关注点都是如何做好proxy,并完成一些通用控制面的功能。 但是,当你在容器中大量部署 sidecar 以后,如何管理和控制这些 sidecar 本身就是一个不小的挑战。于是,第二代 Service Mesh 应运而生。

第二代服务网格 Istio

Istio 是 Google 和 IBM 两位巨人联合 Lyft 的合作开源项目。是当前最主流的service mesh方案,也是事实上的第二代 service mesh 标准。

安装Istio

环境准备

主机名IP角色
k8s-mastereth0:10.1.1.100、docker:172.17.100.0/24K8S-master
k8s-node1eth0:10.1.1.120、docker:172.17.120.0/24K8S-node
k8s-node2eth0:10.1.1.130、docker:172.17.130.0/24K8S-node
nginx-proxyeth0:10.1.1.11代理节点

https://istio.io/latest/docs/setup/getting-started/

下载 Istio

下载内容将包含:安装文件、示例和 istioctl 命令行工具。

  1. 访问 Istio release 页面下载与您操作系统对应的安装文件。在 macOS 或 Linux 系统中,也可以通过以下命令下载最新版本的 Istio:

    1
    $ wget https://github.com/istio/istio/releases/download/1.16.2/istio-1.16.2-linux-amd64.tar.gz
  2. 解压并切换到 Istio 包所在目录下。例如:Istio 包名为 istio-1.16.2,则:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    $ tar xf istio-1.16.2-linux-amd64.tar.gz -C /opt/
    $ ll /opt/istio-1.16.2
    drwxr-x--- 2 root root 22 Jul 15 13:32 bin
    -rw-r--r-- 1 root root 11348 Jul 15 13:32 LICENSE
    drwxr-xr-x 5 root root 52 Jul 15 13:32 manifests
    -rw-r----- 1 root root 854 Jul 15 13:32 manifest.yaml
    -rw-r--r-- 1 root root 5866 Jul 15 13:32 README.md
    drwxr-xr-x 20 root root 332 Jul 15 13:32 samples
    drwxr-xr-x 3 root root 57 Jul 15 13:32 tools
  3. istioctl 客户端拷贝到 path 环境变量中

    1
    2
    $ cd /opt/istio-1.16.2/
    $ cp bin/istioctl /bin/
  4. 配置命令自动补全

    istioctl 自动补全的文件位于 tools 目录。通过复制 istioctl.bash 文件到您的 home 目录,然后添加下行内容到您的 .bashrc 文件执行 istioctl tab 补全文件:

    1
    2
    3
    4
    5
    6
    # 命令自动补齐
    $ source tools/istioctl.bash
    # 永久生效
    $ cat >> ~/.bashrc <<EOF
    source /opt/istio-1.16.2/tools/istioctl.bash
    EOF

安装istio组件

https://istio.io/latest/zh/docs/setup/install/istioctl/#display-the-configuration-of-a-profile

使用istioctl直接安装:

1
2
3
4
5
6
7
8
9
10
11
12
$ istioctl install --set profile=demo -y
✔ Istio core installed
✔ Istiod installed
✔ Egress gateways installed
✔ Ingress gateways installed
✔ Installation complete

$ kubectl -n istio-system get pods
NAME READY STATUS RESTARTS AGE
istio-egressgateway-5b5784f585-547s8 1/1 Running 0 47s
istio-ingressgateway-59c48cf75c-4h6zl 1/1 Running 0 48s
istiod-cd8b89c66-92xhq 1/1 Running 0 47s

istio针对不同的环境,提供了几种不同的初始化部署的profilehttps://istio.io/latest/docs/setup/additional-setup/config-profiles/

1
2
3
4
5
# 查看提供的profile类型
$ istioctl profile list

# 获取kubernetes的yaml:
$ istioctl manifest generate --set profile=demo > istio-kubernetes-manifest.yaml

卸载

1
$ istioctl manifest generate --set profile=demo | kubectl delete -f -