我正在尝试使用 Azure DevOps 设置 CI,并使用 GitOps 为我的 AKS 群集设置 CD。CI 完成后,映像将推送到 Azure 容器注册表。我的问题是我的 yaml 文件中的图像名称是 :latest。当我将映像推送到容器注册表时,Flux CD 无法确定映像是否有任何更改,因为映像的名称保持不变。我试图在 github 中查找问题并提出以下链接: https ://github.com/GoogleCloudPlatform/cloud-builders/issues/22#issuecomment-316181326 但我不知道如何实现它。有人可以帮帮我吗?
2 回答
我们遇到了类似的问题,我们通过使用唯一值生成器将校验和添加到部署文件中的注释中来修复它。它对我们来说是这样的:
生成 Helm 模板 -> 使用唯一校验和创建部署清单 -> 触发部署。
我们在清单中启用了 RollingUpdate,从而消除了应用程序的停机时间。下面是我们的 helm 模板配置。部署.yaml
template:
metadata:
labels:
app: {{ .Values.appName }}
annotations:
checksum/commonconfig: {{ .Values.CommonConfig | toJson | sha256sum | trunc 63 }}
checksum/podconfig: {{ .Values.PodConfig | toJson | sha256sum | trunc 63 }}
我们在 helm 图表中有这个,它将在部署清单中生成唯一值。这将使部署每次都发生,即使图像的最新标签是相同的。此外,始终保持 imagePullPolicy。
从这里的 FluxCD 文档
注意: Flux 仅适用于不可变的图像标签(不支持:latest)。每个图像标记都必须是唯一的,为此您可以在标记图像时使用 Git 提交 SHA 或 semver。
根据时间戳开启自动化:
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
fluxcd.io/automated: "true"
spec:
template:
spec:
containers:
- name: app
image: docker.io/org/my-app:1.0.0
上述配置将使 Flux 在您推送新的图像标签时更新应用容器,无论是 my-app:1.0.1 还是 my-app:9e3bdaf。
使用 sem ver 限制图像更新:
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
fluxcd.io/automated: "true"
fluxcd.io/tag.app: semver:~1.0
spec:
template:
spec:
containers:
- name: app
image: docker.io/org/my-app:1.0.0
当您推送与语义版本表达式匹配的图像标签时,上述配置将使 Flux 更新图像,例如 my-app:1.0.1 但不是 my-app:1.2.0
在 azure DevOps Pipeline docker任务中标记图像时,应使用 Git commit SHA 或 semver
steps:
- task: Docker@2
displayName: Build and Push
inputs:
command: buildAndPush
containerRegistry: dockerRegistryServiceConnection1
repository: contosoRepository
tags: |
tag1
tag2