Приложения, развернутые в кластерах Kubernetes, часто требуют подключения к базам данных или внешним сервисам. Однако чувствительные данные, например логины, пароли или ключи API, не следует хранить в открытом виде в манифестах. Защищенное хранение таких данных — одна из ключевых задач обеспечения безопасности приложений.
С помощью этого руководства вы научитесь подключать Flask-приложение к PostgreSQL с использованием встроенных в Kubernetes секретов для хранения логина и пароля от базы данных PostgreSQL в сервисе Managed Kubernetes на платформе Cloud.ru Evolution.
Вы будете использовать следующие сервисы:
-
Виртуальные машины — сервис, в рамках которого предоставляется виртуальная машина.
-
Managed Kubernetes — сервис управления кластерами Kubernetes на вычислительных ресурсах облака.
-
Artifact Registry для хранения, совместного использования и управления Docker-образами и Helm-чартами.
-
sNAT-шлюзы — сервис управления сетевыми шлюзами облака.
-
kubectl — инструмент командной строки, позволяющий запускать команды для кластеров Kubernetes.
-
Docker — система контейнеризации.
Шаги:
Перед началом работы
-
Если вы уже зарегистрированы, войдите под своей учетной записью.
-
Убедитесь, что у вас достаточно прав для создания реестра и загрузки артефактов в сервисе Artifact Registry.
1. Разверните необходимые ресурсы в облаке
-
Создайте виртуальную машину в той же зоне доступности, что и кластер.
В сетевых настройках ВМ выберите параметр Подсеть с публичным IP.
С виртуальной машины вы будете подключаться к кластеру Managed Kubernetes.
-
Выполните подключение к кластеру Managed Kubernetes с ВМ:
-
На ВМ установите kubectl и cloudlogin.
-
Проверьте подключение:
kubectl get nodesЕсли отобразится список узлов, подключение настроено.
-
Создайте sNAT-шлюз в той же зоне доступности, что и кластер.
Он понадобится для работы с внешними образами, например postgres.
2. Создайте секрет и базу данных PostgreSQL
Этот шаг выполняется на виртуальной машине, с которой выполнено подключение к созданному кластеру Managed Kubernetes.
-
Создайте секрет, содержащий логин и пароль для PostgreSQL:
kubectl create secret generic pg-secret \--from-literal=POSTGRES_USER=demo \--from-literal=POSTGRES_PASSWORD=supersecretЭтот секрет будет использоваться как самой базой данных, так и приложением-клиентом для подключения.
Результат:
secret/pg-secret created -
Создайте файл postgres-deployment.yaml:
apiVersion: apps/v1kind: Deploymentmetadata:name: postgresspec:replicas: 1selector:matchLabels:app: postgrestemplate:metadata:labels:app: postgresspec:containers:- name: postgresimage: postgres:15env:- name: POSTGRES_USERvalueFrom:secretKeyRef:name: pg-secretkey: POSTGRES_USER- name: POSTGRES_PASSWORDvalueFrom:secretKeyRef:name: pg-secretkey: POSTGRES_PASSWORDports:- containerPort: 5432---apiVersion: v1kind: Servicemetadata:name: postgresspec:selector:app: postgresports:- port: 5432targetPort: 5432clusterIP: "" -
Примените манифест:
kubectl apply -f postgres-deployment.yamlРезультат:
deployment.apps/postgres createdservice/postgres created
3. Соберите и загрузите образ приложения в Artifact Registry Cloud.ru
На этом шаге вы создадите Docker-образ Flask-приложения, которое подключается к PostgreSQL, и загрузите его в Artifact Registry Cloud.ru. Использование собственного образа в Artifact Registry гарантирует, что приложение будет работать с нужными зависимостями и будет доступно для вашего кластера без внешних зависимостей.
Если вы хотите пропустить сборку, можете перейти к шагу 4 и использовать тестовый образ kollekcioner47/secretapp из Docker Hub. Однако в рамках этого практического руководства рекомендуется использовать свой образ в Artifact Registry, так как это целевой сценарий для продакшн-развертывания.
Если вы загрузите в реестр случайный или неполный образ без описанных ниже настроек Dockerfile, приложение не запустится, так как в нем не будут установлены необходимые библиотеки, например Flask, psycopg2-binary и другие.
-
Подготовьте приложение. На отдельной виртуальной машине с установленным Docker создайте файл app.py:
import osimport psycopg2from flask import Flaskapp = Flask(__name__)@app.route("/")def index():conn = psycopg2.connect(dbname="postgres",user=os.getenv("POSTGRES_USER"),password=os.getenv("POSTGRES_PASSWORD"),host="postgres",port="5432")cur = conn.cursor()cur.execute("SELECT version();")result = cur.fetchone()cur.close()conn.close()return f"Connected to PostgreSQL: {result}"if __name__ == "__main__":app.run(host="0.0.0.0", port=5000) -
Создайте Dockerfile:
FROM python:3.10-slimWORKDIR /appCOPY app.py .RUN apt-get update && apt-get install -y gcc libpq-dev && \pip install flask psycopg2-binary && \apt-get cleanCMD ["python", "app.py"] -
Подготовьте среду для сборки образа приложения и его загрузки в Artifact Registry. Для этого выполните шаги 2–6 инструкции.
-
Соберите и загрузите образ:
docker build -t <your-registry-uri>/secretapp:latest .docker push <your-registry-uri>/secretapp:latestГде <your-registry-uri> — URI реестра из сервиса Artifact Registry.
4. Разверните Flask-приложение в Managed Kubernetes
На этом шаге вы развернете приложение, которое подключается к PostgreSQL с использованием Kubernetes Secret.
Если вы выполнили шаг 3, используйте образ из своего Artifact Registry. Если вы пропустили шаг 3, укажите тестовый образ kollekcioner47/secretapp из Docker Hub. Работоспособность образа в этом случае не гарантируется при измененных настройках.
-
Создайте файл app-deployment.yaml:
apiVersion: apps/v1kind: Deploymentmetadata:name: pg-clientspec:replicas: 1selector:matchLabels:app: pg-clienttemplate:metadata:labels:app: pg-clientspec:containers:- name: pg-clientimage: <your-registry-uri>/secretapp:latest # basic scenario# image: kollekcioner47/secretapp # alternative scenarioenv:- name: POSTGRES_USERvalueFrom:secretKeyRef:name: pg-secretkey: POSTGRES_USER- name: POSTGRES_PASSWORDvalueFrom:secretKeyRef:name: pg-secretkey: POSTGRES_PASSWORDports:- containerPort: 5000---apiVersion: v1kind: Servicemetadata:name: pg-client-servicespec:selector:app: pg-clientports:- port: 80targetPort: 5000type: LoadBalancer -
Примените манифест:
kubectl apply -f app-deployment.yamlРезультат:
deployment.apps/pg-client createdservice/pg-client-service created
5. Проверьте результат
Убедитесь, что приложение работает корректно.
-
Получите внешний IP:
kubectl get svc pg-client-service -
Перейдите по адресу http://<external-ip> в браузере. Если все настроено верно, в веб-интерфейсе отобразится текст с версией PostgreSQL, например:
Connected to PostgreSQL: ('PostgreSQL 15.14 (Debian 15.14-1.pgdg13+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 14.2.0-19) 14.2.0, 64-bit',)Это означает, что Flask-приложение развернуто в Kubernetes и успешно подключено к базе данных: приложение выполняет SQL-запрос SELECT VERSION(), получает из PostgreSQL строку с номером версии и отображает ее на странице.
Таким образом, вы развернули контейнерное Flask-приложение в Kubernetes и использовали Secret для безопасного хранения логина и пароля к базе данных.
Результат
Вы научились:
-
Использовать Kubernetes Secrets для безопасного хранения логинов и паролей.
-
Разворачивать базу данных PostgreSQL в Kubernetes.
-
Собирать и использовать готовое Flask-приложение, читающее из базы данных.
-
Подключать приложение к базе данных с помощью переменных среды из Secret.
-
Использовать Service типа LoadBalancer для доступа к приложению.
Этот подход можно использовать в реальных проектах при развертывании микросервисов и работе с конфиденциальными данными.
- Перед началом работы
- 1. Разверните необходимые ресурсы в облаке
- 2. Создайте секрет и базу данных PostgreSQL
- 3. Соберите и загрузите образ приложения в Artifact Registry Cloud.ru
- 4. Разверните Flask-приложение в Managed Kubernetes
- 5. Проверьте результат
- Результат