Секрет контейнера Kubernetes не распознается приложением как переменная env, когда приложение запускается, что приводит Python

Программы на Python
Anonymous
Секрет контейнера Kubernetes не распознается приложением как переменная env, когда приложение запускается, что приводит

Сообщение Anonymous »

У меня возникла проблема с развертыванием моего приложения в кластере Kubernetes в Digital Ocean, и я ни в коем случае не могу понять, как решить эту проблему.
Я создаю API-интерфейс Python Flask с Celery, использующий CloudamQP для обработки задач для моих маршрутов API. Все это работает хорошо, но проблема связана с переменными окружения. На моей локальной машине все работает хорошо. Когда я развертываю свое приложение в кластере Kubernetes, контейнеры (один для flask-api, а другой для api-worker) не запускаются из-за того, что оба контейнера не могут читать переменные env. Я использовал подход с файлом секретов из документации kubernetes:
kubernetes обрабатывает секреты
файл env.yaml:

Код: Выделить всё

apiVersion: v1
kind: Secret
metadata:
name: my-secret
namespace: backend
type: Opaque
data:
APP_PORT: 
JWT_KEY: 
CLOUDAMQP_URL: 
Файл deployment.yaml:

Код: Выделить всё

apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
namespace: backend
spec:
replicas: 1
selector:
matchLabels:
app: api-server
template:
metadata:
labels:
app: api-server
spec:
containers:
- name: api-server
image: my-api:latest
resources:
requests:
cpu: "200m"
memory: "300Mi"
limits:
cpu: "300m"
memory: "600Mi"
envFrom:
- secretRef:
name: my-secret
ports:
- containerPort: 5000

- name: api-worker
image: api-worker:latest
resources:
requests:
cpu: "200m"
memory: "300Mi"
limits:
cpu: "300m"
memory: "600Mi"
envFrom:
- secretRef:
name: my-secret

---
apiVersion: v1
kind: Service
metadata:
name: api-server
namespace: backend
spec:
selector:
app: api-server
ports:
- protocol: TCP
port: 80
targetPort: 5000
Когда я развертываю Kubernetes с помощью команд kubectl, мои контейнеры терпят неудачу, потому что код не может распознать переменную env.
ex:

Код: Выделить всё

from celery import Celery
import os

def create_celery_app():
broker_url = os.environ['CLOUDAMQP_URL']
celery = Celery('tasks', broker=broker_url, backend='rpc://')
celery.conf.broker_connection_retry_on_startup = True
return celery

celery = create_celery_app()
Проблема определенно связана с переменной env (в данном случае CLOUDAMQP_URL. Она существует в моем файле секретов, и я проверил, отображаются ли значения. Когда я жестко запрограммировал значения в приведенном выше коде , приложение работает отлично при развертывании в моем кластере. Я думаю, что проблема связана с тем, что приложение запускается до того, как установлены переменные env (но я мог ошибаться, но мне удалось напечатать переменную env на маршруте API, но это не так). это после того, как приложение полностью заработало и работает. Кажется, что приложение не работает при запуске, поэтому, например, если указанная выше функция была в файле main.py и приложение запускается, оно выходит из строя. У кого-нибудь есть решение для этой проблемы или с чем-то сталкивался. похоже? Я проверил оболочки контейнера (когда приложение не дает сбой) и вижу переменные env со значениями, которые я ввел туда в файл env.yaml, и они точны.

Подробнее здесь: https://stackoverflow.com/questions/765 ... -app-start

Вернуться в «Python»