Alpine apk read-only k8s

Ciao a tutti!

Spero qualcuno possa darmi una mano con un problema che mi sta facendo impazzire. Ho un container basato su Alpine Linux e, nonostante stia lavorando con i permessi di root, non riesco a usare apk per installare nulla.

Praticamente, ogni volta che provo a lanciare un comando tipo apk add <pacchetto>, mi restituisce un errore di Unable to lock database: Read-only file system. Aggiungo che sto usando Kubernetes.

Qualcuno ha mai avuto un problema simile con Alpine e Apk? C’è qualche impostazione specifica o un “trucco” che mi sfugge per permettere la scrittura sul filesystem? Ogni suggerimento è super apprezzato!

Di seguito l’errore che mi esce

/ # whoami
root
/ # id
uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel),11(floppy),20(dialout),26(tape),27(video)
/ # apk add --no-cache nano
ERROR: Unable to lock database: Read-only file system
ERROR: Failed to open apk database: Read-only file system

Grazie

Benvenuto MysticMaven,

Molto plausibilmente hai il securityContext.readOnlyRootFilesystem abilitato.

Riusciresti a postare il manifest del pod? Cosi da confermare la situazione e darti una soluzione.

kubectl get pod/<pod name> -o yaml

Grazie

Eccolo, ho censurato alcuni nomi

apiVersion: v1
kind: Pod
metadata:
  labels:
    app.kubernetes.io/name: censurato
  name: censurato
  namespace: default
spec:
  containers:
  - env:
    - name: STAGE
      value: dev
    image: censurato
    imagePullPolicy: IfNotPresent
    name: censurato
    command: ["python3", "myapp"]
    ports:
    - containerPort: 8080
      name: http
      protocol: TCP
    readinessProbe:
      failureThreshold: 3
      periodSeconds: 10
      successThreshold: 1
      tcpSocket:
        port: 8080
      timeoutSeconds: 1
    securityContext:
      capabilities:
        drop:
        - ALL
      readOnlyRootFilesystem: true
...

Il parametro readOnlyRootFilesystem in Kubernetes è un’impostazione di sicurezza che rende il filesystem principale del container in sola lettura.

Quando è impostato su true (come in questo caso), il container non può scrivere, modificare o creare file nel filesystem root. Può solo leggere i file esistenti.

Premessa: La presenza di tale flag è corretta ed è una best practice vivamente consigliata. Le modifiche di queste tipo devono esser fatte esclusivamente nella fase di build, non runtime.

Come risolvere velocemente? Dovresti modificare il manifest (tenendo presente anche deployment o qualsiasi cosa gestisca quel pod) impostando la flag a false.