连接Kubernetes中各个点的良好实践是什么?

时间:2019-06-21 17:53:45

标签: kubernetes

例如,我想运行我的node js应用程序。我可以创建Deployment并通过Service公开它。 为了使其保持运行,我需要部署MongoDB。它将创建自己的服务。 我可以给它提供静态服务名称,例如mongo.svc.cluster.local,并为Node.js应用程序对其进行硬编码。 Kubernetes将负责DNS等。

我不知道这是否是一个好习惯。但这不是那样。

我正在设法将标签围绕在标签上。我知道我可以将MongoDB服务标记为“ component:mongo”,但是我无法理解如何使用它来发现MongoDB主机名并将其作为env var传递到我的应用程序中。

有人可以向我解释吗?

1 个答案:

答案 0 :(得分:2)

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

  • 纯粹在进行本地开发时,您想连接到桌面上的MongoDB,该桌面可能是highest_turnout = data[0] for county in data: if (county.voters/county.population) > (highest_turnout.voters/highest_turnout.population): highest_turnout = county
  • 您可以使用Docker Compose对Docker容器进行基本的集成测试,并且主机名将为不合格的const mongoose = require("mongoose"); mongoose.set('useFindAndModify', false); //was set due to DeprecationWarning: Mongoose: `findOneAndUpdate()` and `findOneAndDelete()` without the `useFindAndModify` app.post("/delete", function(req, res){ let checkedItem = req.body.deleteItem; if (!mongoose.Types.ObjectId.isValid(checkedItem)) { checkedItem = checkedItem.replace(/\s/g, ''); } Item.findByIdAndRemove(checkedItem, function(err) { if (!err) { console.log("Successfully Deleted " + checkedItem); res.redirect("/"); } }); });
  • 在Kubernetes环境中,您可能希望使用FQDN localhost:27017,尤其是如果您认为数据库可能位于不同的命名空间中。
  • 有很好的论据可以在Docker或Kubernetes之外运行数据库,在这种情况下,您需要提供其他主机名。

几乎每种语言都提供了某种访问环境变量的方法(Node的mongodb:27017,Python的mongodb.default.svc.cluster.local:27017,Ruby的process.env等),因此您可以使用一些默认值进行查找很有道理。

os.environ

在Kubernetes部署规范中,您可以将其明确设置为环境变量。

ENV

我不会担心让应用程序动态地尝试查找数据库。只需传递其位置作为配置即可。 (您不必考虑标签,除非告知服务的内容。)