【发布时间】:2021-08-20 19:50:18
【问题描述】:
我有一个 Github 仓库,上面有 2 个分支,develop 和 main。第一个是“测试”环境,另一个是“生产”环境。我正在使用 Google Kubernetes Engine,我已经从 Github 上的推送到 GKE 上的部署进行了自动化部署。所以我们的工作流程是:
- 拉
develop - 在本地编写代码和测试
- 当本地一切正常时,推送
develop(它将自动部署到 GKE 工作负载app_name_develop) - 对
app_name_develop的QA 测试 - 如果 QA 测试通过,我们会创建一个拉取请求,将
develop放入main - 在 GKE 工作负载
app_name_production上自动部署(来自main分支)
容器的部署在Dockerfile中定义,Kubernetes部署在kubernetes/app.yaml中定义。这两个文件在 repo 中使用 Git 进行跟踪。
这里的问题是,当我们创建一个拉取请求将develop 放入main 时,它还将app.yaml 和Dockerfile 这两个文件从develop 带到main。我们最终得到了来自develop 的main 中的设置,它把整个事情搞砸了。
我无法在这些文件中定义环境变量,因为它可能会出现在错误的分支中。 我的问题是:如何从拉取请求中排除这些文件?或者有什么方法可以管理多个环境,而无需在每次拉取请求后手动修改文件?
我不知道它是否可以 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,这是一个很好的用例,可以使用
skaffold和kustomize来管理多个开发环境。 The demo here 对管理多个环境进行了更全面的讨论(其中包括关于 kustomize 的部分) -
你用什么来实际部署?部署是如何触发的?
标签: git docker kubernetes google-cloud-platform google-kubernetes-engine