Рубрики
Uncategorized

Kubernetes — Использование подборов ConfigMap для монтажа файлов

Что если вы хотите установить файл конфигурации из ConfigMap, но не хотите установить его как Vol … Помечено кувнями, DevOps, томами, подлинами.

Что если вы хотите установить файл конфигурации из 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»