基于Kubernetes的微服务可观测性与Istio服务网格

本文介绍了如何在GCP的GKE集群上部署Istio 1.1.0服务网格,并实现微服务的可观测性。过程中涉及创建MongoDB Atlas和CloudAMQP集群,配置DNS记录,部署Go微服务与Angular UI。然而,遇到的问题包括DNS解析错误、Istio VirtualService配置不正确,以及Go微服务无法访问外部数据库。解决方案可能涉及检查Kubernetes Secret资源和ServiceEntry的主机信息。此外,提供了相关代码和脚本资源链接以供参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

640?wx_fmt=jpeg

本系列文章将分为两部分,在此我们将探讨Istio服务网格中一部分,即可观测性工具集。这些工具包含了Jaeger、Kiali、Prometheus以及Grafana。为辅助我们此行探索,我们将在GCP上部署基于Go的微服务参考平台到GKE上去。
640?wx_fmt=png



什么是可观测性

640?wx_fmt=png


与区块链、无服务器、AI和机器学习、聊天机器人、网络安全和服务网格类似,可观测性现在是IT行业中的一大热门话题。根据维基百科记录,可观测性指的是如何从外部输出来推断衡量系统内部状态。日志、指标和跟踪通常被成为可观测性的三大核心支柱。这些是我们可观察到的系统的外部输出。
由Cindy Sridharan撰写,O’Reilly出版的《分布式系统可观测性[1]》一书在第四章节中详细地介绍了“可观测性的三大支柱”。在继续下文之前,我强烈建议你阅读下这篇在线摘录。关于可观测性资讯的另一大来源是honeycomb.io,一个生产系统可观测性工具的开发商,由知名的行业思想领袖Charity Majors领导。这个站点上面发布了很多关于可观测性的文章、博文、白皮书和博客。
随着现代分布式系统变得越发复杂,想具备观察这些系统的能力需要同样在设计之初就考虑到适配如此复杂环境的现代化的工具。传统的日志记录和监控系统通常与当今的混合和多云、基于多种语言、事件驱动、基于容器和无服务器、可无限扩展的、临时计算的平台相竞争。
像Istio服务网格这类工具试图通过提供与几种同类最佳的开源遥测工具的原生集成方案来解决可观测性带来的挑战。Istio的集成包括Jaeger用于分布式跟踪,Kiali用于分布式系统可视化,Prometheus和Grafana用于度量指标收集、监控和警报。同时结合云平台原生的监控和日志服务,例如谷歌云平台上Google Kubernetes Engine(GKE)的Stackdriver,我们为现代化的分布式应用打造完整的可观测平台。


一个供参考的微服务平台

640?wx_fmt=png


为了演示与最新版本的Istio服务网格集成的可观测性工具,我们将部署一个具备参考意义的,使用Go编写的微服务平台到GKE上面去。我开发了相关参考服务平台来演示涉及到的概念,例如API管理、服务网格、可观测性、DevOps和混沌工程等。该平台由14个组件组成,包含了8个基于Go的微服务,以服务A-H来标记,一个Augular 7,基于TypeScript的前端,4个MongoDB数据库实例,一个RabbitMQ队列用于基于事件队列的通信。该平台以及所有代码都已开源。
该参考平台旨在生成基于HTTP的服务到服务,基于TCP的服务到数据库以及基于TCP的服务到队列再到服务(RabbitMQ)的IPC(进程间通信)。服务A调用服务B和C,服务B调用服务D和E,服务D生产消息到RabbitMQ队列供服务F来消费并写入到MongoDB,依此类推。当这个系统部署到运行Istio服务网格的Kubernetes集群中时,可以使用Istio的可观测性工具来观察这些分布式通信。
服务响应
在该平台上,每个上游服务通过返回一个小的JSON信息负载(在源码中称为问候语)来响应下游服务的请求。
640?wx_fmt=png
这些请求响应在调用链中聚合,进而产生给边缘服务的一系列服务响应,并返回给UI界面,最终展示在用户的浏览器中。响应聚合功能只是简单验证服务到服务间通信,Istio组件和遥测工具都能否正常工作。
640?wx_fmt=png
所有的Go微服务都包含一个/ping和/health端点。/health端点用于配置Kubernetes的存活以及就绪探针。此外,边缘服务A使用响应头access-control-allow-origin: *用来配置Cross-Origin Resource Sharing(CORS)[2]。CORS允许用于浏览器来调用位于与UI不同子域的/ping端点。相关服务A的源码可以在此[3]查看。
在本次演示中,MongoDB数据库将被托管到GCP的外部,即MongoDB Atlas,它是一个基于云的MongoDB即服务平台。同样的,RabbitMQ队列服务将被托管到CloudAMQP,这是一个基于云的RabbitMQ即服务平台。我曾在之前的几篇文章中使用过这两种Saas供应商。使用外部服务将帮助我们了解Istio和它的可观测性工具是如何为位于Kubernetes集群中和外部系统的通信提供遥测的。 (如果你想深入快速学习Kubernetes, 可以报名参加我们组织的为期3天的Kubernetes实战培训 ,一线资深讲师带你从0开始上手Kubernetes。)
服务F[4]消费来自RabbitMQ队列的消息,服务D将消息写入队列并写入到MongoDB中,这些服务都能通过对应链接打开直接查看源码。


