我正在使用配置内部构建系统团队城市使用 VMWare vSphere。配置完成后,构建服务器应该开始构建代理使用 vSphere API 的虚拟机。TeamCity 构建服务器已经启动了我所需的构建代理虚拟机,但存在一个问题。
当构建服务器检测到需要多个代理虚拟机时,它会非常快速地启动虚拟机,并且这些虚拟机在约 80% 的情况下往往会获得相同的 IP 地址。如果我手动启动构建代理并在调用之间稍作停顿,虚拟机将获得唯一的 IP 地址。
相同的 IP 地址会导致许多网络问题。以下是 2 个具有相同 IP 地址的构建代理虚拟机的屏幕截图。
我认为 vSphere 使用的是具有 DHCP 服务的 Cisco Meraki 盒,但我无法访问它。我花了几天时间试图将这个问题缩小到上面的屏幕截图,但我不知道接下来该怎么做。我以为 DHCP 服务应该可以很好地处理这种情况,但我一定是配置错误了。
我的构建代理虚拟机是 Ubuntu 20.04 LTS,当我创建快照时,它没有预先配置 DHCP。我没有运行任何脚本来准备快照映像,它或多或少是安装了 docker 的原始 Ubuntu,我们所有的构建都是容器化的。我使用的是克隆的虚拟机,而不是模板。
有人可以给我指明正确的方向吗?
答案1
我的构建代理 VM 是 Ubuntu 20.04 LTS,当我创建快照时它没有预先配置 DHCP。
应该有。
如果在拍摄虚拟机快照时虚拟机具有静态 IP 地址,则从该快照创建的所有克隆在启动时都会尝试使用相同的网络配置。这根本行不通,即使您在部署它们时等待。
我认为发生的事情是,当虚拟机启动并发现其 IP 地址已被使用时,它会自动切换到 DHCP 以获取新的 IP 地址;但如果您同时启动其中两个,它们不会检测到任何 IP 冲突,只会尝试使用其现有配置。
您应该在克隆基础映像之前为其配置 DHCP。
答案2
不确定这是否理想,但我会描述我为解决这个问题所做的事情。这是一个黑客所以请不要使用它,除非所有其他方法都失败了
启用netplan
,但禁用 IPv4 DHCP。出于某种原因,当我创建了同一克隆的多个实例时一些实例有相同的 IP
sudo nano /etc/netplan/00-installer-config.yaml
---
network:
version: 2
renderer: networkd
ethernets:
ens160:
dhcp4: false
---
添加作业以在启动时配置 IPv4 地址
sudo crontab -e
--
@reboot /usr/bin/bash /boot-config.sh > /boot-config.log
--
创建启动配置文件
sudo touch /boot-config.sh
sudo chown root:root /boot-config.sh
sudo chmod +x /boot-config.sh
对于某些程序,使用完整路径很重要,因为$PATH
不包含/usr/sbin
,例如,在启动时cron
调用脚本
sudo nano /boot-config.sh
---
#!/bin/bash
echo "*********************"
echo "Boot config script"
echo "*********************"
echo "PATH: " $PATH
echo "Running via " $SHELL
echo "Current working directory " $(pwd)
echo ""
echo "Releasing IP address for ens160"
/usr/sbin/dhclient -v -r ens160
echo "Removing DHCP lease files"
rm /var/lib/dhcp/*
echo "Generating new machine id"
echo "Old id: " $(cat /etc/machine-id)
rm /etc/machine-id
systemd-machine-id-setup
echo "New id: " $(cat /etc/machine-id)
echo "Requesting new IP"
/usr/sbin/dhclient -v ens160
echo ""
echo "Finished"
---
# You should be able to see the result in the log file
sudo cat /boot-config.log
PS:将此标记为答案,但是https://serverfault.com/a/1034226/82856对解决问题很有帮助。