我想拥有一个Kustomize清单,其中某些属性的值来自某个文件或URI的全部内容。
我该怎么做?
您可以包含远程kustomization.yml文件,但不能包含单个值。如果您确实愿意,可以构建自己的转换器插件,但这并不是真正的Kustomize精神。
通常with kustomize您将要使用的是overlay and patches(一个或多个文件),它们已合并到您的基本文件中。修补程序会覆盖属性。使用这两个功能,您可以预定义一些可能的清单组合,并在将它们应用于集群之前就将它们组合在一起。
您可以添加或编辑/设置某些特定属性with patches或使用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
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 -