在 Kubernetes 中使用 Service Mesh 实现微服务治理

微服务架构的出现,让我们可以将大型应用拆分成独立部署、可维护和扩展的小型微服务。随着微服务数量的增加,治理变得越来越复杂。为了应对这一挑战,Service Mesh 技术应运而生。

本文将介绍在 Kubernetes 中使用 Service Mesh 实现微服务治理,并提供示例代码和指导意义,帮助读者深入学习和理解该技术。

什么是 Service Mesh?

Service Mesh 是一个新兴的微服务治理模型,它提供了一个云原生的解决方案,用于将微服务的部署、管理和监控从应用程序中解耦出来。Service Mesh 实现了对服务间通信的控制和管理,从而可以更好地协调和协作微服务。

在 Service Mesh 的体系结构中,数据流与控制流分离,通过注入 sidecar(代理)容器,来实现服务的路由、负载均衡、服务发现、故障恢复、安全认证和监控等一系列功能,并将这些功能进行统一的管理。

Service Mesh 的组件和架构

让我们来看一下 Service Mesh 的组件和架构,服务网格中的两个最重要的组件是:

  • 控制器(Control Plane):控制器是服务网格中的核心组件,演示实时路由、流量管理、安全认证等操作,并且一般提供图形化的用户界面给管理员使用,方便管理整个服务网格。
  • sidecar 代理容器(Sidecar Proxy Containers):这些容器负责将所有的网络请求和响应拦截下来,然后由控制器进行把控,实现微服务治理和流量控制。

如图所示,整个 Service Mesh 架构中,sidecar 容器被注入到每个服务中,用于处理进出该服务的网络流量,实现微服务治理和流量控制。

Kubernetes 中 Service Mesh 的实现

下面我们来介绍如何在 Kubernetes 中使用 Istio 来实现 Service Mesh 技术。

安装 Istio

首先要确认 Kubernetes 集群是否参考官方安装文档配置了 Istio 的要求。然后,在 Kubernetes 中安装 Istio 的核心组件是使用 Helm 这个包管理工具。文旦这里使用 Helm 3 版本来进行安装:

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

上面的命令将 Istio 安装到 Kubernetes 集群中,并部署了 Istio 组件和配置相关的 Kubernetes 资源。

部署微服务应用

接下来,我们需要在 Kubernetes 上部署一个简单的微服务应用进行演示。这里我们选择在 Kubernetes 上部署一个 SpringBoot 应用 Helloworld。

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

上面的 YAML 文件定义了一个 Deployment 和一个 Service,其中:

  • Deployment 使用 superleeyom/helloworld 镜像创建了 3 个副本
  • Service 将 HTTP 路由到 helloworld 的 8080 端口

如果您想了解有关如何在 Kubernetes 中部署 SpringBoot 应用的更多信息,请参考我的另一篇博客 《Docker 容器化 SpringBoot 应用部署到 Kubernetes》 进行学习。

Istio Sidecar 注入

现在我们已经准备好部署微服务应用和 Istio,下面我们将使用 Istio sidecar 自动注入功能将 Istio sidecar 副本注入到 Helloworld Deployment 中。

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

首先,我们需要在 namespace 中启用 istio-injection=enabled 标签。这表明新创建的所有 pods 都将自动注入 Istio sidecar。

其次,应用 Kubernetes 服务清单(yaml)文件:

  • 使用默认命名空间
  • 启用 Istio sidecare 自动注入的标签
  • 启用应用程序和服务

然后,通过使用以下命令来查看您的 Istio sidecar 是否已被注入:

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

测试 Istio

现在我们已经将 Istio sidecar 注入到 Helloworld Deployment 中,我们需要测试 Istio 是否成功加载,并控制 Kubernetes 群集中的流量。

首先,使用 kubectl apply 应用下面的虚拟服务配置文件(virtual-service.yaml):

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

该配置文件将 Helloworld 应用程序的所有流量定向到 8080 端口。要查看 Istio Sidecar 是否汇总了运行的 pod,请使用以下命令:

- -------- --

最后,要查看哪些部署处理了请求,使用以下 Istio 命令:

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

监控与可视化

要将 Istio dashboard 用于监视 Kubernetes 上的微服务治理,您需要为其创建一个 NodePort。然后,您就可以在 Kubernetes 外部使用这个 NodePort 来访问 Istio。

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

现在可以通过访问 Istio Gateway 了解 Istio 群集中的详细信息:

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

结论

在 Kubernetes 中使用 Service Mesh 实现微服务治理是保持技术创新的迈出的一步。本文介绍了 Service Mesh 的概念、技术组件、Kubernetes 环境下的部署和安装指南,以及如何使用 Istio 进行监视和可视化。

Service Mesh 在微服务和云原生架构中具有很大的前途和潜力,帮助团队更好地管理和扩展应用程序。

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