向containers / etc // hosts添加条目使用pod1.yaml或pod1.json启动pod时

时间:2015-11-17 03:55:24

标签: docker kubernetes

我希望这里的每个人都做得很好。我正在尝试找到一种方法来在启动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

2 个答案:

答案 0 :(得分:1)

Kubernetes使用IP-per-pod model。如果我理解正确,您需要创建三个mongo pod,并在每个容器的/etc/hosts中写入三个pod的IP地址。直接修改/etc/host文件可能不是一个好主意,原因很多(例如,pod可能会死掉并被替换)。

对于kubernetes中的对等发现,您需要

  1. 找出同行的IP地址。
  2. 使用地址更新您的申请。
  3. 使用Headless Service可以实现

    (1)。 (2)要求你写一个边车容器与你的mongo容器一起运行,执行(1),并配置你的应用程序。 sidecar容器是高度特定于应用程序的,您可能想要阅读一些关于为mongodb执行此操作的related stackoverflow questions

    对于(1),您可以使用此Headless Service创建service.yaml,并将clusterIP设置为无。

    spec:
      clusterIP: None
    

    然后,您可以创建一个复制控制器,用于创建所需数量的mongo pod。例如,您可以使用mongo-controller.yaml,将gcePersistentDisk替换为所需的本地磁盘卷类型(例如emptyDirhostPath),并将副本号更改为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似乎有点矫枉过正。所以我们这样做。