使用 Kubernetes 集成 Istio 实现服务网格

前言

随着微服务的流行,伴随而来的是服务治理难题。传统的客户端发现,比如使用 Eureka 或者 Consul,随着节点数量的增加,维护的难度也与日俱增。同时,服务调用的流量也变得越来越大,流量的监管和控制也变得越来越困难。

而服务网格则是一种相对比较好的解决方案,它提供了对流量进行管理的能力,比如能够进行流量的限制、流量的监控等。在现在已经有了很多成熟的服务网格框架,如 Linkered、Envoy 和 Istio 等。

本文将介绍如何使用 Istio 集成 Kubernetes 实现服务网格。

环境准备

  • Kubernetes 集群
  • Istio

Istio 基本概念

在上面的文章中,我们说了服务网格的好处,那么 Istio 提供了哪些好处呢?

Istio 可以提供以下功能:

  • 流量的控制:路由、限流、熔断器
  • 安全:流量加密、身份认证
  • 监控:流量的可视化、日志
  • 服务的发现

Istio 也有一些基本组件:

  • Pilot:这个是使用来发现和注册服务的
  • Citadel:也是一个服务,这个服务的作用就是用来提供服务之间的认证和加密的
  • Mixer:是 Istio 中的扩展点,用于限流、监控、日志收集等等
  • Envoy:这个是一个高性能的代理,作为 Istio 的 Sidecar,用来控制服务之间的流量

其中,Mixer 可以进行自定义扩展,我们只需要编写一些纯 Funtion 的代码,就可以在 Mixer 上做自定义的限流、监控等功能。这个可扩展的能力,让 Istio 成为一个非常灵活的平台。

为了方便,我们再给这些概念进行一个图形化的展示:

Kubernetes 集成 Istio 的过程

前置条件是先安装好 Kubernetes 集群和 Istio

1. 安装 Istio

可以直接通过官方提供的 Helm Chart 来安装 Istio。具体安装方式可参考官方文档

2. 打开 Istio 的自动注入

打开 Istio 的自动注入后,Kubernetes 的 Pod 里面就都带有了 Istio 的 Sidecar。具体命令如下:

------- ----- --------- ------- -----------------------

3. 部署应用

在 Kubernetes 中部署应用的时候需要注意以下细节:

  • 需要将 Istio 的代理 Envoy 部署在每个 Pod 里面
  • 需要在 Kubernetes Service 中将负载均衡规则的指向 Envoy

我们对应地修改一下 Kubernetes 的 YAML 文件:

----------- -------
----- ----------
---------
  ----- ---------------
  -------
    ---- ---------------
-----
  --------- -
  ---------
    ------------
      ---- ---------------
  ---------
    ---------
      -------
        ---- ---------------
    -----
      -----------
        - ----- ---------------
          ------ ----------------------
          ------
            - -------------- ----
        - ----- -----
          ------ ----------------------------- 
          ------
            - -------------- -----
            - -------------- -----
          -------------
            - ----- -------------
              ---------- ----------
      --------
        - ----- -------------
          ----------
            ----- ------------
---
----------- --
----- -------
---------
  ----- ---------------
  -------
    ---- ---------------
-----
  ------
    - ----- ----
      ----- ----
      --------- ---
      ----------- ----
    - ----- -----
      ----- -----
      ----------- -----
      --------- ---
    - ----- ----------------
      ----- -----
      ----------- -----
      --------- ---
  ---------
    ---- ---------------

我们对这个 YAML 文件进行一下简单的分析:

  • 在 Pod 的 containers 里面,我们增加了一个 Envoy 的容器,监听了两个端口:15006 和 15090。
  • 在 Service 对象里面增加了 http2http2-prometheus 两个端口。

4. 确认应用是否可以成功访问

现在我们部署好了应用,可以通过 Kubernetes Service 的 IP 地址来访问应用:http://service-ip:8080。现在我们运行一下 curl http://service-ip:8080,看看是否可以成功访问应用。

5. 部署 Istio 的 CRD 对象

我们可以使用 kubectl apply 命令,将 Istio 的 CRD 对象部署到 Kubernetes 集群中:

------- ----- -- ------------------------------------------------------------------------------------------------------

6. 观察应用流量集成 Istio

如果使用 Istio,我们可以更方便地监控应用的流量。启动 Istio 中的 Kiali 组件,可以直接看到具体的流量图。

------- ----- -- -----------------------------------------------------------------------------------

等待 Kiali 运行后,即可看到我们部署的应用的具体流量状态:

上图中,我们可以看到我们所部署的应用流量的整条路径,其中的 Envoy,就是我们之前增加的 Sidecar 容器所监听的端口,从而实现了对应用的流量的控制。

总结

本文是一篇入门级的 Istio 教程,我们从 Istio 的基本概念,到 Kubernetes 集成 Istio 的过程,一步一步地深入解析 Istio。通过阅读本文,你已经了解了 Istio 和 Kubernetes 集成的基本原理,以及应用中如何集成 Istio。

在实际使用 Istio 时,我们也可以结合 Service Mesh Interface(SMI)标准,控制 Service Mesh 中的流量。随着社区的不断发展,Istio 的使用也会越来越方便。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6644b91bd3423812e429b370