一个常见的项目 kustomize 项目布局如上所示,可以看到每个环境文件夹里面都有一个 kustomization.yaml 文件,这个文件里面就类似配置文件,里面指定源文件以及对应的一些转换文件,例如 patch 等
kustomization.yml一个常见的 kustomization.yml 如下所示,一般包含 apiVsersion 和 kind 两个固定字段
apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization resources: - manager.yaml configMapGenerator: - files: - controller_manager_config.yaml name: manager-configkustomize 提供了比较丰富的字段选择,除此之外还可以自定义插件,下面会大概列举一下每个字段的含义,当我们需要用到的时候知道有这么个能力,然后再去 Kustomize 官方文档 (https://kubectl.docs.kubernetes.io/zh/guides/) 查找对应的 API 文档就行了
resources: 表示 k8s 资源的位置,这个可以是一个文件,也可以指向一个文件夹,读取的时候会按照顺序读取,路径可以是相对路径也可以是绝对路径,如果是相对路径那么就是相对于 kustomization.yml的路径
crds: 和 resources 类似,只是 crds 是我们自定义的资源
namespace: 为所有资源添加 namespace
images: 修改镜像的名称、tag 或 image digest ,而无需使用 patches
replicas: 修改资源副本数
namePrefix: 为所有资源和引用的名称添加前缀
nameSuffix: 为所有资源和引用的名称添加后缀
patches: 在资源上添加或覆盖字段,Kustomization 使用 patches 字段来提供该功能。
patchesJson6902: 列表中的每个条目都应可以解析为 kubernetes 对象和将应用于该对象的 JSON patch。
patchesStrategicMerge: 使用 strategic merge patch 标准 Patch resources.
vars: 类似指定变量
commonAnnotations: 为所有资源加上 annotations 如果对应的 key 已经存在值,这个值将会被覆盖
commonAnnotations: app.lailin.xyz/inject: agent resources: - deploy.yamlcommonLabels: 为所有资源的加上 label 和 label selector 注意:这个操作会比较危险
apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization commonLabels: app: bingoconfigMapGenerator 可以生成 config map,列表中的每一条都会生成一个 configmap
secretGenerator 用于生成 secret 资源
generatorOptions 用于控制 configMapGenerator 和 secretGenerator 的行为
CRDCRD:自定义资源定义,Kubernetes 中的资源类型。
CR:Custom Resource,对使用 CRD 创建出来的自定义资源的统称
CRD 是用来扩展 Kubernetes 最常用的方式,在 Service Mesh 和 Operator 中也被大量使用。因此如果想在 Kubernetes 上做扩展和开发的话,是十分有必要了解 CRD 的。
官方文档:https://kubernetes.io/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definitions/
创建 CRD(CustomResourceDefinition)创建新的 CustomResourceDefinition(CRD)时,Kubernetes API Server 会为您指定的每个版本创建新的 RESTful 资源路径。CRD 可以是命名空间的,也可以是集群范围的,可以在 CRD scope 字段中所指定。与现有的内置对象一样,删除命名空间会删除该命名空间中的所有自定义对象。CustomResourceDefinition 本身是非命名空间的,可供所有命名空间使用。
参考下面的 CRD,将其配置保存在 resourcedefinition.yaml 文件中:
apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: # 名称必须符合下面的格式:<plural>.<group> name: crontabs.stable.example.com spec: # REST API使用的组名称:/apis/<group>/<version> group: stable.example.com # REST API使用的版本号:/apis/<group>/<version> versions: - name: v1 # 可以通过 served 来开关每个 version served: true # 有且仅有一个 version 开启存储 storage: true schema: openAPIV3Schema: type: object properties: spec: type: object properties: cronSpec: type: string image: type: string replicas: type: integer # Namespaced或Cluster scope: Namespaced names: # URL中使用的复数名称: /apis/<group>/<version>/<plural> plural: crontabs # CLI中使用的单数名称 singular: crontab # CamelCased格式的单数类型。在清单文件中使用 kind: CronTab # CLI中使用的资源简称 shortNames: - ct然后在以下位置创建一个新的命名空间 RESTful API 端点:
/apis/stable.example.com/v1/namespaces/*/crontabs/...然后,此端点 URL 可用于创建和管理自定义对象。上面的 CRD 中定义的类型就是 CronTab。
可能需要几秒钟才能创建端点。可以监控 CustomResourceDefinition 中 Established 的状态何时为 true,或者查看 API 资源的发现信息中是否显示了资源。
创建自定义对象