如何在 kubernetes yaml 文件中使用标签以便系统知道推送了新图像

How to use tag in kubernetes yaml file so the system knows a new image is pushed

我正在尝试使用 Azure DevOps 和使用 GitOps 的 CD 为我的 AKS 集群设置 CI。 CI 完成后,图像将被推送到 Azure 容器注册表。我的问题是我的 yaml 文件中的图像名称是:最新的。当我将图像推送到容器注册表时,Flux CD 无法确定图像是否有任何更改,因为图像的名称保持不变。我试图在 github 中查找问题并得出以下 link: https://github.com/GoogleCloudPlatform/cloud-builders/issues/22#issuecomment-316181326 但我不知道如何实施它。有人可以帮我吗?

来自 FluxCD 的文档 here

Note: that Flux only works with immutable image tags (:latest is not supported). Every image tag must be unique, for this you can use the Git commit SHA or semver when tagging images.

根据时间戳开启自动化:

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 版本限制图像更新:

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 管道中标记图像时,您应该使用 Git 提交 SHA 或 semver docker task

steps:
- task: Docker@2
  displayName: Build and Push
  inputs:
    command: buildAndPush
    containerRegistry: dockerRegistryServiceConnection1
    repository: contosoRepository
    tags: |
      tag1
      tag2

我们遇到了类似的问题,我们通过使用唯一值生成器将校验和添加到部署文件中的注释来修复它。它对我们来说是这样的:

生成 Helm 模板 -> 使用唯一校验和创建部署清单 -> 触发部署。

我们在清单中启用了 RollingUpdate,从而消除了应用程序的停机时间。下面是我们的 helm 模板配置。 deployment.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 chart 中有这个,它将在部署清单中生成唯一值。这将使每次部署都发生,即使图像的最新标签相同。此外,始终保持 imagePullPolicy。