有没有一种简单的方法可以将容器镜像名称或标签用作 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:
出去因为ConfigMap
kustomize 擅长分解事物(即从存储库中分离标签),但将它们连接起来似乎需要做很多工作。就像软件中的所有事物一样,可能有几种方法可以实现这一点,每种方法都有自己的权衡
鉴于
# 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