kubernetes 有没有办法让kustomize将文件的内容合并到yaml文件中?

vq8itlhq  于 2023-03-01  发布在  Kubernetes
关注(0)|答案(2)|浏览(136)

我很想知道是否有一种方法可以使用Kustomize替换或其他操作来将非yaml文件的内容注入到使用Kustomize的yaml文件中。我知道Kustomize不是一个模板引擎,这可以通过Helm来完成,但使用我已经在使用的工具,这可能吗?
我的用例是将OPA策略存储为本地rego,这允许使用OPA单元测试,并在Kustomize部署期间将这些rego文件的内容注入到Gatekeeper约束中。这将消除自定义管道处理或手动复制/粘贴来完成此操作的需求。
opaRule.rego文件示例

package k8sdisallowedtags

violation[{"msg": msg}] {
    container := input_containers[_]
    tags := [forbid | tag = input.parameters.tags[_] ; forbid = endswith(container.image, concat(":", ["", tag]))]
    any(tags)
    msg := sprintf("container <%v> uses a disallowed tag <%v>; disallowed tags are %v", [container.name, container.image, input.parameters.tags])
}
...

示例约束模板.yaml文件

apiVersion: templates.gatekeeper.sh/v1beta1
kind: ConstraintTemplate
metadata:
  name: k8sdisallowedtags
  namespace: kube-system
  annotations:
    description: Requires container images to have an image tag different
      from the ones in a specified list.
spec:
  crd:
    spec:
      names:
        kind: K8sDisallowedTags
      validation:
        openAPIV3Schema:
          properties:
            tags:
              type: array
              items:
                type: string
  targets:
    - target: admission.k8s.gatekeeper.sh
      rego: |-
        {CONTENT OF OPA RULE POLICY HERE}
acruukt9

acruukt91#

答案包含两部分:

  • 关于如何解决所提问题的想法(因为没有内置功能可供使用+与第二部分集成)
  • 使用补丁(对社区中的其他人可能有用)

创建自己的插件

Kustomize允许创建插件来扩展它的功能。并且几乎没有限制,包括安全性-这应该由插件的作者来处理。
有两种插件:

  • 执行
  • 执行插件

所有可用信息均可在Extending Kustomize - documentation中找到。
exec插件示例。**注意!**正确的标志是--enable-alpha-plugins(使用-,而不是示例中的_)。

使用补丁

补丁(也称为覆盖)添加或覆盖资源上的字段。它们使用补丁自定义字段提供。
修补程序字段包含要按指定顺序应用的修补程序列表。
每个贴片可以:

  • 可以是战略合并补丁,也可以是JSON6902补丁
  • 可以是文件,也可以是内联字符串目标
  • 单个资源或多个资源

Reference to kustomize - patches
下面是如何修补gatekeeper.yaml对象的示例。
结构:
$树

.
├── gatekeeper.yaml
├── kustomization.yaml
└── opa-gk.yaml

$cat看门人. yaml

apiVersion: templates.gatekeeper.sh/v1beta1
kind: ConstraintTemplate
metadata:
  name: k8sdisallowedtags
  namespace: kube-system
  annotations:
    description: Requires container images to have an image tag different
      from the ones in a specified list.
spec:
  crd:
    spec:
      names:
        kind: K8sDisallowedTags
      validation:
        openAPIV3Schema:
          properties:
            tags:
              type: array
              items:
                type: string
  targets:
    - target: admission.k8s.gatekeeper.sh
      rego: |-
        {CONTENT OF OPA RULE POLICY HERE}

$cat自定义. yaml

resources:
- gatekeeper.yaml

patches:
- path: opa-gk.yaml
  target:
    group: templates.gatekeeper.sh
    version: v1beta1
    kind: ConstraintTemplate
    name: k8sdisallowedtags

$cat opa-gk. yaml

- op: add
  path: /spec/targets/0/rego
  value: |
    package k8sdisallowedtags
    
    violation[{"msg": msg}] {
        container := input_containers[_]
        tags := [forbid | tag = input.parameters.tags[_] ; forbid = endswith(container.image, concat(":", ["", tag]))]
        any(tags)
        msg := sprintf("container <%v> uses a disallowed tag <%v>; disallowed tags are %v", [container.name, container.image, input.parameters.tags])
    }
    ...
    • 最终结果:**

