我想要一个 Kustomize 清单,其中某些属性的值来自某个文件或 URI 的全部内容。
我怎样才能做到这一点?
通常使用 kustomize您将使用的是叠加层和补丁(这是一个或多个文件),它们会合并到您的基本文件中。补丁会覆盖一个属性。使用这两个功能,您可以预定义一些可能的清单组合,并在将它们应用到集群之前将它们组合起来。
您可以使用补丁或 kustomize 子命令添加或编辑/设置一些特定属性,如下所示:
kustomize edit set image your-registry.com:$image_tag
# just to identify version in metadata sections for service/deployment/pods - not just via image tag
kustomize edit add annotation appVersion:$image_tag
kustomize build . | kubectl -n ${your_ns} apply -f -
但是如果你想拥有一个清单文件并一遍又一遍地(即时)操作相同的属性,你应该考虑使用helm 的模板机制。如果 kustomize 不允许您编辑要更改的单个特定属性,这也是一个选项。
您只需要一个values.yaml文件(包含键/值对)和一个template.yaml文件。您可以在values.yaml中预先设置一些属性- 您可以根据需要在每个 CLI 中覆盖它们。该工具将为您生成一个包含这些值的 k8s 清单。
模板文件:
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: {{ .Values.appSettings.appName }}
namespace: {{ .Values.appSettings.namespace }}
labels:
name: {{ .Values.appSettings.appName }}
spec:
replicas: 1
template:
metadata:
labels:
name: {{ .Values.appSettings.appName }}
spec:
containers:
- name: {{ .Values.appSettings.appName }}
image: "{{ .Values.appSettings.image }}"
ports:
- containerPort: 8080
[...]
---
apiVersion: v1
kind: Service
metadata:
name: {{ .Values.appSettings.appName }}-svc
namespace: {{ .Values.appSettings.namespace }}
labels:
name: {{ .Values.appSettings.appName }}
spec:
ports:
- port: 8080
targetPort: 8080
selector:
name: {{ .Values.appSettings.appName }}
值文件:
appSettings:
appName: your-fancy-app
appDomain: please_override_via_cli
namespace: please_override_via_cli
命令行:
helm template
--set appSettings.image=your-registry.com/service:$(cat versionTag.txt)
--set appSettings.namespace=your-ns
--set appSettings.appDomain=your-domain.com
./ -f ./values.yaml | kubectl apply -f -
您可以包含远程 kustomization.yml 文件,但不能包含单个值。如果你真的想要,你可以构建自己的转换器插件,但这并不符合 Kustomize 的精神。