我希望这里的每个人都做得很好。我正在尝试找到一种方法,在旋转pod的同时将条目添加到容器 /etc/hosts文件中。我只是想知道是否有任何选项/参数可以在我的“pod1. json”中提及,它可以在创建容器时将条目添加到容器 /etc/hosts。类似于“--add-hostnode1.example.com:${node1ip}”的东西,它与docker的目的相同,如下所示。
docker run \
--name mongo \
-v /home/core/mongo-files/data:/data/db \
-v /home/core/mongo-files:/opt/keyfile \
--hostname="node1.example.com" \
--add-host node1.example.com:${node1ip} \
--add-host node2.example.com:${node2ip} \
--add-host node3.example.com:${node3ip} \
-p 27017:27017 -d mongo:2.6.5 \
--smallfiles \
--keyFile /opt/keyfile/mongodb-keyfile \
--replSet "rs0"
非常感谢任何指点。谢谢你。
你好Aj
库伯内特斯使用IPpod模型。如果我理解正确的话,你想创建三个mongopod,并将三个pod的IP地址写入每个容器的/etc/host
中。直接修改/etc/host
文件可能不是一个好主意,原因有很多(例如,pod可能会死亡并被替换)。
对于kubernetes中的对等发现,您需要
(1)可以使用Headless Service实现。(2)要求您编写一个sidecar容器与您的mongo容器一起运行,执行(1)并配置您的应用程序。sidecar容器是高度特定于应用程序的,您可能想阅读一些关于为mongoDB执行此操作的相关堆栈溢出问题。
至于(1),您可以使用此service. yaml创建一个Headless Service,并将grousterIP设置为无。
spec:
clusterIP: None
然后,您可以创建一个复制控制器来创建所需数量的mongopod。例如,您可以使用mongo-控制. yaml,将gcePerstientDisk
替换为所需的本地磁盘卷类型(例如emptyDir
或hostPath
),并将副本编号更改为3。
每个mongopod将被自动分配一个IP地址,并用name=mongo
标记。无头服务使用标签选择器来查找pod。当从节点或容器中使用服务名称查询DNS时,它将返回mongopod的IP地址列表。
例如,
$ host mongo
mongo.default.svc.cluster.local has address 10.245.0.137
mongo.default.svc.cluster.local has address 10.245.3.80
mongo.default.svc.cluster.local has address 10.245.1.128
您可以获取您编写的sidecar容器中的地址并相应地配置特定于mongoDB的地址。
你实际上可以按照你最初期望的方式做到这一点。
感谢这个答案帮助我到达那里——https://stackoverflow.com/a/33888424/370364
您可以使用以下方法将主机插入容器的 /etc/hosts文件
command: ["/bin/sh","-c"]
args: ["echo '192.168.200.200 node1.example.com' >> /etc/hosts && commandX"]
如果您想在pod开始时动态设置ip,您可以从stdin创建一个pod并将其传递给sed以执行替换,然后再将其传递给kubectl。
所以豆荚会像下面这样
command: ["/bin/sh","-c"]
args: ["echo 'NODE_1_IP node1.example.com' >> /etc/hosts && commandX"]
然后用
cat pod1.yaml | sed -- "s|NODE_1_IP|${node1ip}|" | kubectl create -f -
我意识到这不是kubernetes打算实现这种事情的方式,但是我们使用它在本地启动一个测试pod,我们需要将它指向本地机器上的默认网络设备。创建一个服务只是为了满足测试pod似乎有些过分。所以我们这样做。