Rozważałem użycie sekretów do zamontowania pojedynczego pliku, ale wydaje się, że możesz zamontować tylko katalog, który nadpisze całą pozostałą zawartość. Jak mogę udostępnić pojedynczy plik konfiguracyjny bez montowania katalogu?
Odpowiedzi:
Na przykład masz mapę konfiguracyjną, która zawiera 2 pliki konfiguracyjne:
kubectl create configmap config --from-file <file1> --from-file <file2>
Możesz użyć subPath w ten sposób, aby zamontować pojedynczy plik w istniejącym katalogu:
---
volumeMounts:
- name: "config"
mountPath: "/<existing folder>/<file1>"
subPath: "<file1>"
- name: "config"
mountPath: "/<existing folder>/<file2>"
subPath: "<file2>"
restartPolicy: Always
volumes:
- name: "config"
configMap:
name: "config"
---
Pełny przykład tutaj
Zacząłbym od tego roboczego przykładu stąd . Upewnij się, że używasz przynajmniej Kubernetes 1.3.
Po prostu utwórz ConfigMap w następujący sposób:
apiVersion: v1
kind: ConfigMap
metadata:
name: test-pd-plus-cfgmap
data:
file-from-cfgmap: file data
A następnie utwórz kapsułę taką jak ta:
apiVersion: v1
kind: Pod
metadata:
name: test-pd-plus-cfgmap
spec:
containers:
- image: ubuntu
name: bash
stdin: true
stdinOnce: true
tty: true
volumeMounts:
- mountPath: /mnt
name: pd
- mountPath: /mnt/file-from-cfgmap
name: cfgmap
subPath: file-from-cfgmap
volumes:
- name: pd
gcePersistentDisk:
pdName: testdisk
- name: cfgmap
configMap:
name: test-pd-plus-cfgmap
Obecnie (v1.0, v1.1) nie ma możliwości zamontowania pojedynczego pliku konfiguracyjnego na woluminie. Struktura Secret jest naturalnie zdolna do reprezentowania wielu sekretów, co oznacza, że musi to być katalog.
Kiedy otrzymamy obiekty konfiguracyjne, powinny być obsługiwane pojedyncze pliki.
W międzyczasie możesz zamontować katalog i dowiązanie do niego ze swojego obrazu?
Powiedzmy, że chcesz zamontować nowy plik log4j2.xml w działającym wdrożeniu, aby usprawnić rejestrowanie
# Variables
k8s_namespace=xcs
deployment_name=orders-service
container_name=orders-service
container_working_dir=/opt/orders-service
# Create config map and patch deployment
kubectl -n ${k8s_namespace} create cm log4j \
--from-file=log4j2.xml=./log4j2.xml
kubectl -n ${k8s_namespace} patch deployment ${deployment_name} \
-p '{"spec":{"template":{"spec":{"volumes":[{"configMap":{"defaultMode": 420,"name": "log4j"},"name": "log4j"}]}}}}'
kubectl -n ${k8s_namespace} patch deployment ${deployment_name} \
-p '{"spec":{"template":{"spec":{"containers":[{"name": "'${container_name}'","volumeMounts": [{ "mountPath": "'${container_working_dir}'/log4j2.xml","name": "log4j","subPath": "log4j2.xml"}]}]}}}}'