1

我想要一个 Kustomize 清单,其中某些属性的值来自某个文件或 URI 的全部内容。

我怎样才能做到这一点?

4

2 回答 2

2

通常使用 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 -
于 2019-11-06T08:25:30.630 回答
1

您可以包含远程 kustomization.yml 文件,但不能包含单个值。如果你真的想要,你可以构建自己的转换器插件,但这并不符合 Kustomize 的精神。

于 2019-11-06T02:59:55.013 回答