web-dev-qa-db-fra.com

Comment fusionner deux cartes de configuration à l'aide du montage en volume dans kubernetes

Je vais avoir deux cartes de configuration différentes test-configmap et common-config . J'ai essayé de les monter au même endroit, mais une carte de configuration a remplacé l'autre. Ensuite, j'ai lu à propos de subPath et je n'ai pas travaillé.

deploy.yaml

apiVersion: apps/v1beta1 # for versions before 1.8.0 use apps/v1beta1
kind: Deployment
metadata:
  name: testing
spec:
  replicas: 1
  template:
    metadata:
      name: testing
      labels:
        app: testing
    spec:
      containers:
      - name: testing-container
        image: testing
        imagePullPolicy: IfNotPresent
      ports:
      - containerPort: __PORT__
      volumeMounts:
      - name: commonconfig-volume
        mountPath: /usr/src/app/config/test.config
        subPath: test.config
    volumes:
      - name: commonconfig-volume
        configMap:
          name: test-configmap
      - name: commonconfig-volume
        configMap:
          name: common-config

Erreur :

The Deployment "testing" is invalid: spec.template.spec.volumes[1].name: Duplicate value: "commonconfig-volume"

Je ne sais pas si la fusion de deux cartes de configuration est réalisable ou non. Et si oui, comment devrais-je le faire?.

4
jack

Vous ne pouvez pas monter deux ConfigMaps au même emplacement.

Mais mentionner subPath et key pour chaque élément de chaque configmaps vous permettra d'obtenir des éléments des deux configmaps au même endroit. Vous devrez écrire les points de montage pour chaque fichier manuellement:

apiVersion: v1
kind: Pod
metadata:
  name: config-single-file-volume-pod
spec:
  containers:
    - name: test-container
      image: gcr.io/google_containers/busybox
      command: [ "/bin/sh", "-c", "cat /etc/special-key" ]
      volumeMounts:
      - name: config-volume-1
        mountPath: /etc/special-key1
        subPath: path/to/special-key1
      - name: config-volume-2
        mountPath: /etc/special-key2
        subPath: path/to/special-key2
  volumes:
    - name: config-volume-1
      configMap:
        name: test-configmap1
        items:
        - key: data-1
          path: path/to/special-key1
    - name: config-volume-2
      configMap:
        name: test-configmap2
        items:
        - key: data-2
          path: path/to/special-key2
restartPolicy: Never

Une autre méthode consiste à les monter dans le même répertoire, mais sous-chemin différent, de sorte que vous n'ayez pas à spécifier les éléments à la main. Mais ici, les clés de chaque configmap seront placées dans deux répertoires différents:

apiVersion: v1
kind: Pod
metadata:
  name: config-single-file-volume-pod
spec:
  containers:
    - name: test-container
      image: gcr.io/google_containers/busybox
      command: [ "/bin/sh", "-c", "cat /etc/special-key" ]
      volumeMounts:
      - name: config-volume-1
        mountPath: /etc/special-keys
        subPath: cm1
      - name: config-volume-2
        mountPath: /etc/special-keys
        subPath: cm2
  volumes:
    - name: config-volume-1
      configMap:
        name: test-configmap1
    - name: config-volume-2
      configMap:
        name: test-configmap2
restartPolicy: Never

cm1 et cm2 seront deux répertoires contenant des fichiers dérivés des clés dans test-configmap1 et test-configmap2 respectivement.

6
Shahidh

Vous devez utiliser des volumes spéciaux prévus pour y parvenir. Exemple de votre déploiement:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: testing
spec:
  replicas: 1
  selector:
    matchLabels:
      app: testing
  template:
    metadata:
      name: testing
      labels:
        app: testing
    spec:
      containers:
      - name: testing-container
        image: testing
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: __PORT__
        volumeMounts:
        - name: commonconfig-volume
          mountPath: /usr/src/app/config
      volumes:
        - name: commonconfig-volume
          projected:
            sources:
            - configMap:
                name: test-configmap
            - configMap:
                name: common-config

Vous pouvez utiliser secret identique à configMap

2
kvaps

Une solution consiste à les monter à différents endroits, mais dans le même volume emptyDir, en montant ce même volume dans un conteneur init et en incluant un court script dans le conteneur init pour fusionner les deux fichiers à l'aide des outils début du script. Les scripts peuvent facilement être inclus dans le manifeste de pod en utilisant la technique décrite dans this answer.

0
dippynark