使用 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


猜你喜欢

  • RxJS 中的 expand 操作符详解

    什么是 RxJS RxJS 是一个 JavaScript 库,它使用可观察序列来编写异步和基于事件的程序。它提供了一种方便的方式来处理异步操作,例如处理用户输入、网络请求和定时器等。

    5 个月前
  • ESLint 如何帮助你规范化代码中的逻辑判断

    在前端开发中,代码的规范化是非常重要的,因为规范化的代码可以提高代码的可读性、可维护性和可扩展性。ESLint 是一个非常流行的 JavaScript 代码检查工具,可以帮助我们规范化代码中的逻辑判断...

    5 个月前
  • 如何在 Chai.js 中进行对象深度相等测试?

    在前端开发中,我们经常需要比较两个对象是否相等。但是,JavaScript 中的对象比较有很多坑,例如对象的属性顺序、对象的类型等等。为了避免这些问题,我们可以使用 Chai.js 中的深度相等测试来...

    5 个月前
  • PWA 中如何实现骨架屏效果

    随着 PWA 技术的发展,越来越多的网站开始采用 PWA 技术来提升用户体验。而骨架屏效果是 PWA 中常用的一种优化手段,可以让用户在等待页面加载时看到页面的基本结构,提升用户体验。

    5 个月前
  • CSS Reset 好还是 Normalize.css 好?

    在前端开发中,我们经常需要处理各种浏览器的兼容性问题。其中一个常见的问题是不同浏览器对 CSS 样式的默认设置不同,导致同一份代码在不同浏览器上的显示效果不同。为了解决这个问题,出现了 CSS Res...

    5 个月前
  • 对 webpack 工程化打包优化的个人总结

    Webpack 是一款非常强大的前端打包工具,它可以将多个文件打包成一个文件,从而提高网站的性能和加载速度。但是,在实际使用中,我们可能会遇到一些性能瓶颈,比如打包速度慢、体积过大等问题。

    5 个月前
  • 为什么 Sequelize 上光查询到 0 条数据呢?

    Sequelize 是一个基于 Node.js 的 ORM(Object-Relational Mapping)框架,它可以让开发者使用 JavaScript 语言操作关系型数据库,如 MySQL、P...

    5 个月前
  • 如何使用 ES11 的 globalThis 对象解决 JS 中的环境问题

    在 JavaScript 中,环境问题是一个非常常见的问题。由于 JavaScript 可以在多个环境中运行,如浏览器、Node.js 等,这导致了一些全局对象(例如 window、global)在不...

    5 个月前
  • Web Components 与 PWA 的实践

    前言 Web Components 是一种新的 Web 技术,它允许开发者创建可重用的自定义 HTML 元素,并将其封装在一个组件中。这种技术可以使 Web 开发更加模块化、灵活和可维护,同时也能提高...

    5 个月前
  • Docker 容器安装及操作详解

    什么是 Docker? Docker 是一种开源的容器化技术,它可以将应用程序及其依赖项打包到一个可移植的容器中,从而实现快速、可靠的应用程序部署。Docker 可以在多种操作系统上运行,包括 Lin...

    5 个月前
  • LESS 常见错误以及解决方法

    LESS 是一种 CSS 预处理器,通过它可以使用变量、嵌套、混合等特性,使得 CSS 更加易于维护和扩展。不过,由于 LESS 本身的语法比较复杂,开发过程中容易出现一些错误。

    5 个月前
  • 如何利用 Golang 开发高性能 RESTful API

    在当今互联网时代,RESTful API 已经成为了开发 Web 应用程序的重要组成部分。而 Golang 作为一门高性能的编程语言,也被越来越多的开发者所关注和使用。

    5 个月前
  • 了解 ES9 中的可选捕获组的语法(Optional Capturing Groups)

    在 ES9(ECMAScript 2018)中,新增了一种语法——可选捕获组(Optional Capturing Groups),它可以在正则表达式中使用,为开发者提供了更加方便快捷的处理字符串的方...

    5 个月前
  • ES10 中的对象半个属性

    在 ES10 中,新增了一种对象半个属性的概念,这种属性可以被赋予一个默认值,但是在访问时需要使用 getter 函数来获取。这种属性可以用来优化对象的性能和灵活性。

    5 个月前
  • 使用 Hapi.js 实现服务器端渲染(SSR)

    随着前端技术的不断发展,单页应用(SPA)越来越受到欢迎。但是,SPA 也存在一些缺陷,比如 SEO 不友好、首屏加载慢等问题。为了解决这些问题,服务器端渲染(SSR)成为了一种流行的解决方案。

    5 个月前
  • 如何使用 Server-sent Events 实现消息推送

    在现代应用程序中,消息推送已成为必不可少的功能。它可以使用户在应用程序处于非活动状态时仍然能够接收到实时更新。Server-sent Events (SSE) 是一种轻量级的协议,用于实现服务器向客户...

    5 个月前
  • 解决 Node.js 中的内存溢出问题

    Node.js 是一个非常流行的服务器端 JavaScript 运行环境,但是在使用 Node.js 开发应用程序时,可能会遇到内存溢出的问题。本文将介绍如何识别和解决 Node.js 中的内存溢出问...

    5 个月前
  • Koa 中路由的处理方法及最佳实践

    Koa 是一个轻量级的 Node.js 框架,它的设计理念是尽可能简洁、高效地处理 HTTP 请求和响应。在 Koa 中,路由是一个非常重要的概念,它决定了如何将不同的请求分发到不同的处理函数中。

    5 个月前
  • 如何利用 Material Design 提高 Android 用户界面的质量

    什么是 Material Design Material Design 是 Google 推出的一种设计语言,旨在提供一种直观、自然、一致的用户体验。它强调视觉效果的层次感、实用性和可复用性,使得用户...

    5 个月前
  • 如何在 Mocha 测试中使用 Mockgoose 模拟 MongoDB

    在前端开发中,经常需要对数据库进行操作。为了保证代码的可靠性和稳定性,在开发过程中需要进行测试。而在测试中,我们需要对数据库进行模拟,以避免对实际数据库的影响。本文将介绍如何在 Mocha 测试中使用...

    5 个月前

相关推荐

    暂无文章