Kustomize:如何从另一个 resource/overlay 中的 ConfigMap 引用值?
Kustomize: how to reference a value from a ConfigMap in another resource/overlay?
我有几个叠加层(dev、stg、prod)从多个基础中提取数据,其中每个基础包含一个服务,这样每个叠加层都可以选择它需要的服务。我从 dev/stg/prod 目录生成清单。
我的 Kubernetes/Kustomize 目录结构的简化版本如下所示:
├── base
│ ├── ServiceOne
│ │ ├── kustomization.yaml
│ │ └── service_one_config.yaml
│ ├── ServiceTwo
│ │ ├── kustomization.yaml
│ │ └── service_two_config.yaml
│ └── ConfigMap
│ ├── kustomization.yaml
│ └── config_map_constants.yaml
└── overlays
├── dev
│ ├── kustomization.yaml
│ └── dev_patch.yaml
├── stg
│ ├── kustomization.yaml
│ └── stg_patch.yaml
└── prod
├── kustomization.yaml
└── prod_patch.yaml
在 base/ConfigMap 下,config_map_constants.yaml 文件包含 key/value 对非机密:
apiVersion: v1
kind: ConfigMap
metadata:
labels:
app: myApp
name: global-config-map
namespace: myNamespace
data:
aws_region: "us-west"
env_id: "1234"
如果叠加层只需要一个默认值,它应该按原样引用 key/value 对,如果它需要自定义值,我会使用补丁来覆盖该值。
来自 base/ConfigMap 的 kustomization.yaml 看起来像这样并将 ConfigMap 引用为资源:
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- config_map_constants.yaml
问题:如何在叠加层的 yaml 文件中引用“aws_region”以便检索值?
例如,我希望能够在 base/ServiceOne/service_one_config.yaml:
中做这样的事情
apiVersion: v1
kind: Service
metadata:
labels:
app: myApp
aws_region: ../ConfigMap/${aws_region} #pseudo syntax
name: service_one
spec:
env_id: ../ConfigMap/${env_id} #pseudo syntax
我能够构建 ConfigMap 并将其附加到我的服务中,但我正在努力寻找如何在其他资源中引用其内容。
编辑:
Kustomize版本:v4.5.2
您可以尝试使用 https://kubectl.docs.kubernetes.io/references/kustomize/kustomization/replacements/
对于您的场景,如果您想将 aws-region
引用到您的服务标签中。您需要创建一个 replacement
文件。
replacements/region.yaml
source:
kind: ConfigMap
fieldPath: data.aws-region
targets:
- select:
kind: Service
name: service_one
fieldPaths:
- metadata.labels.aws_region
并将其添加到您的 kustomization.yaml
replacements:
- path: replacements/region.yaml
Kustomize 输出应该与此类似
---
apiVersion: v1
kind: Service
metadata:
labels:
app: myApp
aws_region: us-west-1
name: service_one
我有几个叠加层(dev、stg、prod)从多个基础中提取数据,其中每个基础包含一个服务,这样每个叠加层都可以选择它需要的服务。我从 dev/stg/prod 目录生成清单。
我的 Kubernetes/Kustomize 目录结构的简化版本如下所示:
├── base
│ ├── ServiceOne
│ │ ├── kustomization.yaml
│ │ └── service_one_config.yaml
│ ├── ServiceTwo
│ │ ├── kustomization.yaml
│ │ └── service_two_config.yaml
│ └── ConfigMap
│ ├── kustomization.yaml
│ └── config_map_constants.yaml
└── overlays
├── dev
│ ├── kustomization.yaml
│ └── dev_patch.yaml
├── stg
│ ├── kustomization.yaml
│ └── stg_patch.yaml
└── prod
├── kustomization.yaml
└── prod_patch.yaml
在 base/ConfigMap 下,config_map_constants.yaml 文件包含 key/value 对非机密:
apiVersion: v1
kind: ConfigMap
metadata:
labels:
app: myApp
name: global-config-map
namespace: myNamespace
data:
aws_region: "us-west"
env_id: "1234"
如果叠加层只需要一个默认值,它应该按原样引用 key/value 对,如果它需要自定义值,我会使用补丁来覆盖该值。
来自 base/ConfigMap 的kustomization.yaml 看起来像这样并将 ConfigMap 引用为资源:
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- config_map_constants.yaml
问题:如何在叠加层的 yaml 文件中引用“aws_region”以便检索值?
例如,我希望能够在 base/ServiceOne/service_one_config.yaml:
中做这样的事情apiVersion: v1
kind: Service
metadata:
labels:
app: myApp
aws_region: ../ConfigMap/${aws_region} #pseudo syntax
name: service_one
spec:
env_id: ../ConfigMap/${env_id} #pseudo syntax
我能够构建 ConfigMap 并将其附加到我的服务中,但我正在努力寻找如何在其他资源中引用其内容。
编辑: Kustomize版本:v4.5.2
您可以尝试使用 https://kubectl.docs.kubernetes.io/references/kustomize/kustomization/replacements/
对于您的场景,如果您想将 aws-region
引用到您的服务标签中。您需要创建一个 replacement
文件。
replacements/region.yaml
source:
kind: ConfigMap
fieldPath: data.aws-region
targets:
- select:
kind: Service
name: service_one
fieldPaths:
- metadata.labels.aws_region
并将其添加到您的 kustomization.yaml
replacements:
- path: replacements/region.yaml
Kustomize 输出应该与此类似
---
apiVersion: v1
kind: Service
metadata:
labels:
app: myApp
aws_region: us-west-1
name: service_one