Настройка доступа к базам данных из Kubernetes: Руководство для начинающих

На список статей
Blog image

Защитите свои сайты с My-Sites-Guard.com!
Сервис обеспечивает надежную защиту ваших веб-ресурсов: мониторинг доступности сайта, контроль валидности сертификатов, а также возможность собирать и анализировать логи работы сервера. My-Sites-Guard.com — всё для сохранности вашего сайта и спокойствия в работе!

Введение

Kubernetes (K8s) — это мощная платформа для управления контейнерами, которая автоматизирует развертывание, масштабирование и управление приложениями. Однако для работы многих приложений требуется взаимодействие с базами данных, которые могут находиться как внутри кластера Kubernetes, так и вне его. Настройка доступа к базам данных — это один из ключевых этапов, который должен быть выполнен корректно для успешной работы приложений.

В данной статье мы рассмотрим основы настройки доступа к базам данных из Kubernetes, включая создание конфигурационных файлов, управление секретами и защиту сетевого взаимодействия между контейнерами и базами данных.

Основные понятия

Прежде чем углубиться в детали настройки, важно понимать основные понятия:

  1. Pod — это основная единица развертывания в Kubernetes, представляющая собой один или несколько контейнеров.
  2. Service — объект, который предоставляет способ доступа к одному или нескольким Pod внутри кластера.
  3. ConfigMap — объект, используемый для хранения конфигурационных данных в формате ключ-значение, таких как строки подключения.
  4. Secret — объект, аналогичный ConfigMap, но предназначенный для хранения конфиденциальных данных, таких как пароли.
  5. PersistentVolume (PV) и PersistentVolumeClaim (PVC) — объекты, используемые для работы с постоянным хранилищем данных.
Подходы к подключению базы данных

Есть два основных сценария подключения базы данных к Kubernetes:

  1. База данных развернута внутри кластера Kubernetes — в этом случае база данных запускается в виде Pod с настроенным хранилищем (например, через PersistentVolume). Приложение обращается к ней, используя сервисы Kubernetes.
  2. База данных находится за пределами кластера Kubernetes — база данных может быть развернута на внешнем сервере или в облачной инфраструктуре. В этом случае приложение должно подключаться к внешнему ресурсу, используя корректные строки подключения.

Мы рассмотрим оба сценария, начиная с наиболее распространенного — подключения к внешней базе данных.

Шаг 1: Настройка секретов и конфигураций для подключения

Первым шагом к настройке доступа к базе данных является создание необходимых секретов и конфигураций. Строка подключения к базе данных обычно включает такие компоненты, как:

  • Хост базы данных
  • Порт
  • Имя пользователя
  • Пароль
  • Имя базы данных

Для безопасного хранения конфиденциальной информации, такой как пароли, следует использовать объект Secret.

Пример создания секрета для базы данных MySQL:

apiVersion: v1
kind: Secret
metadata:
 name: db-secret
type: Opaque
data:
 username: YWRtaW4=  # admin (base64 encoded)
 password: cGFzc3dvcmQ=  # password (base64 encoded)

Создаем этот секрет в кластере:

kubectl apply -f db-secret.yaml

Затем создадим объект ConfigMap, который будет хранить строку подключения и другие параметры:

apiVersion: v1
kind: ConfigMap
metadata:
 name: db-config
data:
 database_url: jdbc:mysql://mysql-server:3306/mydatabase

Здесь mysql-server — это хост базы данных, который может быть как внешним сервером, так и сервисом внутри кластера.

Применяем ConfigMap:

kubectl apply -f db-config.yaml
Шаг 2: Обновление деплоймента для подключения к базе данных

Следующий шаг — использование конфигурации и секретов в контейнере приложения. Предположим, у нас есть приложение, которое должно подключиться к базе данных MySQL. Для этого мы добавим к манифесту деплоймента подгрузку переменных окружения из ConfigMap и Secret.

Пример манифеста деплоймента:

apiVersion: apps/v1
kind: Deployment
metadata:
 name: app-deployment
spec:
 replicas: 1
 selector:
   matchLabels:
     app: myapp
 template:
   metadata:
     labels:
       app: myapp
   spec:
     containers:
     - name: myapp
       image: myapp:latest
       ports:
       - containerPort: 8080
       env:
       - name: DB_URL
         valueFrom:
           configMapKeyRef:
             name: db-config
             key: database_url
       - name: DB_USERNAME
         valueFrom:
           secretKeyRef:
             name: db-secret
             key: username
       - name: DB_PASSWORD
         valueFrom:
           secretKeyRef:
             name: db-secret
             key: password

