wake-up-neo.com

Kubernetes: Festlegen von VolumeMount-Benutzergruppen- und Dateiberechtigungen

Ich verwende einen Kubernetes-Cluster auf AWS mit Kops. Ich habe ein EBS-Volume in einen Container gemountet, und es ist aus meiner Anwendung sichtbar. Es kann jedoch nur gelesen werden, weil meine Anwendung nicht als Root ausgeführt wird. Wie kann ich eine PersistentVolumeClaim als anderen Benutzer als root einbinden? Die Variable VolumeMount scheint keine Optionen zur Steuerung der Benutzer-, Gruppen- oder Dateiberechtigungen des eingehängten Pfads zu haben.

Hier ist meine Deployment-Yaml-Datei:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: notebook-1
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: notebook-1
    spec:
      volumes:
      - name: notebook-1
        persistentVolumeClaim:
          claimName: notebook-1
      containers:
      - name: notebook-1
        image: jupyter/base-notebook
        ports:
        - containerPort: 8888
        volumeMounts:
        - mountPath: "/home/jovyan/work"
          name: notebook-1
14

Der Pod-Sicherheitskontext unterstützt das Festlegen einer fsGroup, mit der Sie die Gruppen-ID festlegen können, zu der das Volume gehört, und damit, wer darauf schreiben kann. Das Beispiel in den Dokumenten:

apiVersion: v1
kind: Pod
metadata:
  name: hello-world
spec:
  containers:
  # specification of the pod's containers
  # ...
  securityContext:
    fsGroup: 1234

Weitere Informationen hierzu finden Sie hier: https://kubernetes.io/docs/concepts/policy/security-context/

13
AlexBrand

Am Ende stand ein initContainer mit demselben VolumeMount wie der Hauptcontainer, um in meinem Fall die richtigen Berechtigungen für ein benutzerdefiniertes Grafana-Image festzulegen.

initContainers:
- name: take-data-dir-ownership
  image: Alpine:3.6
  # Give `grafana` user (id 472) permissions a mounted volume
  # https://github.com/grafana/grafana-docker/blob/master/Dockerfile
  command:
  - chown
  - -R  
  - 472:472
  - /var/lib/grafana
  volumeMounts:
  - name: data
    mountPath: /var/lib/grafana

Dies ist erforderlich, wenn das Hauptabbild in einem Pod als Benutzer mit Ausnahme von root ausgeführt wird und Schreibberechtigungen für ein bereitgestelltes Volume benötigt.

5
sshow

Bei Version 1.10+ von k8s wurde fsGroup durch runAsGroup ersetzt.

Die Umsetzung kann hier nachverfolgt werden: https://github.com/kubernetes/features/issues/213

1
Yalok Iy

Dies war eine der Herausforderungen für die Kubernetes-Bereitstellungen/Statefulsets, wenn Sie den Prozess in einem Container als Nicht-Root-Benutzer ausführen müssen. Wenn Sie jedoch ein Volume in einen Pod einbinden, wird es immer mit der Erlaubnis von root: root eingebunden. Der Benutzer ohne Rootberechtigung muss also Zugriff auf den Ordner haben, in den er Daten lesen und schreiben möchte.

Bitte befolgen Sie die folgenden Schritte für das gleiche.

  1. Erstellen Sie eine Benutzergruppe und weisen Sie die groudID in Dockerfile zu.
  2. Erstellen Sie einen Benutzer mit der Benutzer-ID und fügen Sie ihn der Gruppe in Dockerfile hinzu.
  3. ändern Sie den Eigentümer für die Ordner, die der Benutzer lesen/schreiben möchte, rekursiv.
  4. Fügen Sie die folgenden Zeilen in deployment/Statefulset im Pod-Spezifikationskontext hinzu.

    spec: securityContext: runAsUser: 1099 runAsGroup: 1099 fsGroup: 1099

runAsUser: Gibt an, dass für alle Container im Pod alle Prozesse mit der Benutzer - ID 1099 ausgeführt werden. runAsGroup: Gibt die primäre Gruppen - ID 1099 für alle Prozesse in allen Containern des Pod an. (Wenn dieses Feld weggelassen wird, die primäre Gruppen - ID des Container sind root (0). Alle erstellten Dateien gehören auch dem Benutzer 1099 und der Gruppe 1099, wenn runAsGroup angegeben ist von Nichtwurzelgruppe: Nichtwurzelgruppe.

0
rajdeepbs29