Skip to main content
版本:v1.7

Kustomize Schema Generator

kruise-api为openkruise的功能提供了工具,用于生成支持openkruise CRD的kustomize schema文件,并提供了当前可用的OpenAPI schema

Schema Generator

在使用kustomize管理应用时,为了在使用openkruise资源时能够使用strategic merge patches (SMPs)来处理资源定义中的环境变量或任何数组类型字段,需要openkruise CRD的OpenAPI schema中包含指定的patch strategySchema Generator支持了根据openkruise的资源定义快速生成kustomize schema文件的功能。kustomize schema文件生成的具体方式可以查看README.md

Schema Usage

How to specify the schema file

kruise-api中提供了可用的OpenAPI schema文件, 你可以直接使用最新版本或指定版本的OpenAPI schema文件,只需在kustomization.yaml中添加如下配置块:

使用最新版本

openapi:
path: https://raw.githubusercontent.com/openkruise/kruise-api/master/schema/openkruise_all_k8s_kustomize_schema.json

使用指定版本

openapi:
path: https://raw.githubusercontent.com/openkruise/kruise-api/raw/<tag>/schema/openkruise_all_k8s_kustomize_schema.json

或者你可以下载kruise-api到本地,并在配置块中指定本地文件路径即可:

openapi:
path: <kruise-api-local-path>/schema/openkruise_all_k8s_kustomize_schema.json

Example

下面以sidecarset为例,介绍如何在kustomize中使用kustomize OpenAPI schema来支持openkruise CRD的合并策略。

一个sidecarset的完整定义如下所示:

apiVersion: apps.kruise.io/v1alpha1
kind: SidecarSet
metadata:
name: test-sidecarset
spec:
selector:
matchLabels:
app: nginx
updateStrategy:
type: RollingUpdate
maxUnavailable: 1
containers:
- name: sidecar1
image: centos:6.7
command: ["sleep", "999d"]
volumeMounts:
- name: log-volume1
mountPath: /var/log
- name: sidecar2
image: centos:6.8
command: ["sleep", "999d"]
volumeMounts:
- name: log-volume2
mountPath: /var/log
volumes:
- name: log-volume1
emptyDir: {}
- name: log-volume2
emptyDir: {}

当前存在两个容器,分别为 sidecar1sidecar2,它们分别挂载了两个名为log-volume1log-volume2的卷。 现在希望添加一个新的容器sidecar3,并挂载一个新增的名为 log-volume3 的卷,同时将 sidecar1 以及对应 volume 删除,然后对一些其他字段做简单修改。那么可以编写如下的采用合并策略的kustomization.yaml文件:

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

resources:
- sidecarset.yaml

openapi:
path: https://raw.githubusercontent.com/openkruise/kruise-api/master/schema/openkruise_all_k8s_kustomize_schema.json

patchesStrategicMerge:
- |-
apiVersion: apps.kruise.io/v1alpha1
kind: SidecarSet
metadata:
name: test-sidecarset
spec:
containers:
- name: sidecar1
$patch: delete
- name: sidecar2
volumeMounts:
- name: log-volume3
mountPath: /var/log3
- name: sidecar3
image: centos:6.9
command: ["sleep", "102d"]
volumeMounts:
- name: log-volume3
mountPath: /var/log
volumes:
- name: log-volume1
$patch: delete
- name: log-volume3
emptyDir: {}

这里主要额外添加了openapi字段并指定了自定义 OpenAPI schema 文件的路径,此时kustomize在patch时会根据OpenAPI schema文件中的 x-kubernetes-patch-* 键来决定不同字段的合并策略。 在执行命令 kustomize build . 后,可以得到如下结果:

apiVersion: apps.kruise.io/v1alpha1
kind: SidecarSet
metadata:
name: test-sidecarset
spec:
containers:
- command:
- sleep
- 999d
image: centos:6.8
name: sidecar2
volumeMounts:
- mountPath: /var/log3
name: log-volume3
- mountPath: /var/log
name: log-volume2
- command:
- sleep
- 102d
image: centos:6.9
name: sidecar3
volumeMounts:
- mountPath: /var/log
name: log-volume3
selector:
matchLabels:
app: nginx
updateStrategy:
maxUnavailable: 1
type: RollingUpdate
volumes:
- emptyDir: {}
name: log-volume3
- emptyDir: {}
name: log-volume2

其他常用的openkruise crd合并策略的使用案例可以参考这里