В этом примере приложение получает строку подключения из ConfigMap, а имя пользователя и пароль — из Secret. Это безопасный и удобный способ управления конфиденциальными данными.

Шаг 3: Настройка сетевого доступа

Если база данных развернута вне кластера Kubernetes, важно убедиться, что приложение имеет сетевой доступ к базе данных. Для этого могут потребоваться следующие действия:

  1. Открытие сетевых портов на базе данных для доступа с внешнего адреса.
  2. Настройка правил доступа в брандмауэре для разрешения подключений с IP-адресов узлов кластера Kubernetes.
  3. Использование DNS или IP-адреса базы данных в строке подключения, если база данных располагается за пределами кластера.

Для обеспечения доступа к внешней базе данных из Kubernetes можно использовать либо IP-адрес, либо DNS-имя в строке подключения. В случае динамических IP, рекомендуется использовать DNS, который позволит справляться с изменениями адресов.

Пример подключения к внешней базе данных с использованием DNS:

data:
 database_url: jdbc:mysql://external-db.example.com:3306/mydatabase
Шаг 4: Подключение к базе данных внутри кластера

Когда база данных развернута внутри самого кластера Kubernetes, вам потребуется создать сервис, который обеспечит доступ к базе данных через стабильный DNS.

  1. Создаем деплоймент базы данных MySQL с PersistentVolume:
apiVersion: apps/v1
kind: Deployment
metadata:
 name: mysql
spec:
 selector:
   matchLabels:
     app: mysql
 template:
   metadata:
     labels:
       app: mysql
   spec:
     containers:
     - name: mysql
       image: mysql:5.7
       env:
       - name: MYSQL_ROOT_PASSWORD
         valueFrom:
           secretKeyRef:
             name: mysql-secret
             key: root-password
       volumeMounts:
       - name: mysql-persistent-storage
         mountPath: /var/lib/mysql
     volumes:
     - name: mysql-persistent-storage
       persistentVolumeClaim:
         claimName: mysql-pvc
  1. Создаем PersistentVolume и PersistentVolumeClaim:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
 name: mysql-pvc
spec:
 accessModes:
   - ReadWriteOnce
 resources:
   requests:
     storage: 1Gi
  1. Определяем сервис для доступа к MySQL:
apiVersion: v1
kind: Service
metadata:
 name: mysql-service
spec:
 selector:
   app: mysql
 ports:
   - protocol: TCP
     port: 3306
     targetPort: 3306

После этого приложение может подключаться к базе данных внутри кластера, используя сервис mysql-service в качестве хоста:

data:
 database_url: jdbc:mysql://mysql-service:3306/mydatabase
Шаг 5: Обеспечение безопасности

Настройка безопасного подключения к базе данных включает в себя несколько ключевых моментов:

  1. Использование TLS — если база данных поддерживает шифрование через TLS, рекомендуется настроить его, чтобы защитить данные при передаче. Это особенно важно для внешних баз данных.
  2. Ограничение доступа через сетевые политики — в Kubernetes можно использовать NetworkPolicies, чтобы ограничить доступ между Pod, позволяя только нужным Pod подключаться к базе данных. Пример:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
 name: db-access-policy
spec:
 podSelector:
   matchLabels:
     app: myapp
 policyTypes:
 - Ingress
 ingress:
 - from:
   - podSelector:
       matchLabels:
         app: myapp
   ports:
   - protocol: TCP
     port: 3306

Эта политика разрешает доступ к Pod базы данных только с Pod приложения.


Аутентификация и авторизация — используйте безопасные методы аутентификации (например, секреты) и убедитесь, что пользователи базы данных имеют минимально необходимые права.


Заключение

Настройка доступа к базам данных из Kubernetes — это важный этап в развертывании приложений. Важно учитывать как внутренние, так и внешние базы данных, а также применять принципы безопасности, такие как управление секретами, использование TLS и сетевых политик

.

Следуя шагам из данного руководства, вы сможете настроить безопасное и стабильное подключение вашего приложения к базе данных, обеспечивая его корректную работу в среде Kubernetes.

Комментарии

Пока нет комментариев

Добавить комментарий