源码

640?wx_fmt=png


所有本文涉及到的源码都可以在GitHub的两个项目中找到。基于Go的微服务的源码,所有的Kubernetes资源和部署脚本都位于k8s-istio-observe-backend[5]这个项目仓库中。Angular UI前端项目源码位于k8s-istio-observe-frontend[6]中。此次演示中你将不需要下载前端项目。
 
 
  1. git clone --branch master --single-branch --depth 1 --no-tags \

  2. https://github.com/garystafford/k8s-istio-observe-backend.git


Kubernetes资源中引用到的相关Go服务和UI界面的容器镜像,都可以在Docker Hub上找到。Go服务镜像是使用官方的Golang Alpine来作为基础镜像,包含了Go 1.12.0版本。使用Alpine镜像来编译源码将能保证容器镜像尽可能地小并且包含更小的可攻击面。
系统要求

640?wx_fmt=png


文章接下来的部分,你需要将最新版本的gcloud的客户端工具(最小版本要求为239.0.0)、Helm和刚刚发布的Istio 1.1.0版本安装并配置在你的本地或者是构建机器上。
640?wx_fmt=png


配置和安装

640?wx_fmt=png


为了将该微服务平台部署到GKE,我们将按以下步骤进行:
  1. 创建MongoDB Atlas数据库集群

  2. 创建CloudAMQP RabbitMQ集群

  3. 根据自己的环境调整Kubernetes的资源文件和脚本

  4. 在GCP上创建GKE集群

  5. 使用Helm在GKE集群中部署Istio 1.1.0版本

  6. 为平台中需要暴露访问的资源创建DNS记录

  7. 部署所有Go微服务,Angular UI和与GKE相关联的资源

  8. 测试或为你的平台排障

  9. 在第二篇中查看观察的结果


MongoDB Atlas集群

640?wx_fmt=png


MongoDB Atlas是一个完全托管的MongoDB即服务,可在AWS、Azure和GCP上使用。Atlas是一款成熟的SaaS产品,提供高可用性,有保证的正常运行时间SLA,弹性可扩展性,跨区域复制,企业级安全性,LDAP集成,BI连接器等等。
MongoDB Atlas目前提供有四种定价方案,包含免费版、基础版、高级版和企业版。这些方案范围从最小的共享内存和512MB存储的M0规模的MongoDB集群,到最高具有488GB内存和3TB存储的大型M400 MongoDB集群。
在本文中,我在GCP的us-central1地区创建了一个M2大小的MongoDB集群,并为该演示创建了一个数据库账户,该帐户将用于连接GKE上运行的八个基于Go的微服务的其中四个。
640?wx_fmt=png
最初我使用了一个M0大小的集群,但发现计算资源不足以支撑来自这些Go语言的微服务。在此我建议至少使用M2大小乃至更大的集群。


CloudAMQP RabbitMQ集群

640?wx_fmt=png


CloudAMQP在所有主流云供应商和应用程序平台上提供完全托管的RabbitMQ集群。RabbitMQ将支持一部分基于Go的微服务的解耦,最终一致的基于消息的架构。在本文中,我同样在GCP的us-central1区域创建了一个RabbitMQ集群,与我们的GKE集群和MongoDB Atlas集群相同,我选择了一个最低配置的RabbitMQ免费版本。CloudAMQP还提供强大的多节点RabbitMQ集群以供生产级别环境使用。


修改配置

640?wx_fmt=png


在GitHub项目中的Kubernetes资源文件和Bash部署脚本中你需要对应调整部分配置设置。
配置MongoDB Atlas的Istio ServiceEntry
在external-mesh-mongodb-atlas.yaml文件中添加MongoDB Atlas主机地址。此文件允许从GKE上的四个微服务到外部MongoDB Atlas集群的出口流量。
 
 
  1. apiVersion: networking.istio.io/v1alpha3

  2. kind: ServiceEntry

  3. metadata:

  4. name: mongodb-atlas-external-mesh

  5. spec:

  6. hosts:

  7. - { { your_host_goes_here }}

  8. ports<

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值