我在 Rackspace 上有三个网络:
- 公共网络
- 服务网络
10.181.XXX.XXX
(他们有时称之为私有网络,但它本身并不是私有的,而是数据中心范围的私有网络,因此他们的租户可以共享它) 192.168.3.0/24
通过网络 UI 创建的真正的私有网络
我的计划是启动一个安全的 CoreOS 集群,其etcd
对等点和客户端仅限于真实的私有网络,因此外界无法访问。
因此,我启动了一个 CoreOS 服务器,它有三个界面:
eth0
拥有公网 IP 地址 - 好eth1
具有服务网络的 IP 地址 - 很好eth2
拥有私有网络的 IP 地址 - 太棒了!
一切看起来都很好,但etcd
绑定到服务网络,而不是我手动创建的私有网络。以下是cloud-config
:
#cloud-config
coreos:
etcd2:
discovery: https://discovery.etcd.io/XXX
advertise-client-urls: http://$private_ipv4:2379,http://$private_ipv4:4001
initial-advertise-peer-urls: http://$private_ipv4:2380
listen-client-urls: http://$private_ipv4:2379,http://$private_ipv4:4001
listen-peer-urls: http://$private_ipv4:2380
这意味着$private_ipv4
变量扩展为eth1
IP 地址,其内容如下/etc/environment
:
COREOS_PUBLIC_IPV4=166.78.XXX.XXX
COREOS_PRIVATE_IPV4=10.181.XXX.XXX
好的,看起来 Rackspace 注入了自己的网络,这是可以解释的。但这是否意味着 etcd 仅锁定在前两个网络,并且无法将其配置为使用真正的私有网络?
我尝试过很多类似的方法:
listen-peer-urls: http://`/usr/bin/ifconfig eth2 | /usr/bin/grep --word-regexp inet | /usr/bin/awk '{print $2}'`:2380
和其他,但都没有得到妥善执行,也没有被取代cloud-config
。
我的问题是:
- 我在 CoreOS 集群设置方面做了一些奇怪的事情,以至于我无法轻松自然地实现目标吗?如果是这样,您将如何布置一个
etcd
在真实的私有网络中运行的安全集群? - 有没有办法将动态值“注入”到
cloud-init
文件中,以便在运行时进行插值?问题是 IP 地址事先是未知的,所以我认为需要以某种方式获取并注入。
答案1
它们还提供了创建您自己的专用网络并将您的服务器连接到该网络的方法。如所解释的知识库文章 ID:2163。如果您这样做并删除了 servicenet 连接接口,那么这将不再是一个问题。但是,这样做的警告是,您将无法再使用与 servicenet 相关的服务。有关这方面的更多复杂性,请参阅他们的知识库文章 ID:2250。
或者,您可以配置防火墙,以便只有您使用/需要 servicenet 的服务才能访问您的服务器。您甚至可以通过云 vyatta 设备进入编排真正私有网络的世界,同时仍保留对 Rackspace 服务的访问权限,如中所述知识库文章 ID:3454。
所有这些文章都可以在以下位置找到:http://www.rackspace.com/knowledge_center/
最终,您必须权衡哪种选择最适合您。
高血压
答案2
问题解决了。Etcd2 现在在真正的私有网络(而不是 ServiceNet)上运行。方法如下 - 我创建了一个 systemd 插件,etcd2.service
它明确设置了环境配置,而ETCD_ADVERTISE_CLIENT_URLS=${URL}:2379
不是依赖于变量,例如$private_ipv4
和$public_ipv4
。
我为这项工作编写了一个快速工具 - 实现、示例和文档可以在这里找到。如果您有任何问题或建议,请留言!