我在 VMware ESXi 上部署了几个 coreos 实例。etcd 似乎对 IP 地址非常挑剔,尤其是当它们发生变化时。
我希望能够通过 cloud-config 以一种不会混淆 etcd 集群的方式定义静态 IP 地址。看起来在 coreos booup 期间需要发生的事情是它需要在启动 etcd 之前首先使用静态 IP 地址启动接口。我试图用我的 user_data 文件的这一部分来做到这一点:
write_files:
- path: /etc/systemd/network/static.network
permissions: 0644
content: |
[Match]
Name=ens192
[Network]
Address=192.168.1.58/24
Gateway=192.168.1.1
DNS=192.168.1.42
发生的情况是 coreos-cloudinit 进程会在引导期间将此文件写入文件系统,但前提是它首先使用 DHCP 启动网络接口。然后 etcd 将启动,但会因为 user_data addr 和 peer-addr 设置与 DHCP 不匹配而感到困惑。如果我在系统首次启动后手动重新启动系统,它将开始使用之前在 static.network 文件中记录的静态 IP 地址。是否可以避免第二次重新启动,即在定义 static.network 后启动网络?
似乎根本问题可能只是 vmware 提供程序不理解其他提供程序(例如 vagrant)使用的 $public_ip4 构造:
etcd:
# generate a new token for each unique cluster from https://discovery.etcd.io/new
# WARNING: replace each time you 'vagrant destroy'
discovery: https://discovery.etcd.io/####
addr: $public_ipv4:4001
peer-addr: $public_ipv4:7001
据我所知,使用 vagrant/virtualbox 时不存在此问题。