Documents root cause analysis and recovery procedure for jungle-cruise node failure after applying multipath.conf via machine.files. Includes three recovery options depending on available credentials: - Apply fixed config (requires talosctl + existing configs) - Force reboot (quickest) - Full regeneration (requires SOPS keys)
6.9 KiB
jungle-cruise Node Recovery Procedure
Status: Node NotReady since 2026-06-20 22:01 CDT
Root Cause: multipath.conf in machine.files causes boot failure
Fix Applied: Commit d2b6d95 - removed multipath.conf from machine.files
Problem Summary
What Happened
- 21:56 CDT - Commit
adc415eadded/etc/multipath.conftomachine.filessection - ~22:00 CDT - Configuration applied to jungle-cruise
- 22:01 CDT - jungle-cruise kubelet stopped posting status (Node → NotReady)
Root Cause
Writing /etc/multipath.conf during Talos early boot via machine.files causes:
[talos] writeUserFiles failed: permission denied (read-only filesystem)
[talos] rebooting in 35 minutes
This is the SAME issue that was previously fixed in commit e8303d5 and documented in IMPLEMENTATION_REPORT.md.
Why This Happened
The multipath.conf was correctly REMOVED in commit e8303d5 (with DaemonSet solution), but was inadvertently RE-ADDED in commit adc415e to fix PX-CSI node driver crash.
Current State
Node Status
$ kubectl get node jungle-cruise
NAME STATUS ROLES AGE VERSION
jungle-cruise NotReady worker 47h v1.32.3
$ kubectl describe node jungle-cruise | grep Ready
Ready Unknown ... NodeStatusUnknown Kubelet stopped posting node status.
Network Status
- ✅ Node is pingable (10.1.71.69)
- ✅ Talos API port is open (50000/tcp)
- ❌ SSH not available (Talos doesn't run SSH)
- ❌ Kubelet not posting status since 03:01:12Z
Pods on Node
- All system pods (cilium, kube-proxy, etc.) are Pending
- Cannot be scheduled due to Node NotReady
Fix Applied
Commit: d2b6d95
Date: 2026-06-20 22:07 CDT
Changes: Removed machine.files section containing multipath.conf from talconfig.yaml
- # Write multipath.conf for PX-CSI
- files:
- - content: |
- defaults { ... }
- devices { ... }
- path: /etc/multipath.conf
- permissions: 0644
+ # (removed - use DaemonSet instead)
Recovery Procedure
Prerequisites
- Access to talosctl with valid talosconfig (from city-hall or control plane)
- SOPS/age keys to decrypt talsecret.sops.yaml (if regenerating configs)
- OR access to existing clusterconfig/ directory with pre-generated configs
Option A: Apply Fixed Config (Preferred)
If you have existing clusterconfig/ or can regenerate:
cd ~/git/homelab/talos/talhelper
# If clusterconfig/ doesn't exist, regenerate (requires SOPS keys)
talhelper genconfig
# Apply the fixed configuration to jungle-cruise
talosctl apply-config \
--file clusterconfig/fastpass-jungle-cruise.yaml \
--nodes 10.1.71.69
# Wait for node to reboot and become Ready
kubectl wait --for=condition=Ready node/jungle-cruise --timeout=10m
Option B: Force Reboot (Quick Recovery)
If the node is stuck in a boot loop, a simple reboot might clear the bad state:
# Via talosctl
talosctl --nodes 10.1.71.69 reboot
# OR via Proxmox (if talosctl unavailable)
# Find VM ID and reboot from Proxmox UI or CLI
After reboot, the node should come back with its previous (working) configuration, since the bad config hasn't been permanently written.
Option C: Full Config Regeneration
If clusterconfig/ is missing:
cd ~/git/homelab/talos/talhelper
# Ensure SOPS age key is available
export SOPS_AGE_KEY_FILE=~/.config/sops/age/keys.txt
# Regenerate all configs
talhelper genconfig
# Apply to jungle-cruise only
talosctl apply-config \
--file clusterconfig/fastpass-jungle-cruise.yaml \
--nodes 10.1.71.69
# Monitor
kubectl get nodes -w
Post-Recovery Steps
1. Verify Node is Healthy
# Check node status
kubectl get nodes -o wide
# jungle-cruise should show Ready with INTERNAL-IP 10.1.71.69
# Verify system pods are running
kubectl get pods -n kube-system -o wide | grep jungle-cruise
2. Deploy multipath.conf DaemonSet
cd ~/git/homelab/talos/talhelper
# Deploy the DaemonSet that writes multipath.conf POST-boot
kubectl apply -f iscsi-multipath-init.yaml
# Verify it's running
kubectl get pods -n kube-system -l app=iscsi-multipath-init -o wide
3. Verify iSCSI Configuration
# Check multipath config was written
talosctl --nodes 10.1.71.69 read /etc/multipath.conf
# Verify kernel modules
talosctl --nodes 10.1.71.69 read /proc/modules | grep -E "iscsi|multipath"
# Check iscsid service
talosctl --nodes 10.1.71.69 service iscsid
4. Test PX-CSI
Once multipath.conf is deployed via DaemonSet:
# Check PX-CSI node-plugin logs
kubectl logs -n portworx -l name=portworx-node -c node-plugin | grep multipath
# Should no longer see: "/etc/multipath.conf not found"
Why This Fix Works
❌ BROKEN: machine.files (Early Boot)
worker:
patches:
- machine:
files: # Writes during early boot → FAILS on read-only FS
- path: /etc/multipath.conf
content: |
...
✅ FIXED: DaemonSet (Post-Boot)
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: iscsi-multipath-init
namespace: kube-system
spec:
template:
spec:
initContainers:
- name: configure-multipath
command:
- sh
- -c
- |
# Writes AFTER boot when FS is fully writable
cat > /host/etc/multipath.conf <<'MPCONF'
...
MPCONF
Key Difference:
machine.fileswrites during early boot when/etcmay be read-only- DaemonSet writes after Kubernetes is up and filesystem is fully writable
Files Modified
| File | Change | Commit |
|---|---|---|
| talconfig.yaml | Removed machine.files section | d2b6d95 |
| JUNGLE-CRUISE-RECOVERY.md | Created this document | d2b6d95 |
References
- Full Implementation Doc:
IMPLEMENTATION_REPORT.md - Quick Reference:
QUICKREF.md - DaemonSet:
iscsi-multipath-init.yaml - Verification Script:
verify-iscsi.sh - Previous Fix Commit:
e8303d5"Fix Talos iSCSI configuration for Portworx CSI" - Broken Commit:
adc415e"Add multipath.conf for PX-CSI node driver" - Recovery Commit:
d2b6d95"Revert multipath.conf from machine.files"
Lessons Learned
- NEVER write files during Talos boot - Use DaemonSets for post-boot configuration
- NEVER mount
/etc/iscsi- iscsi-tools extension manages it - ALWAYS specify
nodeIP.validSubnetsfor dual-NIC setups - Keep git history clean - Easy rollback saved us here
- Test on one node first - Should have tested DaemonSet approach before reverting
Contact
Issue Detected By: Hermes Agent (carousel-of-progress)
Date: 2026-06-20 22:07 CDT
Cluster: fastpass (city-hall.local.mk-labs.cloud)
Node: jungle-cruise (10.1.71.69)
For questions or issues during recovery, refer to IMPLEMENTATION_REPORT.md or QUICKREF.md.