如何在 Kubernetes 部署中使用 dynamic/variable 图像标签?

How to use dynamic/variable image tag in a Kubernetes deployment?

在我们也使用 Kustomize 的项目中,我们的基础 deployment.yaml 文件如下所示:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:IMAGE_TAG # <------------------------------
        ports:
        - containerPort: 80

然后我们使用sedIMAGE_TAG替换为我们要部署的镜像版本。

是否有更复杂的方法来执行此操作,而不是使用 sed 编辑文本 yaml 文件?

为此有一个特定的转换器,称为 images transformer。 您可以保持部署不变,有或没有标签:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80

然后在您的自定义文件中:

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

resources:
  - deployment.yaml

images:
  - name: nginx
    newTag: MYNEWTAG

请记住,这将替换您的 kustomization 文件中包含的所有资源的所有 nginx 映像的标签。如果您需要 运行 多个版本的 nginx,您可以用占位符替换部署中的图像名称,并在转换器中使用不同的条目。

可以使用来自环境变量的图像标签,而不必为每个不同的标签编辑文件。如果您的图像标签需要在不更改 version-controlled 个文件的情况下发生变化,这将非常有用。

标准 kubectl 就足够了。简而言之,使用引用此ConfigMap数据的configMapGenerator with data populated from environment variables. Then add replacements替换相关图像标签。

例子

继续您的示例 deployment.yaml,您可能在同一文件夹中有一个 kustomization.yaml 文件,如下所示:

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

# Generate a ConfigMap based on the environment variables in the file `.env`.
configMapGenerator:
  - name: my-config-map
    envs:
      - .env

replacements:
  - source:
      # Replace any matches by the value of environment variable `MY_IMAGE_TAG`.
      kind: ConfigMap
      name: my-config-map
      fieldPath: data.MY_IMAGE_TAG
    targets:
      - select:
          # In each Deployment resource …
          kind: Deployment
        fieldPaths:
          # … match the image of container `nginx` …
          - spec.template.spec.containers.[name=nginx].image
        options:
          # … but replace only the second part (image tag) when split by ":".
          delimiter: ":"
          index: 1

resources:
  - deployment.yaml

在同一个文件夹中,你需要一个文件.env只有环境变量名(注意:只有名字,没有赋值):

MY_IMAGE_TAG

现在本地环境中的 MY_IMAGE_TAG 被集成为 运行 kubectl kustomizekubectl apply --kustomize

时的图像标签

演示:

MY_IMAGE_TAG=foobar kubectl kustomize .

这将打印生成的图像标签,根据需要为 foobar

# …
spec:
  # …
  template:
    # …
    spec:
      containers:
        - image: nginx:foobar
          name: nginx
          ports:
            - containerPort: 80

备选方案

请记住 configMapGenerator documentation 中的以下内容:

Note: It's recommended to use the local environment variable population functionality sparingly - an overlay with a patch is often more maintainable. Setting values from the environment may be useful when they cannot easily be predicted, such as a git SHA.

如果您只是想在多个文件之间共享 固定 图像标签,请参阅已经 .