Kubernetes 什么是连接库伯内特内部各点的良好实践?
例如,我想运行我的NodeJS应用程序。我可以创建部署并通过服务公开它。 为了保持它运行,我需要部署MongoDB。它将创建自己的服务。 我可以给它起一个静态服务名,比如mongo.svc.cluster.local,并为Node.js应用程序硬编码。Kubernetes将负责DNS等 我不知道这是不是一个好的做法。但感觉不是这样 我正试着把我的心思放在标签上。我知道我可以用“component:mongo”来标记我的MongoDB服务,但我不知道如何使用它来发现MongoDB主机名并将其作为env var传递到我的应用程序中 有人能给我解释一下吗 您应该始终使这些主机名可配置;在Docker/Kubernetes世界中,通过环境变量最容易设置。考虑一下你描述的场景:Kubernetes 什么是连接库伯内特内部各点的良好实践?,kubernetes,Kubernetes,例如,我想运行我的NodeJS应用程序。我可以创建部署并通过服务公开它。 为了保持它运行,我需要部署MongoDB。它将创建自己的服务。 我可以给它起一个静态服务名,比如mongo.svc.cluster.local,并为Node.js应用程序硬编码。Kubernetes将负责DNS等 我不知道这是不是一个好的做法。但感觉不是这样 我正试着把我的心思放在标签上。我知道我可以用“component:mongo”来标记我的MongoDB服务,但我不知道如何使用它来发现MongoDB主机名并将其作为e
- 在进行纯本地开发时,您希望连接到桌面上的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名称或另一个。在更高级的级别上,这经常被吹捧为服务网格的一个特性,但采用它可能是一项重大投资。