如何向 pod 公开镜像名称以使用版本标签?Kubernetes

如何向 pod 公开镜像名称以使用版本标签?Kubernetes

有没有一种简单的方法可以将容器镜像名称或标签用作 ENV 变量,以便我可以使用它来提供 pod 中的镜像名称和标签(用于版本信息)。我是新用户。这个想法是为了解决我对 kustomization.yaml 如何从 config-map.yaml 中获取“变量”的缺乏了解

目前,我设置了一个环境变量,将其放入 kustomization.yaml 中,然后我使用该值两次:一次用于更改图像名称,一次用于制作配置图。

实际目标是只输入一次这条信息,并以这两种方式使用它。如果镜像名称可通过环境提供给容器,这是一种方法,因为我不需要将字符串注入配置映射来填充容器环境;我可以从镜像元数据中推断出它,因此在 kustomize 中的镜像名称替换中只输入一次该值。这将满足我的目标,虽然它不是一个通用的解决方案,但它是一种解决方法,具体涉及假设镜像名称元数据在容器中免费可用。但这是不可能的。

因此,另一种方法是模板化 kustomization.yaml,这就是我所做的:这是我目前的解决方法。kustomize 的理念是不使用模板。但是,避免重复输入关键文字对我来说是更重要的。

在每个“站点”文件夹中,我都有类似这样的内容:

file: kustomization_pre_subst.yaml



resources:
  - site-namespace.yaml
  - site-config-map.yaml
  - site-secret.yaml
  - site-ingress.yaml
  - ../base
namespace: test


images:
  - name: django_api_sync-image
    newName: "...dkr.ecr.aws.com/django_api_sync:image_prefix-${version}"

configMapGenerator:
- name: version-configmap
  literals:
  - django_api_sync_version="${version}"

所以我有一个仅包含版本字符串的配置映射。在基础文件中,这用作环境的一部分。

...来自容器规范的片段:

  envFrom:
    - configMapRef:
        name: site-configmap
    - configMapRef:
        name: common-configmap
    - configMapRef:
        name: version-configmap
    - secretRef:
        name: common-secret
    - secretRef:
        name: site-secret

这是迄今为止我能理解的最简单的解决方案,它让我定义一次版本字符串,并让它选择我想要的图像,然后将其传递给环境中的容器。

我希望的是,我可以在 site-configmap 中逐字定义它,然后使用它来提供正确的图像名称,也就是说,使用 site-configmap 作为 kustomization.yaml 的源,而不必像这样注入它。

kustomization.yaml 的伪代码片段展示了它如何从 config-map 获取数据(而不是注入到 config map 中),例如:

images:
  - name: django_api_sync-image
    newName: "...dkr.ecr.aws.com/django_api_sync:image_prefix-${version}"
    env:
        source-from: site-configmap
        name: version
        key: version

重点在于版本只需定义一次。然而,即使这样,它也不会像执行 envsubst 那么好。

我肯定遗漏了一些东西。

答案1

据我所知,kustomize 认为replacements:是该过程的未来,我刚刚用下面的例子尝试了一下,“它在我的计算机上运行”(kubectl kustomize .使用 v1.25.3)

在这种情况下,我去了Pod 的image: 出去因为ConfigMapkustomize 擅长分解事物(即从存储库中分离标签),但将它们连接起来似乎需要做很多工作。就像软件中的所有事物一样,可能有几种方法可以实现这一点,每种方法都有自己的权衡

鉴于

# configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: version-configmap
data:
  something-else: showing that we can append keys
# pod.yaml <-- just using it to make the example less verbose
apiVersion: v1
kind: Pod
metadata:
  name: the-pod
spec:
  containers:
  - image: example.com:3.14.15
    name: the-container
# kustomization.yaml
namespace: test
resources:
  - configmap.yaml
  - pod.yaml
replacements:
- source:
    kind: Pod
    name: the-pod
    fieldPath: spec.containers.0.image
    options:
      delimiter: ":"
      index: 1
  targets:
  - select:
      kind: ConfigMap
      name: version-configmap
    fieldPaths:
      - data.django_api_sync_version
    options:
      create: true

生产

apiVersion: v1
data:
  django_api_sync_version: 3.14.15
  something-else: showing that we can append keys
kind: ConfigMap
metadata:
  name: version-configmap
  namespace: test
---
apiVersion: v1
kind: Pod
metadata:
  name: the-pod
  namespace: test
spec:
  containers:
  - image: example.com:3.14.15
    name: the-container

相关内容