Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
This article provides verification steps, troubleshooting guidance, network requirements, operational procedures, and a Helm values reference for NFS with Kerberos authentication.
Important
Agentic Retrieval in Foundry Local is currently in PREVIEW. See the Supplemental Terms of Use for Microsoft Azure Previews for legal terms that apply to Azure features that are in beta, preview, or otherwise not yet released into general availability.
Verification
After installation, verify that the Kerberos setup works.
Check which nodes are Kerberos-ready
kubectl get nodes -l edge-rag/kerberos-ready=true
# Should list all prepared nodes
Check for failed nodes and reasons
kubectl get nodes -l edge-rag/kerberos-ready=false --show-labels \
| tr ',' '\n' | grep kerberos
# Possible reasons: KRB5_CONF_MISSING, KEYTAB_MISSING, KEYTAB_EMPTY,
# KDC_UNREACHABLE, KDC_DNS_UNREACHABLE
Check DaemonSet validator logs
kubectl logs -n arc-rag -l app=kerberos-validator --tail=20
Test an NFS ingestion
- Open the developer portal.
- Create a new NFS data source.
- Select Kerberos as the authentication method (UID/GID fields are hidden).
- Enter the NFS server hostname and export path.
- Start ingestion and verify files are processed without errors.
Troubleshooting
| Symptom | Root cause | Fix |
|---|---|---|
| Install fails: "No nodes with kerberos-provisioned label" | No nodes are labeled. | Run kubectl label node <node_name> edge-rag/kerberos-provisioned=true. Complete all prerequisite steps first. |
Node shows kerberos-ready=false with reason KRB5_CONF_MISSING |
/etc/krb5.conf doesn't exist on the node. |
Create the file per Step 3. |
Node shows kerberos-ready=false with reason KEYTAB_MISSING or KEYTAB_EMPTY |
/etc/krb5.keytab is missing or zero bytes. |
Deploy the keytab per Step 4. |
Node shows kerberos-ready=false with reason KDC_UNREACHABLE |
Can't reach the domain controller on port 88. | Check firewall rules and DNS: nc -zv <domain_controller> 88. |
Node shows kerberos-ready=false with reason KDC_DNS_UNREACHABLE |
DNS can't resolve KDC hostname. | Check /etc/resolv.conf and nslookup <domain_controller>. |
| Ingestion fails: "No Kerberos-ready nodes available" | All nodes are kerberos-ready=false. |
Check DaemonSet logs: kubectl logs -n arc-rag -l app=kerberos-validator. |
NFS mount fails: access denied by server |
Reverse DNS missing for NFS server, or NFS export doesn't allow krb5p. |
Verify: nslookup <nfs_server_ip> returns FQDN. Check NFS export config. |
| NFS mount fails when using IP address | Kerberos requires hostname, not IP. | Use the NFS server's FQDN (for example, nfs-server.contoso.com). |
kinit: Keytab contains no suitable keys |
Service principal name (SPN) mismatch between keytab and request. | Run klist -kt /etc/krb5.keytab and verify that the SPN matches exactly. |
Clock skew too great |
Node time differs from KDC by more than 5 minutes. | Enable NTP: sudo timedatectl set-ntp true. |
rpc.gssd not running |
Service is stopped or failed to start. | Run sudo systemctl restart rpc-gssd. Check journalctl -u rpc-gssd. |
Pod stuck in Pending |
No nodes match the kerberos-ready=true affinity. |
Check node labels: kubectl get nodes --show-labels | grep kerberos. |
Network requirements
Ensure the following network paths are open from all Kubernetes worker nodes:
| Source | Destination | Port | Protocol | Purpose |
|---|---|---|---|---|
| Worker nodes | Domain controller (KDC) | 88 | TCP/UDP | Kerberos authentication |
| Worker nodes | Domain controller | 464 | TCP/UDP | Kerberos password change |
| Worker nodes | Domain controller | 389 / 636 | TCP | LDAP / LDAPS |
| Worker nodes | NFS file server | 2049 | TCP | NFS file access |
| Worker nodes | NFS file server | 111 | TCP/UDP | RPC portmapper |
| Worker nodes | DNS server | 53 | TCP/UDP | DNS resolution |
| Worker nodes | NTP server | 123 | UDP | Time synchronization |
Test connectivity:
nc -zv <domain_controller> 88 # Kerberos
nc -zv <nfs_server_fqdn> 2049 # NFS
Keytab rotation
When your Active Directory (AD) policy requires password rotation (typically every 90 days):
# 1. Generate new keytab (while old keytab is still valid)
kadmin -p <admin_user>@<YOUR_REALM> \
-q "ktadd -k /tmp/edgerag-nfs-new.keytab nfs/<service_account>@<YOUR_REALM>"
# 2. Deploy to all nodes
for NODE in <node_1> <node_2> <node_3>; do
scp /tmp/edgerag-nfs-new.keytab ${NODE}:/etc/krb5.keytab
ssh ${NODE} "sudo chmod 600 /etc/krb5.keytab && sudo chown root:root /etc/krb5.keytab"
done
# 3. Verify: DaemonSet detects the new keytab within 60 seconds
kubectl get nodes -l edge-rag/kerberos-ready=true
Note
After the AD password is reset, existing Kerberos TGTs remain valid for approximately 10 hours. Deploy the new keytab within this window for uninterrupted service. Running pods don't need to restart. rpc.gssd reads the keytab again on its next kinit.
Add new nodes
When adding a new worker node to the cluster:
# 1. Join the AD domain
sudo realm join <YOUR_DOMAIN> -U <admin_user>@<YOUR_DOMAIN>
# 2. Install packages
sudo apt install -y krb5-user nfs-common
# 3. Copy krb5.conf from an existing node
scp <existing_node>:/etc/krb5.conf /etc/krb5.conf
# 4. Deploy keytab
scp <admin_machine>:/path/edgerag-nfs.keytab /etc/krb5.keytab
sudo chmod 600 /etc/krb5.keytab
# 5. Enable rpc-gssd
sudo systemctl enable --now rpc-gssd
# 6. Run validation script
sudo ./validate-kerberos-prereqs.sh
# 7. Label the node
kubectl label node <new_node_name> edge-rag/kerberos-provisioned=true
# The DaemonSet automatically validates and labels it kerberos-ready=true
Helm values reference
| Helm key | Type | Default | Description |
|---|---|---|---|
kerberos.enabled |
bool | false |
Primary toggle for Kerberos NFS authentication. |
kerberos.spn |
string | "" |
Service principal name. Required when enabled. Example: nfs/edgerag-svc@CONTOSO.COM. |
kerberos.minNodes |
int | 1 |
Minimum nodes with kerberos-provisioned=true label for pre-install validation. |
kerberos.checkInterval |
int | 60 |
DaemonSet health check polling interval (seconds). |
skipKerberosValidations |
bool | false |
Skip DaemonSet and pre-install hook. For development and testing only. Don't use in production. |