写点什么

通过 Istio 重新实现微服务 (三):使用 Istio 代理运行应用

  • 2019-04-25
  • 本文字数:2838 字

    阅读完需:约 9 分钟

通过 Istio 重新实现微服务 (三):使用Istio代理运行应用

情感分析应用的架构

我们将会继续使用Kubernetes入门文章中的样例,它较为复杂,足以通过实践展示 Istio 的特性。


这个应用由四个微服务组成:


  • SA-Frontend 服务:前端的 Reactjs 应用;

  • SA-WebApp 服务:处理情感分析的请求;

  • SA-Logic 服务:执行情感分析;

  • SA-Feedback 服务:接收用户关于分析精确性的反馈。



图 6 情感分析的微服务


在图 6 中,除了服务之外,我们还看到了 Ingress Controller,在 Kubernetes 中,它会将传入的请求路由至对应的服务,Istio 采用了类似的概念,名为 Ingress Gateway,在本文后续的内容中,我们将会对其进行介绍。

使用 Istio 代理运行应用

如果要要跟着本文一起练习的话,读者可以 clone 该 GitHub 仓库 istio-mastery,其中包含了适用于 Kubernetes 和 Istio 的应用程序与 manifest。

Sidecar 注入

注入可以自动手动完成。如果要启用自动化的 Sidecar 注入,我们需要使用istio-injection=enabled来标记命名空间,这可以通过执行如下的命令来实现:


$ kubectl label namespace default istio-injection=enablednamespace/default labeled
复制代码


现在,默认命名空间中部署的所有 pod 都将会被注入 sidecar。切换至[istio-mastery]仓库的根目录,并执行如下的命令:


$ kubectl apply -f resource-manifests/kubepersistentvolumeclaim/sqlite-pvc created deployment.extensions/sa-feedback created service/sa-feedback created deployment.extensions/sa-frontend createdservice/sa-frontend created deployment.extensions/sa-logic created service/sa-logic created deployment.extensions/sa-web-app created service/sa-web-app created

复制代码


执行如下的命令并检查 Ready 列,我们会看到“2/2”,这表明第二个容器已经注入进来了。


$ kubectl get podsNAME                         READY STATUS   RESTARTS   AGE sa-feedback-55f5dc4d9c-c9wfv 2/2    Running  0         12m sa-frontend-558f8986-hhkj9   2/2    Running  0         12msa-logic-568498cb4d-s9ngt   2/2     Running  0         12m sa-web-app-599cf47c7c-s7cvd 2/2     Running  0         12m
复制代码


服务已经启动并运行了,每个容器都包含了 sidecar 代理,如图 7 所示。



图 7 某个 Pod 中的 Envoy 代理


但是,要访问服务,我们需要允许传入的流量进入集群,也就是所谓的 Ingress 流量。

Ingress 网关

允许流量进入集群的一个最佳实践就是使用 Istio 的 Ingress 网关,它处于集群的边缘并且靠近传入的流量,它能够实现 Istio 的多项特性,比如路由、安全和监控。


在 Istio 安装的时候,Ingress 网关组件以及将其暴露给外部的服务已经安装到了集群中,我们可以通过如下的命令获取它的外部 IP:


$ kubectl get svc -n istio-system -l istio=ingressgatewayNAME                   TYPE           CLUSTER-IP     EXTERNAL-IP    PORT(S)istio-ingressgateway   LoadBalancer   10.0.132.127   13.93.30.120   80:31380/TCP,443[...]
复制代码


在本文后续的内容中,我们将会通过该 IP(将其称为EXTERNAL-IP)访问应用程序,为了便利起见,我们通过下面的命令将其保存到变量中:


$ EXTERNAL_IP=$(kubectl get svc -n istio-system \      -l app=istio-ingressgateway \      -o jsonpath='{.items[0].status.loadBalancer.ingress[0].ip}')
复制代码


如果你在浏览器中访问该 IP 的话,将会看到服务不可用的错误,默认情况下,在我们定义网关之前,Istio 会阻止所有传入的流量。

网关资源

网关是一种 Kubernetes 自定义资源定义(Kubernetes Custom Resource Definition),它是我们在集群中安装 Istio 时所定义的,借助它,我们能够指定允许传入流量的端口、协议和主机。


在我们的场景中,我们想要为所有主机开放 80 端口。我们可以通过如下的定义来进行配置:


apiVersion: networking.istio.io/v1alpha3kind: Gatewaymetadata:  name: http-gatewayspec:  selector:    istio: ingressgateway  servers:  - port:      number: 80      name: http      protocol: HTTP  hosts:   - "*"
复制代码


除了istio: ingressgateway选择器之外,所有配置项的含义均不言自明。通过使用这个选择器,我们可以指定哪个 Ingress 网关使用该配置,在我们的场景中,也就是在 Istio 安装时的默认 Ingress 网关控制器。


通过执行如下的命令,应用该配置:


$ kubectl apply -f resource-manifests/istio/http-gateway.yamlgateway.networking.istio.io "http-gateway" created
复制代码


网关允许我们访问 80 端口,但是它还不知道要将请求路由至何处,而这一功能是通过 Virtual Service 来实现的。

VirtualService 资源

VirtualService 能够指导 Ingress 网关如何路由允许进入集群的请求。


对于我们的应用来说,通过 http-gateway 的请求必须要路由至 sa-frontendsa-web-app sa-feedback 服务(如图 8 所示)。



图 8 通过 VirtualService 配置路由


