如何在 Kubernetes 部署中使用动态/可变镜像标签?

Lam*_*bda 12 kubernetes google-kubernetes-engine kustomize

在我们的项目中,也使用 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
Run Code Online (Sandbox Code Playgroud)

然后我们用它sed来替换IMAGE_TAG我们想要部署的镜像版本。

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

ITC*_*hap 12

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

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
Run Code Online (Sandbox Code Playgroud)

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

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

resources:
  - deployment.yaml

images:
  - name: nginx
    newTag: MYNEWTAG
Run Code Online (Sandbox Code Playgroud)

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


evo*_*ics 6

可以使用环境变量中的图像标签,而无需为每个不同的标签编辑文件。如果您的图像标签需要变化而不更改版本控制文件,这非常有用。

\n

标准kubectl足以达到此目的。简而言之,使用configMapGenerator由环境变量填充的数据。然后添加replacements引用此 ConfigMap 数据来替换相关图像标签。

\n

例子

\n

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

\n
apiVersion: kustomize.config.k8s.io/v1beta1\nkind: Kustomization\n\n# Generate a ConfigMap based on the environment variables in the file `.env`.\nconfigMapGenerator:\n  - name: my-config-map\n    envs:\n      - .env\n\nreplacements:\n  - source:\n      # Replace any matches by the value of environment variable `MY_IMAGE_TAG`.\n      kind: ConfigMap\n      name: my-config-map\n      fieldPath: data.MY_IMAGE_TAG\n    targets:\n      - select:\n          # In each Deployment resource \xe2\x80\xa6\n          kind: Deployment\n        fieldPaths:\n          # \xe2\x80\xa6 match the image of container `nginx` \xe2\x80\xa6\n          - spec.template.spec.containers.[name=nginx].image\n        options:\n          # \xe2\x80\xa6 but replace only the second part (image tag) when split by ":".\n          delimiter: ":"\n          index: 1\n\nresources:\n  - deployment.yaml\n
Run Code Online (Sandbox Code Playgroud)\n

在同一文件夹中,您需要一个.env仅包含环境变量名称的文件(注意:仅包含名称,未分配值):

\n
MY_IMAGE_TAG\n
Run Code Online (Sandbox Code Playgroud)\n

现在MY_IMAGE_TAG从本地环境集成为运行时的图像标签kubectl kustomizekubectl apply --kustomize等等。

\n

演示:

\n
MY_IMAGE_TAG=foobar kubectl kustomize .\n
Run Code Online (Sandbox Code Playgroud)\n

这将打印生成的图像标签,这是foobar所需的:

\n
MY_IMAGE_TAG\n
Run Code Online (Sandbox Code Playgroud)\n

备择方案

\n

请记住configMapGenerator文档中的以下内容:

\n
\n

注意:建议谨慎使用本地环境变量填充功能 - 带补丁的覆盖通常更易于维护。当无法轻松预测时,从环境中设置值可能会很有用,例如 git SHA。

\n
\n

如果您只是想在多个文件之间共享固定图像标签,请参阅已经建议的images转换器

\n