我有一组用于 Packer、Terraform 和 Ansible 的自动化配置和脚本,用于在我们内部的 VMWare 集群上部署 K8S 集群。现在,所有这些都运行良好,但有一个小问题:各个节点在关闭或重新启动时不会释放其 DHCP 租约。由于我在测试部署脚本的更新时正在创建和销毁大量此类集群,因此许多 DHCP 租约已注册但从未释放。两天前,这最终导致虚拟机的 DHCP 池耗尽。
我可以通过手动删除已被破坏的集群的旧的未使用的租约来临时解决这种情况,但我需要说服虚拟机在关闭时自行释放租约。
首先,我尝试使用运行的关机脚本释放 dhcp 租约init.d
,dhclient -r
但这不起作用,因为dhclient
首先不用于获取租约——现在默认情况下 systemd 负责此操作。我在网上查阅了 systemd 配置文档,找到了两个应该可以解决这个问题的旋钮: KeepConfiguration=no
和SendRelease=yes
,但不幸的是,它们需要比 Ubuntu 18.04 LTS 更新的 systemd 版本,并且在不升级核心操作系统的情况下升级 systemd 似乎是一件很危险的事情。
我发现dhclient -r
将要工作,如果它dhclient
最初获得租约,那么我正在寻找一种方法来:
- 确认
dhclient
释放 systemd 获得的租约。 - 禁用 systemd DHCP 客户端并完全切换
dhclient
。
我已经开始研究 20.04 LTS 部署,它具有更新的 systemd,但是从 over 到 subiquity 的转变d-i
导致了一系列令人沮丧的问题。
答案1
#!/bin/bash
# Check if running with root privileges
if [ "$EUID" -ne 0 ]; then
echo "Please run this script with sudo or as root."
exit 1
fi
# Install isc-dhcp-client
apt-get update
apt-get install -y isc-dhcp-client
# Stop and disable systemd-networkd
systemctl stop systemd-networkd
systemctl disable systemd-networkd
# Enable dhclient
systemctl enable dhclient
# Restart networking service
systemctl restart networking
echo "Switched to dhclient as the DHCP client."