Ensure Hostname Override Argument Is Not Set
More Info:
Do not override node hostnames.
Risk Level
High
Address
Security
Compliance Standards
- APRA CPS 234 (Australia)
- BSI C5 (Germany)
- Brazil LGPD
- CCPA / CPRA (California)
- CIS Critical Security Controls v8
- CIS GKE
- CMMC 2.0
- CSA Cloud Controls Matrix v4
- DPDPA
- Digital Operational Resilience Act (EU)
- ISO/IEC 27017
- ISO/IEC 27018
- ISO/IEC 27701
- KSA PDPL
- MAS Technology Risk Management (Singapore)
- MITRE ATT&CK (Cloud)
- NIST SP 800-171
- NYDFS 23 NYCRR 500
- SWIFT Customer Security Controls Framework
- Sarbanes-Oxley IT General Controls
- UK NCSC Cyber Assessment Framework
Triage and Remediation
- Remediation
Remediation
Manual Steps
-
On every worker node, inspect the current kubelet process to confirm
--hostname-overrideis in use:/bin/ps -fC kubeletLook for
--hostname-override=in the command line. -
On every worker node, open the kubelet systemd drop-in file for editing:
sudo vi /etc/systemd/system/kubelet.service.d/10-kubeadm.conf -
In that file, locate the line that defines extra kubelet args (commonly
Environment="KUBELET_SYSTEM_PODS_ARGS=..."or similar) and remove the--hostname-override=...argument from the value. Save and exit the editor. -
On every worker node, reload systemd and restart kubelet to apply the change:
sudo systemctl daemon-reloadsudo systemctl restart kubelet.service -
(If
/var/lib/kubelet/config.yamlalso contains a hostname override) On every worker node, edit the kubelet configuration file:sudo vi /var/lib/kubelet/config.yamlRemove any line that sets
hostnameOverride:and save the file, then restart kubelet again:sudo systemctl restart kubelet.service -
Verify on every worker node that kubelet is now running without
--hostname-override:/bin/ps -fC kubeletConfirm that
--hostname-overrideno longer appears in the kubelet process arguments.
Using kubectl
kubectl cannot change the kubelet startup arguments or the host-level configuration at /etc/systemd/system/kubelet.service.d/10-kubeadm.conf or /var/lib/kubelet/config.yaml. To remove the --hostname-override flag, you must edit the kubelet service configuration directly on each worker node; follow the guidance in the Manual Steps section.
Automation
#!/usr/bin/env bash
# Automation: Remove --hostname-override from kubelet systemd config on all worker nodes
# Usage: ./fix_hostname_override.sh node1 node2 ...
set -euo pipefail
if [ "$#" -lt 1 ]; then
echo "Usage: $0 <worker-node-1> [worker-node-2 ...]" >&2
exit 1
fi
SSH_OPTS="-o BatchMode=yes -o StrictHostKeyChecking=accept-new -o ConnectTimeout=10"
fix_node() {
local NODE="$1"
echo "=== Processing node: $NODE ==="
ssh $SSH_OPTS "$NODE" 'bash -s' << 'EOF'
set -euo pipefail
SYSTEMD_DROPIN="/etc/systemd/system/kubelet.service.d/10-kubeadm.conf"
BACKUP_DIR="/etc/systemd/system/kubelet.service.d/backup_hostname_override_$(date +%Y%m%d)"
CHANGED=0
if [ ! -f "$SYSTEMD_DROPIN" ]; then
echo " [INFO] $SYSTEMD_DROPIN not found, nothing to change."
else
mkdir -p "$BACKUP_DIR"
# Backup original file once per run
if [ ! -f "$BACKUP_DIR/10-kubeadm.conf.orig" ]; then
cp "$SYSTEMD_DROPIN" "$BACKUP_DIR/10-kubeadm.conf.orig"
echo " [INFO] Backed up $SYSTEMD_DROPIN to $BACKUP_DIR/10-kubeadm.conf.orig"
fi
# Remove any --hostname-override arguments from the file
TMP_FILE="$(mktemp)"
if grep -q -- '--hostname-override' "$SYSTEMD_DROPIN"; then
sed -E 's/--hostname-override[[:space:]]+[^[:space:]]+//g' "$SYSTEMD_DROPIN" > "$TMP_FILE"
mv "$TMP_FILE" "$SYSTEMD_DROPIN"
chmod 644 "$SYSTEMD_DROPIN"
CHANGED=1
echo " [INFO] Removed --hostname-override from $SYSTEMD_DROPIN"
else
rm -f "$TMP_FILE"
echo " [INFO] No --hostname-override found in $SYSTEMD_DROPIN"
fi
fi
# If /var/lib/kubelet/config.yaml contains hostnameOverride, remove it (GKE may use this file)
KUBELET_CONFIG="/var/lib/kubelet/config.yaml"
if [ -f "$KUBELET_CONFIG" ]; then
TMP_KCFG="$(mktemp)"
if grep -q 'hostnameOverride' "$KUBELET_CONFIG"; then
cp "$KUBELET_CONFIG" "$BACKUP_DIR/config.yaml.orig" 2>/dev/null || true
# Remove any line containing hostnameOverride (simple safe approach)
grep -v 'hostnameOverride' "$KUBELET_CONFIG" > "$TMP_KCFG"
mv "$TMP_KCFG" "$KUBELET_CONFIG"
chmod 600 "$KUBELET_CONFIG"
CHANGED=1
echo " [INFO] Removed hostnameOverride from $KUBELET_CONFIG"
else
rm -f "$TMP_KCFG"
echo " [INFO] No hostnameOverride key found in $KUBELET_CONFIG"
fi
else
echo " [INFO] $KUBELET_CONFIG not found, skipping."
fi
# Restart kubelet only if something changed
if [ "$CHANGED" -eq 1 ]; then
echo " [INFO] Reloading systemd and restarting kubelet (this will restart kubelet on this node)."
systemctl daemon-reload
systemctl restart kubelet.service
else
echo " [INFO] No changes detected; kubelet restart not required."
fi
echo " [VERIFY] Checking kubelet process flags for --hostname-override"
if /bin/ps -fC kubelet | grep -q -- '--hostname-override'; then
echo " [FAIL] kubelet still running with --hostname-override:"
/bin/ps -fC kubelet || true
exit 1
else
echo " [OK] kubelet is running without --hostname-override."
fi
EOF
echo "=== Completed node: $NODE ==="
echo
}
for NODE in "$@"; do
fix_node "$NODE"
done
echo "All specified nodes processed."