2つの異なる構成マップtest-configmapとcommon-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つの構成マップをマージすることが達成可能かどうかはわかりません。はいの場合、どうすればよいですか。
2つのConfigMapを同じ場所にマウントすることはできません。
ただし、各構成マップのすべてのアイテムについてsubPath
とkey
に言及すると、同じ場所にある両方の構成マップからアイテムを取得できます。各ファイルのマウントポイントを手動で書き込む必要があります。
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
cm1
とcm2
は、それぞれtest-configmap1
とtest-configmap2
のキーから派生したファイルを含む2つのディレクトリになります。
そのためには、特別な 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
secret
はconfigMap
と同じように使用できます
複数の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つの方法は、それらを異なるポイントにマウントするが、同じemptyDir
ボリュームにマウントし、その同じボリュームを init container にマウントし、initコンテナーに短いスクリプトを含めて、2つをマージすることです。スクリプトの最初にインストールするツールを使用してファイルを作成します。スクリプトは、ポッドマニフェストに this 回答の手法を使用して簡単に含めることができます。