web-dev-qa-db-ja.com

Kubernetesでボリュームマウントを使用して2つの構成マップをマージする方法

2つの異なる構成マップtest-configmapcommon-configがあります。同じ場所にマウントしようとしましたが、1つの構成マップが他の構成マップを上書きしました。次に、subPathについて読み、うまくいきませんでした。

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

エラー:

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

2つの構成マップをマージすることが達成可能かどうかはわかりません。はいの場合、どうすればよいですか。

8
jack

2つのConfigMapを同じ場所にマウントすることはできません。

ただし、各構成マップのすべてのアイテムについてsubPathkeyに言及すると、同じ場所にある両方の構成マップからアイテムを取得できます。各ファイルのマウントポイントを手動で書き込む必要があります。

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

別の方法は、同じディレクトリの下にそれらをマウントすることですが、手動で項目を指定する必要がないように異なるsubPathを使用します。ただし、ここでは各configmapのキーが2つの異なるディレクトリに配置されます。

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

cm1cm2は、それぞれtest-configmap1test-configmap2のキーから派生したファイルを含む2つのディレクトリになります。

7
Shahidh

そのためには、特別な projected ボリュームを使用する必要があります。デプロイメントの例:

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

secretconfigMapと同じように使用できます

7
kvaps

複数のconfigmapをマウントするためにこれを行う方法の別の例。これはnginxドックの場合、メインの/etc/nginx/nginx.confと/etc/nginx/conn.f内のファイルの両方を置き換えたい場合に使用します。これにより、conf.dのdefault.confファイルも削除されます

 containers:
    - name: nginx-proxy
      image: nginx:1.16-Alpine
      imagePullPolicy: Always
      ports:
        - containerPort: 443
        - containerPort: 80
      volumeMounts:
        - name: nginx-main-conf-file
          mountPath: /etc/nginx/nginx.conf
          subPath: nginx.conf
        - name: nginx-site-conf-file
          mountPath: /etc/nginx/conf.d
  volumes:
    - name: nginx-main-conf-file
      configMap:
        name: nginx-main-conf
    - name: nginx-site-conf-file
      configMap:
        name: nginx-site-conf

そして1つ非常に重要ポイント。 yamlファイルにコメントアウトされた行(#何か)がある場合、これは機能しません。それはバグです。 kubectl v1.14でテスト済み

1
Christoffer

1つの方法は、それらを異なるポイントにマウントするが、同じemptyDirボリュームにマウントし、その同じボリュームを init container にマウントし、initコンテナーに短いスクリプトを含めて、2つをマージすることです。スクリプトの最初にインストールするツールを使用してファイルを作成します。スクリプトは、ポッドマニフェストに this 回答の手法を使用して簡単に含めることができます。

0
dippynark