我希望这里的每个人都做得很好。我正在尝试找到一种方法来在启动pod时向容器/ etc / hosts文件添加条目。我只是想知道我的“pod1.json”中是否有任何选项/参数可以在创建时将条目添加到容器/ etc / hosts中。像“--add-host node1.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
答案 0 :(得分:1)
Kubernetes使用IP-per-pod model。如果我理解正确,您需要创建三个mongo pod,并在每个容器的/etc/hosts
中写入三个pod的IP地址。直接修改/etc/host
文件可能不是一个好主意,原因很多(例如,pod可能会死掉并被替换)。
对于kubernetes中的对等发现,您需要
(1)。 (2)要求你写一个边车容器与你的mongo容器一起运行,执行(1),并配置你的应用程序。 sidecar容器是高度特定于应用程序的,您可能想要阅读一些关于为mongodb执行此操作的related stackoverflow questions。
对于(1),您可以使用此Headless Service创建service.yaml,并将clusterIP设置为无。
spec:
clusterIP: None
然后,您可以创建一个复制控制器,用于创建所需数量的mongo pod。例如,您可以使用mongo-controller.yaml,将gcePersistentDisk
替换为所需的本地磁盘卷类型(例如emptyDir
或hostPath
),并将副本号更改为3。 / p>
每个mongo pod都会自动分配一个IP地址,并标有name=mongo
。无头服务使用标签选择器来查找窗格。当使用来自节点或容器的服务名称查询DNS时,它将返回mongo pod的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特定的。
答案 1 :(得分:1)
您实际上可以按照最初期望的方式执行此操作。
感谢这个帮助我实现目标的答案 - https://stackoverflow.com/a/33888424/370364
您可以使用以下方法将主机推送到容器&etc / hosts / hosts文件中
command: ["/bin/sh","-c"]
args: ["echo '192.168.200.200 node1.example.com' >> /etc/hosts && commandX"]
如果你想在pod开始时动态设置ip,你可以从stdin创建一个pod并通过sed传递它以执行替换,然后再将其传递给kubectl。
所以pod yaml看起来像下面的
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似乎有点矫枉过正。所以我们这样做。