我有一个由四个容器组成的本地Docker设置:一个烧瓶web应用程序、MySQL、Redis和一个RQ工作人员。
该设置基本上是相同的米格尔格林伯格的酒瓶超级教程。以下是他的教程和代码的链接。
在我的例子中,唯一的不同是,我已经替换了他的导出博客文章功能,它运行在replaced上,而另一个功能计算量大,运行时间长(30分钟)。
--我把这个应用程序部署到生产中的最好方法是什么?
我只希望一到两个人一次访问它,并且他们每周只访问一到两次。
我一直在研究Kubernetes的例子,但是我很难将它们转换到我的设置中,并弄清楚如何部署到GCP。我愿意接受其他的部署方案。
下面是教程中的docker运行命令:
docker run --name redis -d -p 6379:6379 redis:3-alpine
docker run --name mysql -d -e MYSQL_RANDOM_ROOT_PASSWORD=yes \
-e MYSQL_DATABASE=flaskapp -e MYSQL_USER=flaskapp \
-e MYSQL_PASSWORD=mysqlpassword \
mysql/mysql-server:5.7docker run --name rq-worker -d --rm -e SECRET_KEY=my-secret-key \
-e MAIL_SERVER=smtp.googlemail.com -e MAIL_PORT=587 -e MAIL_USE_TLS=true \
-e MAIL_USERNAME=example@gmail.com -e MAIL_PASSWORD=mysqlpassword \
--link mysql:dbserver --link redis:redis-server \
-e DATABASE_URL=mysql+pymysql://flaskapp:mypassword@dbserver/flaskapp \
-e REDIS_URL=redis://redis-server:6379/0 \
--entrypoint venv/bin/rq \
flaskapp:latest worker -u redis://redis-server:6379/0 dyson-tasksdocker run --name flaskapp -d -p 8000:5000 --rm -e SECRET_KEY=my_secret_key \
-e MAIL_SERVER=smtp.googlemail.com -e MAIL_PORT=587 -e MAIL_USE_TLS=true \
-e MAIL_USERNAME=example@gmail.com -e MAIL_PASSWORD=mypassword \
--link mysql:dbserver --link redis:redis-server \
-e DATABASE_URL=mysql+pymysql://flaskapp:mysqlpassword@dbserver/flaskapp \
-e REDIS_URL=redis://redis-server:6379/0 \
flaskapp:latest 发布于 2020-01-05 17:36:47
既然你用Kubernetes和Google平台来标记这个问题,我想这就是你想要的方向。
在部署到云平台时,考虑使用云就绪存储/数据库解决方案。单节点MySQL不是一个现成的云端存储。考虑使用例如Google Cloud SQL。
您的“烧瓶web应用程序”可以完美地部署为部署到Google Kubernetes引擎 -但这要求您的应用程序是无状态的,并遵循十二因素应用原则。
您的Redis也可以部署到Kubernetes,但是您需要考虑您的可用性需求有多重要。如果你不想考虑这个问题,你也可以使用Google,例如谷歌记忆 --一种为Redis提供的完全管理的内存数据存储服务。
如果您决定使用一个完全管理的缓存,您可以使用谷歌云运行将您的“烧瓶web应用程序”部署为一个容器--这是一个比完整的Kubernetes集群更受管理的解决方案,但也更加有限。但好的想法是你只为请求付费。
发布于 2020-07-23 23:06:11
我为GCP/GKE上的rq做了一个入门项目,这个项目应该大致符合你的需求。https://github.com/crispyDyne/GKE-rq
它由三个工作负载组成:
一个google内存存储实例用于redis服务器。如果你想以便宜的价格来做这件事,这应该被替换成一个运行redis的容器(但是我很懒)。
如何创建内存存储redis实例:https://cloud.google.com/memorystore/docs/redis/quickstart-gcloud
此外,我使用节点端口来公开领导人应用程序,而不是负载均衡器。负载平衡器是惊人的昂贵。对于小型/廉价项目,节点端口应该可以正常工作。
对于一个新手(像我)来说,有几个不明显的步骤可以让所有的事情都说出来。
如何将“领导者”连接到redis队列.
从GCP控制台或gcloud redis instances describe ...获取redis。
在你的烧瓶应用程序中:
redis_conn = Redis(host={redisIP}, port=6379, db=0)
q = Queue('rq-server', connection=redis_conn)如何将"Folower“连接到redis队列.
DockerFile:
FROM python:3
COPY . /app
WORKDIR /app
RUN pip install --no-cache-dir -r requirements.txt
ENV PORT 6379
CMD [ "rq", "worker","--url", "redis://{redisIP}:6379", "rq-server" ]如何将“仪表板”连接到redis队列.
DockerFile:
FROM python:3
COPY . /app
WORKDIR /app
RUN pip install --no-cache-dir -r requirements.txt
ENV PORT 9181
CMD [ "rq-dashboard","-u", "redis://{redisIP}:6379"]如何通过节点端口(或类似于仪表板)公开领导者。
注意目标端口。一个烧瓶应用程序应该是8080,rq仪表板应该是9181。
kubectl expose deployment rq-leader --name rq-leader-service /
--type NodePort --port 80 --target-port 8080然后打开{NodePort}。获取GCP控制台或kubectl get services ...上的节点端口。
gcloud compute firewall-rules create node-port-leader--allow tcp:{NodePort}https://stackoverflow.com/questions/59602285
复制相似问题