docs(nfs): po zmianie eksportu rollout restart nie wystarcza

Najdroższy czasowo moment pierwszego wdrożenia, więc zapisany wprost.

FAKT: eksport poprawiony (mapall_user), usługa NFS zrestartowana, pod
zrestartowany przez `rollout restart` — a zapis z poda nadal odbijał się
o Permission denied. Jednocześnie ręczne zamontowanie TEGO SAMEGO eksportu
z TEGO SAMEGO węzła pozwalało pisać.

HIPOTEZA (niepotwierdzona u źródła): jądro współdzieli strukturę montowania NFS
między montowania tego samego eksportu na węźle, razem z cache odpowiedzi ACCESS.
`rollout restart` zostawia stary i nowy pod na chwilę współistniejące — widać to
w jego własnym logu jako „1 old replicas are pending termination" — więc
montowanie ani na moment nie zostaje bez użytkownika i nowy pod dziedziczy
odpowiedź sprzed zmiany.

ROZWIĄZANIE (zweryfikowane): zejść do zera replik, poczekać na zniknięcie podów,
wrócić do jednej. W ArgoCD ten sam skutek daje force delete poda.

Dopisany też test rozdzielający winę serwera od winy klienta: ręczny montaż
z węzła z pominięciem Kubernetesa. SERWER-OK przy jednoczesnej odmowie w podzie
znaczy, że na NAS-ie nie ma czego poprawiać — i oszczędza rundy zmian
w konfiguracji udziału, które niczego nie dają.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-09 11:53:14 +02:00
parent 4ae06364d6
commit 34947f8871
+41 -3
View File
@@ -217,9 +217,47 @@ sudo ls -ld /mnt/Tank1/astrololo-state
Zestaw, który DZIAŁA: kontener jako `uid=0(root)`, udział z `ro: false` Zestaw, który DZIAŁA: kontener jako `uid=0(root)`, udział z `ro: false`
i `mapall: root`, katalog `drwxrwx--- root root`. i `mapall: root`, katalog `drwxrwx--- root root`.
Po każdej zmianie eksportu: `midclt call service.restart nfs`, a potem ### ⚠️ Po zmianie eksportu `rollout restart` NIE WYSTARCZA
`kubectl -n astrololo rollout restart deploy/presentation`. Sama zmiana
konfiguracji nie przeładowuje eksportów. To kosztowało najwięcej czasu przy pierwszym wdrożeniu, więc zapisane wprost.
**Objaw:** eksport poprawiony, `service.restart nfs` wykonany, pod zrestartowany —
a zapis z poda nadal odbija się o `Permission denied`. Przy czym **ręczne
zamontowanie tego samego eksportu z tego samego węzła działa** i pozwala pisać.
**Co z tym zrobić:** doprowadzić do stanu, w którym ŻADEN pod nie trzyma tego
montowania.
```bash
kubectl -n astrololo scale deploy/presentation --replicas=0
kubectl -n astrololo wait --for=delete pod -l app=presentation --timeout=90s
kubectl -n astrololo scale deploy/presentation --replicas=1
kubectl -n astrololo rollout status deploy/presentation
```
`rollout restart` tego nie osiąga, bo stary i nowy pod na chwilę WSPÓŁISTNIEJĄ —
w logu widać `1 old replicas are pending termination`. Montowanie ani na moment
nie zostaje bez użytkownika. (W ArgoCD ten sam skutek daje `force delete` poda.)
**Dlaczego (hipoteza, nie potwierdzona u źródła):** jądro współdzieli strukturę
montowania NFS między montowania tego samego eksportu na węźle, razem z cache
odpowiedzi ACCESS. Nowy pod podpina się do żywego montowania i dziedziczy
odpowiedź sprzed zmiany eksportu.
**Test, który rozstrzyga, czy winny jest serwer czy klient** — montaż ręczny
z węzła, z pominięciem Kubernetesa:
```bash
ssh <węzeł> 'sudo mkdir -p /mnt/t && sudo mount -t nfs 192.168.1.34:/mnt/Tank1/astrololo-state /mnt/t \
&& sudo touch /mnt/t/proba && echo SERWER-OK || echo SERWER-NIE; sudo umount /mnt/t'
```
`SERWER-OK` przy jednoczesnym `Permission denied` w podzie znaczy, że konfiguracja
NAS-a jest dobra i **nie ma czego na nim poprawiać** — problem jest po stronie
klienta.
Osobno pamiętaj: sama zmiana konfiguracji udziału nie przeładowuje eksportów.
Po każdej zmianie `midclt call service.restart nfs`.
--- ---