$kubectl定制。

apiVersion: templates.gatekeeper.sh/v1beta1
kind: ConstraintTemplate
metadata:
  annotations:
    description: Requires container images to have an image tag different from the
      ones in a specified list.
  name: k8sdisallowedtags
  namespace: kube-system
spec:
  crd:
    spec:
      names:
        kind: K8sDisallowedTags
      validation:
        openAPIV3Schema:
          properties:
            tags:
              items:
                type: string
              type: array
  targets:
  - rego: |
      package k8sdisallowedtags

      violation[{"msg": msg}] {
          container := input_containers[_]
          tags := [forbid | tag = input.parameters.tags[_] ; forbid = endswith(container.image, concat(":", ["", tag]))]
          any(tags)
          msg := sprintf("container <%v> uses a disallowed tag <%v>; disallowed tags are %v", [container.name, container.image, input.parameters.tags])
      }
      ...
    target: admission.k8s.gatekeeper.sh

有用链接:

disho6za

disho6za2#

你可以使用yaml-include-transformer-一个为YAML文件实现include指令的YAML处理器。它可以作为一个独立的实用程序,也可以作为Kustomize的插件。它允许使用如下指令将文件作为文本字段包括进来

some_key_name!textfile:  somefile.ext

下面是一个例子:
$cat看门人. yaml

apiVersion: templates.gatekeeper.sh/v1beta1
kind: ConstraintTemplate
metadata:
  name: k8sdisallowedtags
  namespace: kube-system
  annotations:
    description: Requires container images to have an image tag different
      from the ones in a specified list.
spec:
  crd:
    spec:
      names:
        kind: K8sDisallowedTags
      validation:
        openAPIV3Schema:
          properties:
            tags:
              type: array
              items:
                type: string
  targets:
    - target: admission.k8s.gatekeeper.sh
      rego!textfile: opaRule.rego

运行yaml处理器:

yaml-include-transformer < examples.yaml

输出:

apiVersion: templates.gatekeeper.sh/v1beta1
kind: ConstraintTemplate
metadata:
  annotations:
    description: Requires container images to have an image tag different from the ones in a specified list.
  name: k8sdisallowedtags
  namespace: kube-system
spec:
  crd:
    spec:
      names:
        kind: K8sDisallowedTags
      validation:
        openAPIV3Schema:
          properties:
            tags:
              items:
                type: string
              type: array
  targets:
    - rego: |
        package k8sdisallowedtags

        violation[{"msg": msg}] {
            container := input_containers[_]
            tags := [forbid | tag = input.parameters.tags[_] ; forbid = endswith(container.image, concat(":", ["", tag]))]
            any(tags)
            msg := sprintf("container <%v> uses a disallowed tag <%v>; disallowed tags are %v", [container.name, container.image, input.parameters.tags])
        }
      target: admission.k8s.gatekeeper.sh

要将此工具用作Kustomize插件,您需要创建一个插件配置文件,并将其作为转换器添加到kustomization.yaml文件中,如下所示:

transformers:
  - include-plugin.yaml

kustomize支持的插件有几种类型,安装和配置yaml-include-transformer作为插件的确切方式取决于您选择使用的插件类型。yaml-include-transformer可以自行安装并为不同的插件类型生成配置文件。
例如,要将其配置为遗留exec插件,您需要生成配置文件:

yaml-include-transformer --plugin-conf -legacy > include-plugin.yaml

并安装插件的插件二进制:

$ yaml-include-transformer --install --legacy --exec
Installing kustomize exec plugin /home/username/.config/kustomize/plugin/kustomize-utils.dudinea.org/v1/yamlincludetransformer
copy '/home/username/go/bin/yaml-include-transformer' to '/home/username/.config/kustomize/plugin/kustomize-utils.dudinea.org/v1/yamlincludetransformer/YamlIncludeTransformer'
/home/username/go/bin/yaml-include-transformer: Kustomize exec plugin Installation complete

现在您可以运行build:

kustomize build --enable-alpha-plugins

相关问题