微服务架构的出现,让我们可以将大型应用拆分成独立部署、可维护和扩展的小型微服务。随着微服务数量的增加,治理变得越来越复杂。为了应对这一挑战,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 版本来进行安装:
$ curl -L https://git.io/getLatestIstio | sh - $ cd istio-1.11.3 $ export PATH=$PWD/bin:$PATH $ istioctl install --set profile=demo
上面的命令将 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 中。
$ kubectl label namespace default istio-injection=enabled $ kubectl apply -f helloworld.yaml
首先,我们需要在 namespace 中启用 istio-injection=enabled
标签。这表明新创建的所有 pods 都将自动注入 Istio sidecar。
其次,应用 Kubernetes 服务清单(yaml)文件:
- 使用默认命名空间
- 启用 Istio sidecare 自动注入的标签
- 启用应用程序和服务
然后,通过使用以下命令来查看您的 Istio sidecar 是否已被注入:
$ kubectl get pods
测试 Istio
现在我们已经将 Istio sidecar 注入到 Helloworld Deployment 中,我们需要测试 Istio 是否成功加载,并控制 Kubernetes 群集中的流量。
首先,使用 kubectl apply
应用下面的虚拟服务配置文件(virtual-service.yaml):
-- -------------------- ---- ------- ----------- ---------------------------- ----- -------------- --------- ----- ---------- ----- ------ - ------------------------------------ ----- - ------ - ------------ ----- ---------- ----- ------- ----
该配置文件将 Helloworld 应用程序的所有流量定向到 8080 端口。要查看 Istio Sidecar 是否汇总了运行的 pod,请使用以下命令:
$ istioctl ps
最后,要查看哪些部署处理了请求,使用以下 Istio 命令:
$ istioctl proxy-status
监控与可视化
要将 Istio dashboard 用于监视 Kubernetes 上的微服务治理,您需要为其创建一个 NodePort。然后,您就可以在 Kubernetes 外部使用这个 NodePort 来访问 Istio。
$ kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.11/samples/addons/prometheus.yaml $ kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.11/samples/addons/grafana.yaml $ kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.11/samples/addons/kiali.yaml $ kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.11/samples/addons/jaeger.yaml $ kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.11/samples/addons/node-exporter.yaml $ kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.11/samples/addons/servicegraph.yaml
现在可以通过访问 Istio Gateway 了解 Istio 群集中的详细信息:
$ istioctl dashboard kiali
结论
在 Kubernetes 中使用 Service Mesh 实现微服务治理是保持技术创新的迈出的一步。本文介绍了 Service Mesh 的概念、技术组件、Kubernetes 环境下的部署和安装指南,以及如何使用 Istio 进行监视和可视化。
Service Mesh 在微服务和云原生架构中具有很大的前途和潜力,帮助团队更好地管理和扩展应用程序。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67176ecaad1e889fe2217ed7