【问题标题】:Microservice structure using helm and kubernetes使用 helm 和 kubernetes 的微服务结构
【发布时间】:2020-06-21 01:06:30
【问题描述】:

我们有几个需要相互通信的微服务(基于 NodeJS 的应用程序),其中两个使用 Redis 和 PostgreSQL。以下是我的微服务的名称。他们每个人都有自己的 SCM 存储库,Helm Chart.Helm 版本是 3.0.1。我们有两个环境,每个环境有两个 values.yaml。每个集群也有三个节点。

首先,在最终用户操作之后,UI 服务触发而不是转到后端。根据最终用户的请求,后端服务需要与 Market、Auth 和 API 等任何服务进行通信。某些情况下 API 和 Market 微服务也需要与 Auth 微服务进行通信。

  1. 用户界面 -->
  2. 后端
  3. 市场 --> 使用 postgreSQL
  4. Auth --> 使用 Redis
  5. API

所以我的问题是,

  • 在微服务之间进行通信时我们应该注意什么? my-svc-namespace.svc.cluster.local 是否足以提供给开发人员,还是我们应该在每个 pod 中也指定 ENV?

  • 我们的微服务是 NodeJS 应用程序。开发商如何。将在应用程序源代码中处理这个?如果第一个问题的答案是肯定的,他们是否使用此服务名称?

  • 我们想使用每个环境的主机通过入口公开我们的应用程序吗?我猜应该只为 UI 微服务启用入口,对吗?

  • 测试每个服务是否可以相互通信的最佳方法是什么?


kubectl get svc --all-namespaces

NAMESPACE     NAME                                         TYPE            

database      my-postgres-postgresql-helm                  ClusterIP                      
dev           my-ui-dev                                    ClusterIP 
dev           my-backend-dev                               ClusterIP 
dev           my-auth-dev                                  ClusterIP                 
dev           my-api-dev                                   ClusterIP 
dev           my-market-dev                                ClusterIP
dev           redis-master                                 ClusterIP                       
ingress       ingress-traefik                              NodePort            

【问题讨论】:

    标签: kubernetes kubernetes-helm


    【解决方案1】:

    在 K8S 中执行服务发现的两种方式

    在 Kubernetes 集群中执行通信(服务发现)有两种方式。

    DNS 是在集群内实现服务发现的最简单方法。 而且它不需要为每个 pod 设置任何额外的 ENV 变量。 作为最简单的方法,同一命名空间内的服务可以通过其服务名称访问。例如,http://my-api-dev:PORT 可被命名空间内的所有 pod 访问,dev

    标准应用名称和 K8s 服务名称

    作为一种做法,您可以为每个应用程序指定一个标准名称,例如。 my-uimy-backendmy-api等,并使用相同的名称连接到应用程序。 这种做法甚至可以在开发人员环境中进行本地测试,在 /etc/host 中输入为

    127.0.0.1 my-ui my-backend my-api
    

    (以上与k8s无关,只是应用程序在本地环境中与其名称进行通信的一种实践)

    此外,在 k8s 上,您可以将服务名称分配为相同的应用程序名称(尽量避免,服务名称后缀如 -dev,反映环境(开发、测试、产品等),而不是使用命名空间或单独的集群)。因此,目标应用程序端点可以在每个应用程序的配置文件中配置其服务名称。

    Ingress 用于具有外部访问权限的服务

    只应为需要外部访问的服务启用入口。

    自定义健康检查端点

    此外,进行一些自定义运行状况检查以验证所有依赖的应用程序运行正常,这也将验证应用程序的通信是否正常运行,这是一个很好的做法。

    【讨论】:

    • 感谢您的详细回复。实际上我还认为使用服务要容易得多。所以根据我的理解,就像我的问题一样,除了数据库之外的所有服务都在同一个命名空间中。因此,我可以提供开发者在my-ui-dev等应用程序中使用和访问。我对吗?我的服务端口每个都是 80。
    • 是的,这是一种常见的做法。您可以从服务名称中删除后缀 -dev。因此,您在所有环境(dev、test、prod 等)上都有相同的服务名称。您可以使用命名空间或单独的集群来表示环境。
    猜你喜欢
    • 1970-01-01
    • 2019-03-23
    • 2021-12-09
    • 2019-03-10
    • 1970-01-01
    • 2019-02-20
    • 1970-01-01
    • 2022-01-13
    • 2017-12-26
    相关资源
    最近更新 更多