Kubernetes 上如何使用 Istio 进行应用间的服务发现和通信?

阅读时长 7 分钟读完

前言

Kubernetes 是目前最流行的容器编排系统之一,而 Istio 则是一款流行的服务网格框架。Istio 可以将 Kubernetes 上的应用程序连接起来,并提供许多有用的功能,例如负载均衡、流量管理、监控和追踪等。本文将介绍如何在 Kubernetes 上使用 Istio 进行应用间的服务发现和通信。

Istio 的基本概念

在开始介绍 Istio 如何在 Kubernetes 上使用之前,我们需要理解一些 Istio 的基本概念。

Sidecar

Sidecar 是一个代理容器,它与应用程序容器共存,并处理该容器与世界的所有通信。在 Kubernetes 中,Istio Sidecar 容器会附加到每个应用程序容器旁边,它拦截所有进出该容器的网络流量,并为应用程序容器提供服务网格所需的各种功能。

Service Mesh

Service Mesh 是一种基础设施层,它用于管理服务之间的通信。Istio 将所有应用程序容器的 Sidecar 连接成一个 Service Mesh,从而可以提供透明的服务通信和可观测性,例如服务发现、负载均衡、流量管理、监控和追踪等。

Envoy

Envoy 是 Istio 中使用的 Sidecar 的主要实现。Envoy 是一个开源的高性能代理服务器,用于处理进出应用程序容器的所有网络流量。Envoy 知道如何与 Kubernetes 以及其他 Envoy Sidecar 容器一起工作,以提供 Istio 所需的所有功能。

在 Kubernetes 上使用 Istio

安装 Istio

首先,我们需要安装 Istio。可以使用以下命令从 Istio 官方网站下载 Istio:

然后将 Istio 添加到 PATH 环境变量中:

接下来,要将 Istio 安装到 Kubernetes 集群中,可以使用以下命令:

默认情况下,Istio 会将 Sidecar 容器添加到所有命名空间中运行的所有容器中。您可以使用以下命令验证 Sidecar 容器是否已启动:

使用 Istio 进行服务发现和通信

在安装 Istio 后,您需要确保 Istio Sidecar 容器运行在应用程序容器旁边。为了让 Istio 自动注入 Sidecar 容器,我们可以通过以下命令启用 Istio 自动注入:

现在,每当您部署一个新的 Pod 到默认命名空间中时,Istio 将自动添加 Sidecar 容器。

然后,我们需要创建一个 Kubernetes 服务。Istio 可以使用该服务来发现您的应用程序容器。例如,以下 YAML 定义了一个名为 my-app 的 Deployment 和一个名为 my-service 的 Service:

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

请注意,Deployment 的 selector 与 Service 的 selector 匹配。这样 Istio 将能够查找与该服务关联的所有 Pod。

现在,我们可以部署该服务。Istio 可以使用 kubectl apply 命令将该 YAML 文件部署到 Kubernetes:

在部署应用程序时,您还需要定义一个 Istio 路由规则。以下 YAML 使用 Istio 路由所有在 my-service 服务上接收到的流量:

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

您可以使用以下命令将该 YAML 文件部署到 Kubernetes:

示例代码

下面是一个简单的 Node.js 应用程序示例,它监听 8080 端口并向客户端发送“Hello World!”消息。

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

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

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

使用以下 Dockerfile 构建和推送 Docker 镜像:

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

------- ----

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

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

---- - -

------ ----

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

最后,我们可以使用 kubectl apply 命令将 my-app.yaml 和 my-service.yaml 部署到 Kubernetes 集群中:

现在,您可以使用 kubectl port-forward 命令将本地端口转发到 Kubernetes Pod,从而测试服务是否可用:

转到 http://localhost:8080/,您应该会看到“Hello World!”消息。

总结

在本文中,我们介绍了如何在 Kubernetes 上使用 Istio 进行应用程序间的服务发现和通信。我们学习了 Istio 的一些基本概念,例如 Sidecar、Service Mesh 和 Envoy,然后展示了如何通过创建 Kubernetes 服务和 Istio 路由规则来使用 Istio。最后,我们提供了一个简单的 Node.js 应用程序示例,演示了如何将其部署到 Kubernetes 上,并使用 Istio 进行服务发现和通信。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6479aa3c968c7c53b05a4d30

纠错
反馈