结合 GKE 和 Kustomize 在 Github Actions 中使用不同的环境
Use different environments in Github Actions in combination with GKE and Kustomize
我从 Google 的 Github 操作模板开始部署到 GKE。一切都按预期工作,现在我想为不同的环境扩展功能(即主分支上的推送进入生产,开发分支上的推送应该部署到阶段)。
在模板中,这应该在作业的最后部分:
# Deploy the Docker image to the GKE cluster
- name: Deploy
run: |-
./kustomize edit set image gcr.io/PROJECT_ID/IMAGE:TAG=gcr.io/$PROJECT_ID/$IMAGE:$GITHUB_SHA
./kustomize build . | kubectl apply -f -
kubectl rollout status deployment/$DEPLOYMENT_NAME
kubectl get services -o wide
我将 kustomize build
行更改为:
kubectl kustomize kubernetes/overlays/stage | kubectl apply -f -
这是因为我的 kustomize 文件文件夹结构如下所示:
+---kubernetes
| +---base
| | deployment.yml
| | kustomization.yml
| | service.yml
| |
| \---overlays
| +---prod
| | deployment.yml
| | kustomization.yml
| | service.yml
| |
| \---stage
| deployment.yml
| kustomization.yml
| service.yml
并且一开始所有的deplyoment.yml
和service.yml
仍然和我添加环境结构之前一样,只有覆盖层中的kustomization.yml改为:
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
bases:
- ../../base
patchesStrategicMerge:
- deployment.yml
- service.yml
当我现在 运行 Github 操作工作流部署失败并出现错误:
Error: Missing kustomization file 'kustomization.yaml'.
当使用本地 kubectl 命令时,它会生成所需环境的合并输出:
kubectl kustomize kubernetes/overlays/stage
我需要在根目录中包含所有资源的另一个文件名 kustomization.yaml
:
resources:
- ./kubernetes/overlays/stage
- ./kubernetes/overlays/prod
这样就可以了。
我们最终没有直接为此使用 kustomize,因为 kustomize edit set
没有将路径作为参数或选项。
相反,我们将图像细节手动回显到 base/kustomization.yaml 中。
echo "images:\n - name: eu.gcr.io/project-id/image\n newName: eu.gcr.io/$PROJECT_ID/$IMAGE\n newTag: \"$GITHUB_SHA\""
>> ./deployment/base/kustomization.yaml
我们只在 base/deployment.yaml 中设置图像信息 (eu.gcr.io/project-id/image),并在叠加层中省略设置图像
然后可以 运行 例如kubectl kustomize ./kubernetes/overlays/prod
或使用 kubectl apply -k ./kubernetes/overlays/prod
直接应用于集群
我从 Google 的 Github 操作模板开始部署到 GKE。一切都按预期工作,现在我想为不同的环境扩展功能(即主分支上的推送进入生产,开发分支上的推送应该部署到阶段)。
在模板中,这应该在作业的最后部分:
# Deploy the Docker image to the GKE cluster
- name: Deploy
run: |-
./kustomize edit set image gcr.io/PROJECT_ID/IMAGE:TAG=gcr.io/$PROJECT_ID/$IMAGE:$GITHUB_SHA
./kustomize build . | kubectl apply -f -
kubectl rollout status deployment/$DEPLOYMENT_NAME
kubectl get services -o wide
我将 kustomize build
行更改为:
kubectl kustomize kubernetes/overlays/stage | kubectl apply -f -
这是因为我的 kustomize 文件文件夹结构如下所示:
+---kubernetes
| +---base
| | deployment.yml
| | kustomization.yml
| | service.yml
| |
| \---overlays
| +---prod
| | deployment.yml
| | kustomization.yml
| | service.yml
| |
| \---stage
| deployment.yml
| kustomization.yml
| service.yml
并且一开始所有的deplyoment.yml
和service.yml
仍然和我添加环境结构之前一样,只有覆盖层中的kustomization.yml改为:
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
bases:
- ../../base
patchesStrategicMerge:
- deployment.yml
- service.yml
当我现在 运行 Github 操作工作流部署失败并出现错误:
Error: Missing kustomization file 'kustomization.yaml'.
当使用本地 kubectl 命令时,它会生成所需环境的合并输出:
kubectl kustomize kubernetes/overlays/stage
我需要在根目录中包含所有资源的另一个文件名 kustomization.yaml
:
resources:
- ./kubernetes/overlays/stage
- ./kubernetes/overlays/prod
这样就可以了。
我们最终没有直接为此使用 kustomize,因为 kustomize edit set
没有将路径作为参数或选项。
相反,我们将图像细节手动回显到 base/kustomization.yaml 中。
echo "images:\n - name: eu.gcr.io/project-id/image\n newName: eu.gcr.io/$PROJECT_ID/$IMAGE\n newTag: \"$GITHUB_SHA\""
>> ./deployment/base/kustomization.yaml
我们只在 base/deployment.yaml 中设置图像信息 (eu.gcr.io/project-id/image),并在叠加层中省略设置图像
然后可以 运行 例如kubectl kustomize ./kubernetes/overlays/prod
或使用 kubectl apply -k ./kubernetes/overlays/prod