Что если вы хотите установить файл конфигурации из ConfigMap, но не хотите устанавливать его как объем? Вы можете сделать это, используя подлины. Прежде чем я объясню, как использовать подвижность, давайте посмотрим, что произойдет, если я этого не сделаю.
Использование конфигурации в качестве монтированного тома
По умолчанию конфигурапы передаются с стручками двумя способами; переменные среды или монтированные объемы. В этом примере у меня есть карта конфигурации, которая содержит конфигурацию MySQL. Использование переменных среды для этого невозможно, что оставляет меня с использованием объема.
То, что вы видите здесь, является манифестом для конфигурации. Манифест определяет имя configmap и связывает некоторые метки в метаданных. В разделе данных он содержит имя карты mysql_binlog_format.cnf
и источник данных, который является содержанием файла.
configmap
# mysql-configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: mysql-configmap labels: app: mysql data: mysql_binlog_format.cnf: | [mysqld] binlog-format=mixed
Развертывание с использованием тома ConfigMap
Как я уже упоминал, ConfigMaps можно использовать в качестве объема. VolumeMeants внутри шаблона. Spec такие же, как и любой другой объем. Однако раздел объемов отличается. Вместо того, чтобы указать PersistentVolumeclaim или другой тип тома, вы ссылаетесь на конфигурацию по имени. Это принимает все имена карт и источники данных ConfigMap, названную MySQL-ConfigMap и объединяет его как том в /etc/mysql/conf.d
# mysql-deployment.yaml apiVersion: v1 kind: Service metadata: name: mysql spec: ports: - port: 3306 selector: app: mysql clusterIP: None --- apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2 kind: Deployment metadata: name: mysql spec: selector: matchLabels: app: mysql strategy: type: Recreate template: metadata: labels: app: mysql spec: containers: - image: mysql:5.6 name: mysql env: # Use secret in real usage - name: MYSQL_ROOT_PASSWORD value: password ports: - containerPort: 3306 name: mysql volumeMounts: - name: mysql-configmap-volume mountPath: /etc/mysql/conf.d volumes: - name: mysql-configmap-volume configMap: name: mysql-configmap
Примените манифесты
#save the above manifests (mysql-configmap.yaml & mysql-deployment.yaml) kubectl apply -f . # Use kubctl exec to list /etc/mysql/conf.d contents kubectl exec -it mysql-59fcc88776-g768b ls /etc/mysql/conf.d
Эта проблема
Снимок экрана выше говорит нам, что крепление громкости сработало. Kubernetes взял название карты mysql_binlog_format.cnf
Представьте его как файл с содержимым, которое хранилось в источнике данных ConfigMap. Проблема, однако, заключается в том, что этот объем поверх существующего каталога. Файлы конфигурации по умолчанию для MySQL больше не присутствуют. Я должен был создать все файлы конфигурации MySQL и сохранить их в конфигурации. Или я могу использовать подвижность.
Использование подпола
Ничто не нужно изменить с фактическими ресурсами ConfigMap, которые были созданы ранее. Тем не менее, я должен внести несколько изменений в нашем манифесте развертывания, чтобы использовать подвижность. Сначала мне придется обновить шаблон. Мне нужно обновить MountPath, чтобы включить имя файла, которое я хочу, чтобы он монтировал. Гора, теперь /etc/mysql/conf.d/binlog_format.cnf
вместо /etc/mysql/conf.d
. Далее мне нужно добавить свойство подполота. Значение для подлинала должно соответствовать пути, указанного в разделе «Шаблон».
Мне также нужно обновить раздел Templates.volumes. Вместо того, чтобы просто предоставлять имя configmap, мне теперь также нужно предоставить и список элементов записей, которые я хочу включить в ConfigMap. Под элементами я указал ключ, который является именем карты и пути. Значение пути должно соответствовать значению подпала определить шаблон DIN.spec.volumeMunts.
apiVersion: v1 kind: Service metadata: name: mysql spec: ports: - port: 3306 selector: app: mysql clusterIP: None --- apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2 kind: Deployment metadata: name: mysql spec: selector: matchLabels: app: mysql strategy: type: Recreate template: metadata: labels: app: mysql spec: containers: - image: mysql:5.6 name: mysql env: # Use secret in real usage - name: MYSQL_ROOT_PASSWORD value: password ports: - containerPort: 3306 name: mysql volumeMounts: - name: mysql-configmap-volume mountPath: /etc/mysql/conf.d/binlog_format.cnf subPath: binlog_format.cnf volumes: - name: mysql-configmap-volume configMap: name: mysql-configmap items: - key: mysql_binlog_format.cnf path: binlog_format.cnf
Повторно применить манифесты
#save the above manifests (mysql-configmap.yaml & mysql-deployment.yaml) kubectl apply -f . # Use kubctl exec to list /etc/mysql/conf.d contents kubectl exec mysql-7848ff5588-d4f6p ls /etc/mysql/conf.d # cat contents of binlog_format.cnf kubectl exec mysql-7848ff5588-d4f6p cat /etc/mysql/conf.d/binlog_format.cnf
Недостатки
Подразимы не обновляются автоматически при изменении ConfigMap. Изменения в конфигурации должны быть новым развертыванием, что приведет к воссозданию стручков с обновленным контентом ConfigMap.
Источники
run-single-instance-stateful-application Добавить данные configmap в определенный путь в томе
Оригинал: «https://dev.to/joshduffney/kubernetes-using-configmap-subpaths-to-mount-files-3a1i»