web-dev-qa-db-fra.com

Kubettes configmap uniquement en écriture par root

J'utilise ConfigMap Pour exposer un fichier PHP destiné à être partagé à travers des gousses et écrities par le www-data (Apache) utilisateur.

Configmap

apiVersion: v1
kind: ConfigMap
metadata:
  name: magento-config
data:
  env.php: |
    <?php
    return array ( ...

Déploiement

apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: Apache-deployment
spec:
    ...
    spec:
      containers:
        - name: Apache
          image: Apache:2.4
          ...
          volumeMounts:
          - name: magento-configs
            mountPath: /var/www/html/etc
          imagePullPolicy: Always
      volumes:
        - name: magento-configs
          configMap:
            name: magento-config

Le fichier apparaît inscriptible uniquement par root si

root@Apache-deployment-79c8548cdc-r6qhs:/# realpath /var/www/html/etc/env.php
/var/www/html/etc/..2018_04_23_16_21_10.435323593/env.php
root@Apache-deployment-79c8548cdc-r6qhs:/# ls -l /var/www/html/etc/..2018_04_23_16_21_10.435323593/env.php
-rw-r--r-- 1 root root 909 Apr 23 16:21

Est-ce qu'il y a une façon de changer ceci-ci? J'ai remarqué VolumeMount a une propriété readOnly qui par défaut à false. En effet, le volume est écritable, mais seulement par root.

J'ai essayé de définir Apache_RUN_USER à root à Apache, mais cela veut que je recompile (en utilisant actuellement la construction d'APT) lol, ce qui ressemble à la mauvaise direction. Je voudrais juste comprendre comment utiliser ConfigMap correctement si possible.

4
quickshiftin

Mise à jour :

Vous devez donc utiliser une version antérieure de Kubettes <1.13 qui est toujours autorisée pour ce comportement de volume de données. Je vais vous dire qu'en 1.13+ et plus tard, vous ne pourrez pas avoir de montures en lecture-écriture comme celle-là. Cependant, il y a un travail autour, ce qui pourrait être la façon de faire des choses de "Kubettes" (même si j'ai du mal à comprendre pourquoi c'est mieux).

le travail autour de :

Dans votre pod/déploiement, créez un conteneur init qui monte deux volumes. Le premier volume étant votre fichier configmap (fichier) et le second étant un conteneur ELTLEDIR. Nous examinerons le premier volume (configmap) comme source et plus tard comme destination. Ensuite, tout ce que vous avez à faire dans votre nouveau conteneur init est de copier le contenu du volume source sur le volume de destination.

Ensuite, dans votre section de conteneur d'applications normale, montez le conteneur de destination de ce qui précède, puis vous disposez de capacités de lecture/écriture complètes sans avoir à gérer les changements d'API de Kubete. Cela devrait également résister à une grande partie des changements d'API qu'ils envisagent de faire à l'avenir.

2
Rory Savage

Ok, j'ai trouvé quelque chose fonctionnel (mais pas idéal). J'ai d'abord découvert que je peux monter le fichier directement à partir du ConfigMap avec le paramètre subPath:

containers:
  - name: Apache
    image: Apache:2.4
    ...
    volumeMounts:
    - name: magento-configs
      mountPath: /var/www/html/app/env/etc.php
      subPath: etc.php
    imagePullPolicy: Always
volumes:
  - name: magento-configs
    configMap:
      name: magento-config

J'ai ensuite découvert la modification de la propriété du fichier à l'intérieur de la pod fonctionne et une fois changé www-data peut écrire dans le fichier. Donc je me suis installé sur un Crochet de cycle de vie post-démarrage qui change de propriété lorsque la pod commence

containers:
  - name: Apache
    image: Apache:2.4
    lifecycle:
      postStart:
        exec:
          command: ["chown", "www-data:www-data", "/var/www/html/app/etc/env.php"]

Idéalement, la propriété du fichier serait quelque chose que nous pourrions configurer sur le paramètre volumeMount.

0
quickshiftin