【问题标题】:Manage environments with Github and Google Kubernetes Engine使用 Github 和 Google Kubernetes Engine 管理环境
【发布时间】:2021-08-20 19:50:18
【问题描述】:

我有一个 Github 仓库,上面有 2 个分支,developmain。第一个是“测试”环境,另一个是“生产”环境。我正在使用 Google Kubernetes Engine,我已经从 Github 上的推送到 GKE 上的部署进行了自动化部署。所以我们的工作流程是:

  1. develop
  2. 在本地编写代码和测试
  3. 当本地一切正常时,推送 develop(它将自动部署到 GKE 工作负载 app_name_develop
  4. app_name_develop 的QA 测试
  5. 如果 QA 测试通过,我们会创建一个拉取请求,将 develop 放入 main
  6. 在 GKE 工作负载 app_name_production 上自动部署(来自 main 分支)

容器的部署在Dockerfile中定义,Kubernetes部署在kubernetes/app.yaml中定义。这两个文件在 repo 中使用 Git 进行跟踪。

这里的问题是,当我们创建一个拉取请求将develop 放入main 时,它还将app.yamlDockerfile 这两个文件从develop 带到main。我们最终得到了来自developmain 中的设置,它把整个事情搞砸了。

我无法在这些文件中定义环境变量,因为它可能会出现在错误的分支中。 我的问题是:如何从拉取请求中排除这些文件?或者有什么方法可以管理多个环境,而无需在每次拉取请求后手动修改文件?

我不知道它是否可以 hlphere 是我的 Dockerfile :

FROM python:3.8

RUN apt-get update && apt-get install -y --no-install-recommends

RUN python -m pip install --upgrade pip

WORKDIR /app/

COPY requirements.txt .
RUN python -m pip install -r requirements.txt

COPY . .

EXPOSE 8080
CMD ["gunicorn", "-b", ":8080", "main:app"]

这是我要在 GKE 上部署的 YAML 文件(实际上我在创建自动部署时采用了 GKE 建议的文件):

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: app_name-api
  name: app_name-api
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: app_name-api
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      labels:
        app: app_name-api
    spec:
      containers:
        - image: gcr.io/path_to_image/github.com/company_name/app_name
          imagePullPolicy: IfNotPresent
          name: app_name-1
---
apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
  labels:
    app: app_name-api
  name: app_name-api-pod-autoscaler
  namespace: default
spec:
  maxReplicas: 3
  metrics:
    - resource:
        name: cpu
        targetAverageUtilization: 80
      type: Resource
  minReplicas: 1
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: app_name-api

非常感谢您提供的任何帮助!

【问题讨论】:

  • 你好@Agudolive,这是一个很好的用例,可以使用skaffoldkustomize 来管理多个开发环境。 The demo here 对管理多个环境进行了更全面的讨论(其中包括关于 kustomize 的部分)
  • 你用什么来实际部署?部署是如何触发的?

标签: git docker kubernetes google-cloud-platform google-kubernetes-engine


【解决方案1】:

您不能有选择地忽略拉取请求中的某些文件。但是有两种简单的解决方法:

第一 -
从‘develop’创建一个新分支

替换'main'中不需要的文件

从这个新分支创建拉取请求

第二 -
从'main'创建一个新分支

从“开发”中放置所需文件的更改

从这个新分支创建拉取请求

这些方法中的任何一种都可以。哪个更容易取决于要包含/排除多少文件。

示例:
以 main 为目标,以 dev 为源

root 
|-- src 
| -- app.py 
|-- .gitignore 
|-- settings.py 
|-- requirements.txt

假设,我想忽略 settings.py 文件的合并 首先移动到目标分支(要合并更改的分支)

git checkout main

然后你可以使用 git checkout 命令选择性地选择你想要合并的文件

git checkout dev src/

这只会合并 src/ 文件夹内更改的文件

NOTE: You can also do it selectively for each file. 

然后推送到远程仓库

git push origin main

请记住,此解决方案仅在要排除的文件很小时才有用。

注意:“有一些工具可以解决这个问题,比如 skaffold 和 kustomize,但是在一切正常之前,它们可能需要一些时间和重组你的存储库。所以,与此同时,这是一个简单的解决方案,需要手动工作,但可以在您学习并决定哪种更先进的仪器适合时进行。”

【讨论】:

  • 感谢您的回复,确实,我想避免对集群和 repos 进行太多更改,我想我会按照您的方式进行。
猜你喜欢
  • 2022-07-31
  • 2021-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-19
  • 1970-01-01
  • 2019-01-16
相关资源
最近更新 更多