Google Compute Engine自定义dns/hostname
一、 网卡重启会导致配置被覆盖
Google Cloud的Compute Engine Instance的IP地址是通过DHCP获得的。同时,nameserver和VM的hostname也通过DHCP推送给了VM,下图是系统日志中查到的VM通过DHCP获得的相关信息:
所以如果客户自定义了DNS服务器地址,或重新定义了和Instance不同的hostname,这些信息在机器重启或者网卡重启后,都会被覆盖掉。
比如在CentOS6.9下,修改resolv.conf文件:
echo "nameserver 8.8.8.8" > /etc/resolv.conf
查看文件:
cat /etc/resolv.conf nameserver 8.8.8.8
重新启动网卡:
再查看resolv.conf文件,发现已经改回169.254的link local地址了。
二、解决方案
通过在VM Instance的Metadata上添加key value的方式,把dns和hostname信息传递进VM,通过脚本的方式可以实现每次重启或reset网络的情况下,重新设置dns服务器地址和hostname信息。
具体做法如下:
1 设置VM的Metadata信息:
编辑VM属性:
这里添加了两个dns服务器地址和hostname信息。
也可以用gcloud命令行添加:
gcloud compute instances add-metadata centos6-1 --zone asia-east1-b --metadata dns1=8.8.8.8 gcloud compute instances add-metadata centos6-1 --zone asia-east1-b --metadata dns2=114.114.114.114 gcloud compute instances add-metadata centos6-1 --zone asia-east1-b --metadata hostname=hwvm01
2 在VM内部修改ifup-post文件
在CentOS中,ifup-post文件是网卡启动后执行的脚本。在这个脚本中添加下面的内容:
cd /etc/sysconfig/network-scripts/ vim ifup-post dns1=`curl --silent http://metadata.google.internal/computeMetadata/v1beta1/instance/attributes/dns1` dns2=`curl --silent http://metadata.google.internal/computeMetadata/v1beta1/instance/attributes/dns2` hn=`curl --silent http://metadata.google.internal/computeMetadata/v1beta1/instance/attributes/hostname` echo "nameserver $dns1" > /etc/resolv.conf echo "nameserver $dns2" >> /etc/resolv.conf hostname $hn
这样就在网卡启动后,重新在resolv.conf中添加了metadata中定义的dns服务器地址,已经更改了hostname。
同样的,在Debian操作系统中,可以修改/etc/network/interfaces文件:
Ifup-post的内容为:
三、总结
Google Cloud的Compute Engine的内部IP地址是通过DHCP获得的,在获得IP地址的同时,系统把nameserver和hostname同步传入VM。而VM会用这些信息覆盖配置。
通过定义instance Metadata的方式可以在每次网卡重启后,重新写入相关的参数。