现在,我们拆分一下应该路由至 SA-Frontend 的请求:


  • 精确的路径“/”应该路由至 SA-Frontend 以便于获取 Index.html;

  • 带有“/static/*”前缀的路径应该路由至 SA-Frontend,以便于获取前端所需的静态文件,比如级联样式表和 JavaScript 文件;

  • 匹配正则表达式“^.*\.(ico|png|jpg)$”的路径应该路由至 SA-Frontend,因为它代表的是页面展现所需的图片。


这样,我们就会得到如下的配置:


kind: VirtualService metadata:  name: sa-external-services spec:  hosts:  - "*"  gateways:  - http-gateway      # 1  http:  - match:    - uri:        exact: /    - uri:        exact: /callback    - uri:        prefix: /static    - uri:    regex: '^.*\.(ico|png|jpg)$'   route:  - destination:      host: sa-frontend    # 2      port:      number: 80
复制代码


这里的重点在于:


  1. VirtualService 将会应用于通过 http-gateway 的请求;

  2. destination 定义了请求要路由至哪个服务。


注意:上面的配置在sa-virtualservice-external.yaml文件中,它还包含了路由至 SA-WebApp 和 SA-Feedback 的配置,但是简洁期间,我们将其省略了。


通过执行如下的命令,应用 VirtualService:


$ kubectl apply -f resource-manifests/istio/sa-virtualservice-external.yamlvirtualservice.networking.istio.io "sa-external-services" created
复制代码


注意:当我们应用该资源时(其实所有的 Istio 资源均如此),Kubernetes API Server 会创建一个新的事件,该事件会被 Istio 的控制平面接收到,然后会将新的配置应用到每个 pod 的 envoy 代理上。Ingress Gateway 控制器是 Control Plane 配置的另外一个 Envoy,如图 9 所示。



图 9 配置 Istio-IngressGateway 来路由请求


现在,我们可以通过http://{{EXTERNAL-IP}}/访问情感分析应用了。如果你遇到 Not Found 状态的话,请不要担心,有时候配置生效并更新 envoy 缓存会耗费一点时间。


在转入下一部分之前,你需要使用该应用生成一些流量。




系列回顾


通过 Istio 重新实现微服务 (一):认识 Istio


通过 Istio 重新实现微服务 (二):Istio 实践


2019-04-25 16:247887

评论

发布
暂无评论
发现更多内容

可视化数据分析工具是什么?可以用来做什么?

巷子

作为网络报表分析工具的Quick BI,其功能如何

夜雨微澜

【NodeJS】GLIBC_2.28 not found CentOS7不兼容Node高版本

ReturnTmp

node.js centos

UE虚幻引擎游戏开发:游戏鼠标双击判定方法!

3DCAT实时渲染

UE虚幻引擎 UE教程 3D游戏制作教程

实现分布式事务:Java与MySQL的XA事务协调

树上有只程序猿

Java MySQL 数据库 分布式 XA

openGauss数据库源码解析系列文章——安全管理源码解析(三)

daydayup

新利好带动 POSE 持续上扬,月内几近翻倍

BlockChain先知

以商业大数据技术助力数据合规流通体系建立,合合信息参编《数据经纪从业人员评价规范

合合技术团队

人工智能 大数据 商业化

【我和openGauss的故事】在Kylin桌面版操作系统中配置openGauss的ODBC数据源

daydayup

openGauss-graph 0.2.0版本正式上线

daydayup

腾讯云大数据ES:结合AI大模型与向量检索的新一代云端检索分析引擎

腾讯云大数据

ES

面部表情识别技术在安全领域的应用

来自四九城儿

【我和openGauss的故事】一文帮你理解openGauss的高可用方案

daydayup

ToolLLM:能够使用 16000 种真实 API 的 LLM

Zilliz

AIGC Towhee LLM

2023-08-10:景区里有m个项目,也就是项目数组为int[][] game,这是一个m*2的二维数组 景区的第i个项目有如下两个参数: game[i] = { Ki, Bi } Ki一定是负数,

福大大架构师每日一题

左程云 福大大架构师每日一题

openGauss数据库源码解析系列文章——安全管理源码解析(四)

daydayup

go-zero 是如何实现令牌桶限流的?

AlwaysBeta

Go 源码 微服务 go-zero 限流器

面部表情识别技术的挑战与解决方案

来自四九城儿

从推动到拉动:研发效能提升的第一性原理

CODING DevOps

通义千问开源模型部署使用

WizInfo

通义千问

ARTS 打卡第 1 周 鸿蒙入门开发教程:一文带你详解工具箱元服务的开发流程

坚果

ARTS 打卡计划 HarmonyOS OpenHarmony 元服务 ArkTS

【我和openGauss的故事】Navicat连接openGauss_5.0.0 企业版数据库

daydayup

【我和openGauss的故事】openGauss 主备架构及同步复制模式理论学习与验证测试

daydayup

javascript之webAPIs(1)

timerring

JavaScript

中国信通院高质量数字化转型产品及服务全景图发布,合合信息多项AI产品入选

合合技术团队

人工智能 数字化转型

【我和openGauss的故事】原生openGauss与Oracle数据库函数兼容性对比验证测试

daydayup

【我和openGauss的故事】openGauss5.0特性:CM支持VIP仲裁特性

daydayup

面部表情识别在医疗领域的应用

来自四九城儿

AIGC 浪潮下,鹅厂新一代前端人的真实工作感受

CODING DevOps

【我和openGauss的故事】openGauss5.0在某省医保局实时数仓应用

daydayup

怎么快速更新Python的第三方库?教你一招,小白也能学会

程序员晚枫

Python 编程 计算机 第三方库

通过 Istio 重新实现微服务 (三):使用Istio代理运行应用_云原生_Rinor Maloku_InfoQ精选文章