如何将应用程序 (flask-python + redis) docker push 到 gcr.io 并将应用程序部署到 google kubernetes 构建映像并将其发送到 GCR在 GKE 中使用新建的镜像

问题描述

如何将我的应用(使用 python-flask + redis)推送到 gcr.io 并部署到 google kubernetes(通过 yaml 文件)? 我想为我的应用设置 env 变量

import os
import redis

from flask import Flask
from flask import request,redirect,render_template,url_for
from flask import Response

app = Flask(__name__)
redis_host = os.environ['REdis_HOST']
app.redis = redis.StrictRedis(host=redis_host,port=6379,charset="utf-8",decode_responses=True)

# Be super aggressive about saving for the development environment.
# This says save every second if there is at least 1 change.  If you use
# redis in production you'll want to read up on the redis persistence
# model.
app.redis.config_set('save','1 1')

@app.route('/',methods=['GET','POST'])
def main_page():
    if request.method == 'POST':
        app.redis.lpush('entries',request.form['entry'])        
        return redirect(url_for('main_page'))
    else:
        entries = app.redis.lrange('entries',-1)
        return render_template('main.html',entries=entries)

#Router my app by post and redirect to mainpage
@app.route('/clear',methods=['POST'])
def clear_entries():
    app.redis.ltrim('entries',1,0)
    return redirect(url_for('main_page'))

#use for docker on localhost
if __name__ == "__main__":
  app.run(host='0.0.0.0',port=5000)

解决方法

将此答案作为社区 wiki 发布,以便为问题设置更多基线方法,而不是针对问题中包含的代码提供具体的解决方案。

随意编辑/扩展。


考虑到它可以通过许多不同的方式(如问题中所述,使用 Cloud Build 等)来解决这一事实,该主题可能相当广泛。

专门针对以下方面解决这个问题:

  • 构建映像并将其发送到 GCR
  • GKE 中使用新建的映像。

构建映像并将其发送到 GCR

假设您的代码和整个 Docker 映像正确运行,您可以按以下方式构建/标记它,然后将其发送到 GCR

  • gcloud auth configure-docker

将 Docker credHelper 条目添加到 Docker 的 配置文件,如果文件不存在,则创建该文件。这会 将 gcloud 注册为所有 Google 支持的凭据帮助程序 Docker 注册表。

  • docker tag YOUR_IMAGE gcr.io/PROJECT_ID/IMAGE_NAME
  • docker push gcr.io/PROJECT_ID/IMAGE_NAME

之后你可以去:

  • GCP Cloud Console(网络用户界面)-> Container Registry

并查看您上传的图片。


在 GKE 中使用新建的镜像

要运行前面提到的图像,您可以:

  • Deployment 中创建 Cloud Console (Kubernetes Engine -> Workloads -> Deploy)

附注!

您还可以在其中添加您选择的环境变量(如问题中所述)

  • 使用与以下类似的 YAML 清单创建它:
apiVersion: apps/v1
kind: Deployment
metadata:
  name: amazing-app
  labels:
    app: amazing-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: amazing-app
  template:
    metadata:
      labels:
        app: amazing-app
    spec:
      containers:
      - name: amazing-app
        image: gcr.io/PROJECT-ID/IMAGE-NAME # <-- IMPORTANT!
        env:
        - name: DEMO_GREETING
          value: "Hello from the environment"

请具体看以下部分:

        env:
        - name: DEMO_GREETING
          value: "Hello from the environment"

这部分将在每个容器内创建一个环境变量:

  • $ kubectl exec -it amazing-app-6db8d7478b-4gtxk -- /bin/bash -c 'echo $DEMO_GREETING'
Hello from the environment

其他资源: