Skip to content

kustomize

kustomize 有以下配置选项:

  • namePrefix 是附加到 kustomize 应用程序资源的前缀 * nameSuffix 是附加到 kustomize 应用程序资源的后缀 * images 是 Kustomize 镜像覆盖列表 * replicas 是 Kustomize 复制覆盖列表 * commonLabels 是附加标签的字符串映射 * forceCommonLabels 是一个布尔值,用于定义是否允许覆盖现有标签 * commonAnnotations 是附加注释的字符串映射 * namespace 是一个 Kubernetes 资源名称空间 * forceCommonAnnotations 是一个布尔值,用于定义是否允许覆盖现有注释 * namespace 是一个 Kubernetes 资源名称空间 * namespace 是一个 Kubernetes 资源名称空间。namespace是一个 Kubernetes 资源命名空间 *forceCommonAnnotations是一个布尔值,用于定义是否允许覆盖现有注释 *commonAnnotationsEnvsubst是一个布尔值,用于在注释值中启用环境变量替换 *patches是一个支持内联更新的 Kustomize 补丁列表 *components` 是一个 Kustomize 组件列表

要将 kustomize 与覆盖层一起使用,请将路径指向覆盖层。

提示 如果您正在生成资源,您应该阅读如何使用忽略无关内容

补丁

补丁是在 Argo CD 应用程序中使用内联配置对资源进行自定义的一种方式。patches任何针对现有 kustomization 文件的补丁都将被合并。

这个 kustomize 示例从/kustomize-guestbook文件夹中的argoproj/argocd-example-apps资源库,并修补Deployment被引用到端口443容器上。

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
metadata:
  name: kustomize-inline-example
namespace: test1
resources:
  - https://raw.githubusercontent.com/argoproj/argocd-example-apps/master/kustomize-guestbook/
patches:
  - target:
      kind: Deployment
      name: guestbook-ui
    patch: |-
      - op: replace
        path: /spec/template/spec/containers/0/ports/0/containerPort
        value: 443

Application被引用时,会产生等效的kustomize.patches配置。

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: kustomize-inline-guestbook
  namespace: argocd
  finalizers:
    - resources-finalizer.argocd.argoproj.io
spec:
  destination:
    namespace: test1
    server: https://kubernetes.default.svc
  project: default
  source:
    path: kustomize-guestbook
    repoURL: https://github.com/argoproj/argocd-example-apps.git
    targetRevision: master
    kustomize:
      patches:
        - target:
            kind: Deployment
            name: guestbook-ui
          patch: |-
            - op: replace
              path: /spec/template/spec/containers/0/ports/0/containerPort
              value: 443

内嵌式 kustomize 补丁可以很好地与`ApplicationSets'现在,无需为每个集群维护一个修补程序或覆盖程序,而可以在`Application'例如,使用外部-dns以设置txt-Owner-id到集群名称。

apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
  name: external-dns
spec:
  goTemplate: true
  goTemplateOptions: ["missingkey=error"]
  generators:
  - clusters: {}
  template:
    metadata:
      name: 'external-dns'
    spec:
      project: default
      source:
        repoURL: https://github.com/kubernetes-sigs/external-dns/
        targetRevision: v0.14.0
        path: kustomize
        kustomize:
          patches:
          - target:
              kind: Deployment
              name: external-dns
            patch: |-
              - op: add
                path: /spec/template/spec/containers/0/args/3
                value: --txt-owner-id={{.name}}   # patch using attribute from generator
      destination:
        name: 'in-cluster'
        namespace: default

组件

kustomize部件它们提供了在 Kubernetes 应用程序中模块化和重复使用配置的强大方法。

在 Argo CD 之外,要使用组件,必须将以下内容添加到kustomization.yaml例如

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
...
components:
- ../component

增加了对v2.10.0现在,您可以在应用程序中直接引用组件:

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: application-kustomize-components
spec:
  ...
  source:
    path: examples/application-kustomize-components/base
    repoURL: https://github.com/my-user/my-repo
    targetRevision: main

    # This!
    kustomize:
      components:
        - ../component  # relative to the kustomization.yaml (`source.path`).

私人远程基地

如果你的远程基地是 (a) HTTPS,需要用户名/密码 (b) SSH,需要 SSH 私钥,那么它们将从应用程序的 repo 中继承用户名/密码。

如果远程基地使用相同的凭据/私钥,这将起作用。 如果它们使用不同的凭据/私钥,这将不起作用。 出于安全原因,您的应用程序只知道自己的 repo(不包括其他团队或用户的 repo),因此即使 Argo CD 知道其他私有 repo,您也无法访问它们。

了解更多私有库

kustomize build 选项/参数

为以下人员提供选项构建kustomize build的默认 kustomize 版本,使用kustomize.buildOptions领域argocd-cm配置地图。 被引用kustomize.buildOptions.<version>来注册特定版本的构建选项。

apiVersion: v1
kind: ConfigMap
metadata:
  name: argocd-cm
  namespace: argocd
  labels:
    app.kubernetes.io/name: argocd-cm
    app.kubernetes.io/part-of: argocd
data:
    kustomize.buildOptions: --load-restrictor LoadRestrictionsNone
    kustomize.buildOptions.v4.4.0: --output /tmp

修改后kustomize.buildOptions您可能需要重新启动 ArgoCD 才能使更改生效。

kustomize 定制版本

Argo CD 支持同时使用多个 kustomize 版本,并为每个应用程序指定了所需版本。 要添加其他版本,请确保所需的版本是捆绑然后被引用kustomize.path.<version>领域argocd-cmConfigMap 用于注册捆绑的附加版本。

apiVersion: v1
kind: ConfigMap
metadata:
  name: argocd-cm
  namespace: argocd
  labels:
    app.kubernetes.io/name: argocd-cm
    app.kubernetes.io/part-of: argocd
data:
    kustomize.path.v3.5.1: /custom-tools/kustomize_3_5_1
    kustomize.path.v3.5.4: /custom-tools/kustomize_3_5_4

一旦配置了新版本,就可以在应用程序规范中引用它,如下所示:

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: guestbook
spec:
  source:
    repoURL: https://github.com/argoproj/argocd-example-apps.git
    targetRevision: HEAD
    path: kustomize-guestbook

    kustomize:
      version: v3.5.4

此外,还可使用 "应用程序 "详细信息 "页面的 "参数 "选项卡或以下 CLI 命令配置应用程序的 kustomize 版本: kustomize

argocd app set <appName> --kustomize-version v3.5.4

构建环境

kustomize 应用程序可以访问标准构建环境可与被引用的配置管理插件来改变已呈现的清单。

您可以在 Argo CD 应用程序清单中被引用这些构建环境变量。 您可以通过设置.spec.source.kustomize.commonAnnotationsEnvsubsttrue在应用程序清单中。

例如,以下应用程序清单将设置app-source注释的应用程序名称:

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: guestbook-app
  namespace: argocd
spec:
  project: default
  destination:
    namespace: demo
    server: https://kubernetes.default.svc
  source:
    path: kustomize-guestbook
    repoURL: https://github.com/argoproj/argocd-example-apps
    targetRevision: HEAD
    kustomize:
      commonAnnotationsEnvsubst: true
      commonAnnotations:
        app-source: ${ARGOCD_APP_NAME}
  syncPolicy:
    syncOptions:
      - CreateNamespace=true

kustomize helm charts

可以使用 Kustomize 渲染 Helm 图表这样做需要通过--enable-helm标志到kustomize build该标记不属于 Argo CD 中的 Kustomize 选项。 如果您想在 Argo CD 应用程序中通过 Kustomize 渲染 Helm 图表,您有两个选择:您可以创建一个自定义插件或修改argocd-cmConfigMap 包括--enable-helm标志,适用于所有 kustomize 应用程序: kustomize

apiVersion: v1
kind: ConfigMap
metadata:
  name: argocd-cm
  namespace: argocd
data:
  kustomize.buildOptions: --enable-helm

设置清单的 namespace

spec.destination.namespace字段只在 Kustomize 生成的清单中缺少名称空间时才会添加该名称空间。 它还会引用kubectl来设置名称空间,有时会漏掉某些资源(例如自定义资源)中的 namespace 字段。 在这种情况下,可能会出现类似下面的错误:ClusterRoleBinding.rbac.authorization.k8s.io "example" is invalid: subjects[0].namespace: Required value.

直接被引用来设置缺失的 namespace 可以解决这个问题。 设置spec.source.kustomize.namespace指示 kustomize 将 namespace 字段设置为给定值。

如果spec.destination.namespacespec.source.kustomize.namespace同时设置,Argo CD 将遵从后者,即 Kustomize 设置的名称空间值。