Kubernetes 什么是连接库伯内特内部各点的良好实践?

Kubernetes 什么是连接库伯内特内部各点的良好实践?,kubernetes,Kubernetes,例如,我想运行我的NodeJS应用程序。我可以创建部署并通过服务公开它。 为了保持它运行,我需要部署MongoDB。它将创建自己的服务。 我可以给它起一个静态服务名,比如mongo.svc.cluster.local,并为Node.js应用程序硬编码。Kubernetes将负责DNS等 我不知道这是不是一个好的做法。但感觉不是这样 我正试着把我的心思放在标签上。我知道我可以用“component:mongo”来标记我的MongoDB服务,但我不知道如何使用它来发现MongoDB主机名并将其作为e

例如,我想运行我的NodeJS应用程序。我可以创建部署并通过服务公开它。 为了保持它运行,我需要部署MongoDB。它将创建自己的服务。 我可以给它起一个静态服务名,比如mongo.svc.cluster.local,并为Node.js应用程序硬编码。Kubernetes将负责DNS等

我不知道这是不是一个好的做法。但感觉不是这样

我正试着把我的心思放在标签上。我知道我可以用“component:mongo”来标记我的MongoDB服务,但我不知道如何使用它来发现MongoDB主机名并将其作为env var传递到我的应用程序中

有人能给我解释一下吗

您应该始终使这些主机名可配置;在Docker/Kubernetes世界中,通过环境变量最容易设置。考虑一下你描述的场景:

  • 在进行纯本地开发时,您希望连接到桌面上的MongoDB,它可能是
    localhost:27017
  • 您可以使用Docker Compose对Docker容器进行基本的集成测试,主机名将是非限定的
    mongodb:27017
  • 在Kubernetes环境中,您可以使用FQDN
    mongodb.default.svc.cluster.local:27017
    ,尤其是如果您认为数据库可能位于不同的命名空间中
  • 在Docker或Kubernetes之外运行数据库有一些很好的参数,在这种情况下,您需要提供一些其他主机名
几乎每种语言都提供了一些访问环境变量的方法(节点的
process.env
、Python的
os.environ
、Ruby的
env
、…),因此您可以使用一些有意义的默认值来查找这些变量

const mongoHost=process.env.MONGO_HOST | |'localhost:27017';
在Kubernetes部署规范中,可以显式地将其设置为环境变量

- name: MONGO_HOST
  value: 'mongodb.default.svc.cluster.local:27017'
我不担心让应用程序动态地尝试查找数据库;只需将其位置作为配置传递。(您不需要考虑标签,除非告诉服务要提供什么。)

您应该始终使这些主机名可配置;在Docker/Kubernetes世界中,通过环境变量最容易设置。考虑一下你描述的场景:

  • 在进行纯本地开发时,您希望连接到桌面上的MongoDB,它可能是
    localhost:27017
  • 您可以使用Docker Compose对Docker容器进行基本的集成测试,主机名将是非限定的
    mongodb:27017
  • 在Kubernetes环境中,您可以使用FQDN
    mongodb.default.svc.cluster.local:27017
    ,尤其是如果您认为数据库可能位于不同的命名空间中
  • 在Docker或Kubernetes之外运行数据库有一些很好的参数,在这种情况下,您需要提供一些其他主机名
几乎每种语言都提供了一些访问环境变量的方法(节点的
process.env
、Python的
os.environ
、Ruby的
env
、…),因此您可以使用一些有意义的默认值来查找这些变量

const mongoHost=process.env.MONGO_HOST | |'localhost:27017';
在Kubernetes部署规范中,可以显式地将其设置为环境变量

- name: MONGO_HOST
  value: 'mongodb.default.svc.cluster.local:27017'

我不担心让应用程序动态地尝试查找数据库;只需将其位置作为配置传递。(你不需要考虑标签,除非服务人员告诉服务内容。)

谢谢你,David。我知道环境变量,并且一直在使用它们。我主要关心的是服务发现,而不是MongoDB,我只是以它为例。假设我有应用程序和AuthServiceV1,它将被替换为AuthServiceV2。假设我想逐步淘汰AuthServiceV1并使用v2。我如何设计整个系统,使其在不停机的情况下顺利进行更改。想想飞行控制器这样的关键任务系统,是两个版本都有一个服务,还是每个版本都有一个服务,这是一种设计选择;一种非常简单的方法是将这两个版本作为完全独立的东西,并使用环境变量指向一个版本的服务的DNS名称或另一个。在更高级的级别上,这经常被吹捧为服务网格的一项功能,但采用这项功能可能是一项重大投资。谢谢你,David。我知道环境变量,并且一直在使用它们。我主要关心的是服务发现,而不是MongoDB,我只是以它为例。假设我有应用程序和AuthServiceV1,它将被替换为AuthServiceV2。假设我想逐步淘汰AuthServiceV1并使用v2。我如何设计整个系统,使其在不停机的情况下顺利进行更改。想想飞行控制器这样的关键任务系统,是两个版本都有一个服务,还是每个版本都有一个服务,这是一种设计选择;一种非常简单的方法是将这两个版本作为完全独立的东西,并使用环境变量指向一个版本的服务的DNS名称或另一个。在更高级的级别上,这经常被吹捧为服务网格的一个特性,但采用它可能是一项重大投资。