{"id":20670483,"url":"https://github.com/caicloud/charts","last_synced_at":"2025-10-23T14:58:25.277Z","repository":{"id":54683684,"uuid":"85053638","full_name":"caicloud/charts","owner":"caicloud","description":"Curated kubernetes helm charts with well-defined structures","archived":false,"fork":false,"pushed_at":"2021-02-04T08:54:27.000Z","size":450,"stargazers_count":24,"open_issues_count":1,"forks_count":27,"subscribers_count":11,"default_branch":"master","last_synced_at":"2025-03-29T11:34:42.847Z","etag":null,"topics":["charts","compass","compass-apps","helm","kubernetes"],"latest_commit_sha":null,"homepage":"","language":"Smarty","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/caicloud.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":"CODEOWNERS","security":null,"support":null}},"created_at":"2017-03-15T09:29:52.000Z","updated_at":"2022-05-09T10:54:22.000Z","dependencies_parsed_at":"2022-08-14T00:00:22.033Z","dependency_job_id":null,"html_url":"https://github.com/caicloud/charts","commit_stats":null,"previous_names":[],"tags_count":53,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/caicloud%2Fcharts","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/caicloud%2Fcharts/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/caicloud%2Fcharts/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/caicloud%2Fcharts/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/caicloud","download_url":"https://codeload.github.com/caicloud/charts/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":249762281,"owners_count":21321905,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["charts","compass","compass-apps","helm","kubernetes"],"created_at":"2024-11-16T20:21:02.585Z","updated_at":"2025-10-23T14:58:20.218Z","avatar_url":"https://github.com/caicloud.png","language":"Smarty","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003c!-- START doctoc generated TOC please keep comment here to allow auto update --\u003e\n\u003c!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE --\u003e\n**Table of Contents**  *generated with [DocToc](https://github.com/thlorenz/doctoc)*\n\n- [Chart 模版配置规范定义（v1.0.0）](#chart-%E6%A8%A1%E7%89%88%E9%85%8D%E7%BD%AE%E8%A7%84%E8%8C%83%E5%AE%9A%E4%B9%89v100)\n    - [概述](#%E6%A6%82%E8%BF%B0)\n    - [基础结构描述](#%E5%9F%BA%E7%A1%80%E7%BB%93%E6%9E%84%E6%8F%8F%E8%BF%B0)\n    - [配置控制器定义](#%E9%85%8D%E7%BD%AE%E6%8E%A7%E5%88%B6%E5%99%A8%E5%AE%9A%E4%B9%89)\n      - [类型：controller](#%E7%B1%BB%E5%9E%8Bcontroller)\n        - [controller：Deployment](#controllerdeployment)\n        - [controller：StatefulSet](#controllerstatefulset)\n        - [controller：DaemonSet](#controllerdaemonset)\n        - [controller：Job](#controllerjob)\n        - [controller：CronJob](#controllercronjob)\n      - [类型：schedule](#%E7%B1%BB%E5%9E%8Bschedule)\n      - [类型：pod](#%E7%B1%BB%E5%9E%8Bpod)\n      - [类型：initContainer，container](#%E7%B1%BB%E5%9E%8Binitcontainercontainer)\n        - [probe：liveness，readiness](#probelivenessreadiness)\n        - [handler：liveness，readiness，postStart，preStop](#handlerlivenessreadinesspoststartprestop)\n          - [method：EXEC](#methodexec)\n          - [method：HTTP](#methodhttp)\n          - [method：TCP](#methodtcp)\n      - [类型：volume](#%E7%B1%BB%E5%9E%8Bvolume)\n        - [source：Dynamic，Dedicated](#sourcedynamicdedicated)\n        - [source：Static](#sourcestatic)\n        - [source：Scratch](#sourcescratch)\n        - [source：Config，Secret](#sourceconfigsecret)\n        - [source：HostPath](#sourcehostpath)\n        - [source：Glusterfs](#sourceglusterfs)\n      - [类型：service](#%E7%B1%BB%E5%9E%8Bservice)\n      - [类型：config](#%E7%B1%BB%E5%9E%8Bconfig)\n      - [类型：secret](#%E7%B1%BB%E5%9E%8Bsecret)\n    - [一个配置文件的例子](#%E4%B8%80%E4%B8%AA%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%E7%9A%84%E4%BE%8B%E5%AD%90)\n\n\u003c!-- END doctoc generated TOC please keep comment here to allow auto update --\u003e\n\n# Chart 模版配置规范定义（v1.0.0）\n\n### 概述\n规范主要用于定义 Chart 配置文件 values.yaml 的逻辑结构和类型。  \n我们将一个 Chart 包含的内容定义为一个应用，一个应用通常包含 Pod Controller，Service，Config，Volume 四块主要内容：\n- Pod Controller：Deployment，StatefulSet，DaemonSet，Job，CronJob\n- Service：Service\n- Config：ConfigMap，Secret\n- Volume：PVC，ConfigMap，Secret，EmptyDir\n\n上述的对应关系并没有包含所有的 Kubernetes 资源，即我们认为其他资源是与应用是弱/无耦合的。  \n并且其中 ConfigMap，Secret 也不是由 Chart 主动创建的，而是应当在应用创建之前就应该在集群中存在，并由应用引用，产生单向依赖。\n\n### 基础结构描述\n配置文件使用 yaml 格式，并且在实际使用中转换为 json 格式。  \n标准配置文件结构如下：\n\n```yaml\n# 顶级配置 key ，固定为 _config\n_config: \n  # 在配置文件中，所有以 _ 开头的字段用于存储特殊信息。  \n  # 模板元数据，表示当前配置所属的 Chart 信息，此处数据用于存储模版最原始的信息\n  _metadata:\n    name: string          # Chart 创建时的名称，不随 Chart 更新而更新\n    version: semvar       # Chart 创建时的版本号，不随 Chart 更新而更新\n    description: string   # Chart 创建时的描述，不随 Chart 更新而更新\n    template:             # Chart 模板信息，为模板自动升级提供信息\n      type: string        # Chart 模板类型\n      version: semvar     # Chart 模板版本号\n    appVersion: string    # Chart 创建 workload 时的版本号，会添加到 pod 的 label 中，目前多用于灰度发布。\n  # 配置控制器组，配置控制器组可以包含多个配置控制器\n  # 此处的配置控制器与上面所描述的 Pod Controller 不同，此处的配置控制器具有如下等价关系：\n  # 配置控制器 = 1个 Pod Controller 配置 +\n  #             1个 调度 配置 +\n  #             1个 容器组 配置 +\n  #             0个或多个 初始化容器 配置 +\n  #             1个或多个 基本容器 配置 +\n  #             0个或多个 数据卷 配置 +\n  #             0个或多个 服务 配置\n  controllers:\n  - type: string          # 指定控制器的类型，可以是 Deployment，StatefulSet，DaemonSet，Job，CronJob\n    controller:           # 控制器信息，对应特定 type 的控制器信息\n      ...\n    schedule:             # 调度信息，用于控制容器组的调度\n      ...\n    pod:                  # 容器组信息，指定当前控制器下的所有容器（包括 initializers 和 containers）共享的设置内容\n      ...\n    initContainers:       # 初始化容器数组，可用于放置仅用于初始化阶段的容器，比如初始化数据\n    - ...\n    containers:           # 基本容器数组，用于放置真正执行工作的容器\n    - ...\n    volumes:              # 数据卷描述信息数组，这部分数据卷可以被多个容器共享访问\n    - ...\n    services:             # 服务信息数组，当前控制器内的容器需要暴露服务时，在这里添加服务。一个控制器可有多个服务\n    - ...\n    configs:              # 配置信息数组\n    - ...\n    secrets:              # 加密配置信息数组\n    - ...\nchartX:\n  # 子模版 chartX 的配置，其结构与上面的 _config 相同\n  _config:\n    ...\n```\n`_metadata`仅仅用于描述模板的基本信息。\n- name，version，description 用于描述 Chart 的原始信息。用于从配置直接创建 Chart。\n- template 用于描述 Chart 的模板信息。主要用于实现 Chart 的创建和升级。template 发生功能变更后，可依据模板名称和版本号进行升级。\n\n### 配置控制器定义\n\n字段类型定义：\n\n```\nint:     整数\nuint:    自然数\npint:    正整数\nfloat:   实数\nstring:  字符串\nbool:    布尔值，只能是 true 或 false\n```\n默认值声明方式：\n\n```\n类型(默认值)\nint(-1)\nuint(0)\npint(1)\nfloat(3.14)\nstring(\"default value\")\nbool(true)\n```\n所有有默认值的字段都是 Optional 的。\n\n#### 类型：controller\n\n所有类型的 controller 共有字段如下：\n\n```yaml\nannotations:                           # 控制器附加信息,仅用于保存控制器额外信息\n  - key: string                        # 键\n    value: string                      # 值\n```\nkey 必须符合如下要求：\n\n```\n1. `前缀/键`或者`键`，比如 `caicloud.io/apple`和`apple`\n2. 前缀是域名形式，必须符合 DNS_SUBDOMAIN，即`(([A-Za-z0-9][-A-Za-z0-9]*)?[A-Za-z0-9]\\.)*([A-Za-z0-9][-A-Za-z0-9]*)?[A-Za-z0-9]`\n3. 键必须符合 ([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9]\n```\n\n##### controller：Deployment\n```yaml\nname: string(\"\")                       # 实例前缀名，控制器名称\nreplica: uint(1)                       # 实例数量\nstrategy:                              # 实例滚动更新策略，两个选项不能同时为0\n  type: string(\"RollingUpdate\")        # 更新策略，只能为 RollingUpdate(滚动更新) 或者 Recreate(重新创建)\n  unavailable: uint(0)                 # 最大不可用数量\n  surge: uint(1)                       # 最大超量\nready: uint(0)                         # 实例从 Available 到 Ready 的最短时间\n```\n一个实例在运行时等价于一个容器组，可以通过 replica 指定需要的实例数量，即可在集群中同时跑多个实例。  \n当实例的配置需要更新时，根据更新策略决定如何重启实例。unavailable 表明当前控制器可以先关闭多少个运行中的实例。surge 表示当前控制器可以在 replica 的基础上多创建多少个新的实例。即在滚动更新过程中，实例的数量可能在[max(replica-unavailable,0),replica+surge]区间。  \n\n##### controller：StatefulSet\n```yaml\nreplica: uint(1)                              # 实例数量\nname: string(\"\")                              # 实例前缀名，控制器名称\ndomain: string(\"\")                            # 实例域名\nstrategy:                                     # 实例滚动更新策略\n  type: string(\"RollingUpdate\")               # 更新策略，只能为 RollingUpdate(滚动更新) 或者 OnDelete(删除时更新)\n  rollingUpdate:                              # 滚动更新配置，只有当 RollingUpdate 时才可以此选项\n    partition: uint(0)                        # 分段更新序号\npodManagementPolicy: string(\"OrderedReady\")   # Pod 管理策略, 只能为 OrderedReady 或 Parallel\n```\n指定 name 和 domain 后，可通过 name-序号.domain 的形式访问每个实例。\n比如 replica = 2, name = \"web\", domain = \"cluster\", 那么同一个分区内可使用 web-0.cluster，web-1.cluster 访问两个实例，同时能够直接使用 cluster 访问任意一个实例（RoundRobin）。  \n由于前缀名称和域名具有分区范围内的唯一性，因此同一个分区内的应用不能具有相同的 name 和 domain。同时由于 domain 能够被用于访问任意一个实例，因此也不能与同一分区下的 services 冲突。\n\n##### controller：DaemonSet\n```yaml\nname: string(\"\")                       # 实例前缀名，控制器名称\nstrategy:                              # 实例滚动更新策略，两个选项不能同时为0\n  unavailable: pint(1)                 # 最大不可用数量\nready: uint(0)                         # 实例从 Available 到 Ready 的最短时间\n```\n\n##### controller：Job\n```yaml\nname: string(\"\")                       # 实例前缀名，控制器名称\nparallelism: pint(1)                   # 最大并行实例数量\nbackoffLimit: pint(1)                  # 失败重试次数\ncompletions: pint(1)                   # 总共需要完成的实例数量\nactive: uint(0)                        # 单个实例执行的最长时间，0表示不限制\n```\n一个任务可以同时执行多个实例，通过 parallelism 和 completions 可以控制任务是串行执行还是并行执行或是控制并行执行。  \n- 串行：completions = n, parallelism = 1  即可让 n 个实例串行执行，只有前一个完成后下一个才会执行\n- 并行：completions = n, parallelism \u003e= n  即可让 n 个实例同时并行执行\n- 控制并行：completions = n, parallelism = k, k \u003c n 即可让 n 个实例同时只有 k 个在执行。其中一个实例完成才能让下一个实例开始执行\n\n##### controller：CronJob\n```yaml\nname: string(\"\")                       # 实例前缀名，控制器名称\nrule: string                           # 定时规则，比如 \"*/1 * * * *\"\ndeadline: uint(0)                      # 任务启动超时时间\npolicy: string(\"Allow\")                # 任务并发策略，Allow，Forbid，Replace\nsuspend: bool(false)                   # 是否暂停当前定时任务\nhistory:                               # 任务执行历史保留选项\n  success: uint(0)                     # 执行成功的任务保留数量\n  fail: uint(0)                        # 执行失败的任务保留数量\nparallelism: pint(1)                   # 最大并行实例数量\nbackoffLimit: pint(1)                  # 失败重试次数\ncompletions: pint(1)                   # 总共需要完成的实例数量\nactive: uint(0)                        # 单个实例执行的最长时间，0表示不限制\n```\n定时任务规则格式参考：https://en.wikipedia.org/wiki/Cron  \n定时任务启动超时时间：\n举个例子，定时任务设置在每天 8:00:00 执行一次，然后这个字段设置为 10 秒，那么在 8:00:00 - 8:00:10 这个期间内，如果发生了某个特殊的事情，比如 kubernetes 的 定时器 在 7:59:59 - 8:00:11 这个时间段内一直是崩溃的，那么这个定时任务的这一次触发就会被错过，然后就会在定时任务的失败任务数量上加1。  \n定时任务使用一个 rule 来控制任务的执行。当一个任务未尚未完成，定时器又触发的时候通过 policy 来控制任务的执行方式：\n- Allow：上次触发的任务和本次触发的任务一起执行\n- Forbid：如果上次的任务尚未完成，那么跳过本次任务的执行\n- Replace：取消上次的任务，并开始执行本次的任务\n\n#### 类型：schedule\n```yaml\nscheduler: string(\"\")                                  # 调度器名称，可选项为 空字符串，为空表示使用默认调度器\nlabels:                                                # 控制器及 容器组 标签\n  string: string\naffinity:                                              # 亲和性设置\n  pod:\n    type: string(\"Required\")                           # 类型可以为 Required 或 Prefered\n    terms:\n    - weight: pint                                     # 权重，只有类型为 Prefered 时可以设置该字段，[1-100]\n      topologyKey: string(\"kubernetes.io/hostname\")    # 拓补域\n      namespaces:                                      # 指定分区，不指定表示仅在当前分区\n      - string                                       \n      selector:                                        # 选择器，用于设置匹配的标签\n        labels:                                        # 直接指定标签值\n          string: string\n        expressions:                                   # 通过表达式查找标签\n        - key: string                                \n          operator: string                             # 操作符 In，NotIn，Exists，DoesNotExist\n          values:                                      # 标签值列表\n          - string                                   \n  node:                                              \n    type: string(\"Required\")                           # 类型可以为 Required 或 Prefered\n    terms:\n    - weight: 10                                       # 权重，只有类型为 Prefered 时可以设置该字段，[1-100]\n      expressions:                                     # 通过表达式查找标签，表达式为 AND 表达式\n      - key: string                                    # 这里的 key 不会自动加上前缀\n        operator: string                               # 操作符 In，NotIn，Exists，DoesNotExist，Gt，Lt\n        values:\n        - string                                     \nantiaffinity:                                        \n  pod:                                                 # 反亲和性设置与亲和性设置相同\n    ...                                              \n\ntolerations:                                            # 节点容忍设置\n- key: string(\"key\")                                    # key 值\n  operator: string(\"Equal\")                             # 与 taint value 值的关系，可以为 Equal，Exists 默认为 Equal\n  value: string(\"value\")                                # value 值\n  effect: string(\"NoSchedule\")                          # 与 taint value 不匹配的之后的调度策略，可以为 NoSchedule PreferNoSchedule NoExecute\n  tolerationSeconds: uint(60)                           # 在 effect 为 NoExecute 时，如果不能忍受 taint, pod 在被驱逐之前可以继续在这个节点运行的时间。\n```\ntopologyKey 具有如下值:\n\n```\nkubernetes.io/hostname\nfailure-domain.beta.kubernetes.io/zone\nfailure-domain.beta.kubernetes.io/region\n```\n\n拓补域用于定义一个节点集合。目前常用的拓补域的 key 有如上三种。拓补域与 Pod 的 亲和性/反亲和性 相关。  \n一个拓补域至少有一个节点，所有的 亲和性/反亲和性 的权重计算都是在一个域中进行。  \n比如有多个域，当一个 Pod 在调度时，调度器会根据 亲和性/反亲和性 的设置，在多个域中寻找一个权重最高的域，然后将 Pod 调度到该域中的一个节点上。  \n`kubernetes.io/hostname`与其他两个稍有不同。这个 key 在每个节点上都有不同的值，也就是说，集群里的每个节点都构成了只有一个节点的域。  \n\n容忍策略 NoExecute 尚未实现。\n\n\n#### 类型：pod\n```yaml\nrestart: string(\"Always\")              # 重启策略，可以为 Always，OnFailure，Never\ndns: string(\"ClusterFirst\")            # DNS 策略，可以为 Default，ClusterFirstWithHostNet，ClusterFirst\nhostname: string(\"\")                   # 主机名\nsubdomain: string(\"\")                  # 子域名\ntermination: uint(30)                  # 优雅退出时间\nserviceAccountName: string(\"\")         # ServiceAccount\npriorityClassName: string(\"\")          # PriorityClassName\nhost:\n  network: bool(false)                 # 与主机共享 network namespace\n  pid: bool(false)                     # 与主机共享 pid namespace\n  ipc: bool(false)                     # 与主机共享 ipc namespace\nhostAliases:                           # 向容器组的 /etc/hosts 文件添加条目\n  - ip: string                         # IP 地址\n    hostnames:                         # 主机名列表\n    - string\nsecurityContext:\n  runAsNonRoot: bool(false)            # 是否以非 root 用户运行\nannotations:                           # 容器组附加信息,仅用于保存容器组额外信息\n  - key: string                        # 键\n    value: string                      # 值\n\n```\n在 controller 类型为 Deployment 时，restart 只能为 Always。  \n主机名和子域名构成 Pod 的访问域名：hostname.subdomain.namespace.svc.clusterdomain。  \n容器组的 annotations 用于存放用于扩展容器组能力的额外信息。可以被其他组件读取和识别，实现其他功能。\nkey 的规范参考 [controller 的 annotations](#类型controller)\n\n\n#### 类型：initContainer，container\n```yaml\nname: string(\"\")                       # 容器名称\nimage: string                          # 镜像地址\nimagePullPolicy: string(Always)        # 镜像拉取策略，可以设置为 Always，IfNotPresent\ntty: bool(false)                       # 是否使用 tty\ncommand:                               # 即 Docker EntryPoint\n- string    \nargs:                                  # 即 Docker CMD\n- string\nworkingDir: string(\"\")                 # 工作目录\nsecurityContext:\n  privileged: bool(false)              # 是否启动特权模式\n  capabilities:                        # POISX CAP\n    add:                               # 添加 POISX CAP\n    - string\n    drop:                              # 移除 POISX CAP\n    - string\nports:                                 # 容器端口\n- port: pint(80)                       # 端口\n  hostPort: pint(0)                    # 暴露到主机端口\n  protocol: string(\"HTTP\")             # 端口协议,可以是 HTTP，HTTPS，TCP，UDP\nenvFrom:                               # env from，来自 Config 或 Secret\n- prefix: string(\"\")                   # 所有来自 目标 的 key 都会加这个前缀\n  type: string(\"Config\")               # 配置来源，可以是 Config 或 Secret\n  name: string                         # Config 或 Secret 的名称\n  optional: bool(false)                # 是否可选，即目标不存在也就忽略而不是报错\ndownwardPrefix: string(\"\")             # 默认环境变量前缀\nenv:                                   # env\n- name: string                         # 环境变量名称\n  value: string                        # 环境变量值\n  from:                                # value 和 from 只能二选其一\n    type: string(\"Config\")             # 来源类型\n    name: string                       # Config 或 Secret 的名称\n    key: string                        # data 的 key\n    resource: string                   # type 为 ResourceFieldRef 时用的值\n    optional: bool(false)              # 是否可选，即目标不存在也就忽略而不是报错\nresources:                             # 资源限制\n  requests:                            # 请求的资源下限\n    cpu: string(\"100m\")                # CPU 资源\n    memory: string(\"100Mi\")            # 内存资源\n    storage: string(\"\")                # 存储资源\n    gpu: string(\"\")                    # GPU 资源，Deprecated。建议使用 nvidia.com/gpu\n    nvidia.com/gpu: string(\"\")         # NVIDIA GPU 资源\n    caicloud.io/local-storage: \"0\"     # 本地存储资源，只是作为标记、影响调度，并无实际意义\n  limits:                              # 请求的资源上限\n    cpu: string(\"100m\")                # CPU 资源\n    memory: string(\"100Mi\")            # 内存资源\n    storage: string(\"\")                # 存储资源\n    gpu: string(\"\")                    # GPU 资源，Deprecated。建议使用 nvidia.com/gpu\n    nvidia.com/gpu: string(\"\")         # NVIDIA GPU 资源\n    caicloud.io/local-storage: \"0\"     # 本地存储资源，只是作为标记、影响调度，并无实际意义\nmounts:                                # 挂载数据卷位置\n- name: string                         # 数据卷名称\n  readonly: bool(false)                # 是否只读\n  path: string                         # 挂载路径\n  subpath: string(\"\")                  # 挂载的数据卷子路径\n  propagation: string(\"None\")          # 挂载传播类型，可选项为 None，HostToContainer，Bidirectional\nprobe:                                 # 健康检查\n  liveness:                            # 存活检查（参考 probe 设置）\n    ...\n  readiness:                           # 可读检查（参考 probe 设置）\n    ...\nlifecycle:                             # 生命周期（参考 handler 设置）\n  postStart:                           # 启动后调用，调用失败则重启容器\n    ...\n  preStop:                             # 停止前调用，调用后无论成功失败都会终止容器\n    ...\n```\ninitContainer 不支持 readiness probe 和 lifecycle，因此在 initContainer 中不能设置这几项。  \ninitContainer 是串行执行的，一个成功后才能执行下一个。 \n默认的环境变量包括：\n\n- `POD_NAMESPACE`\n- `POD_NAME`\n- `POD_IP`\n- `NODE_NAME`\n\n可以通过 downwardPrefix 为上述环境变量增加前缀。比如 downwardPrefix 为 `ENV_` 时：`POD_NAMESPACE` 变为 `ENV_POD_NAMESPACE`。  \n\n##### probe：liveness，readiness\n```yaml\nhandler:                               # 调用 handler 检查方式\n  ... \ndelay: uint(0)                         # 从容器启动到发送健康检查请求的时间间隔（秒）\ntimeout: pint(1)                       # 单次请求的超时时间（秒）\nperiod: pint(10)                       # 请求时间间隔（秒）\nthreshold:\n  success: pint(1)                     # 连续多少次请求成功则认为健康\n  failure: pint(3)                     # 连续多少次请求失败则认为不健康\n```\n\n##### handler：liveness，readiness，postStart，preStop\n```yaml\ntype: string(HTTP)                     # handler 类型，可以为 HTTP，EXEC，TCP\nmethod:                                # handler 方法\n  ...\n```\n\n###### method：EXEC\n```yaml\ncommand:                               # 执行命令\n- string\n```\n\n###### method：HTTP\n```yaml\nscheme: string(HTTP)                   # HTTP 或 HTTPS\nhost: string(\"\")                       # Host 字段，默认是 pod ip, 如果只是想使用域名，请填在 headers 里面\nport: pint                             # 容器端口\npath: string                           # HTTP Path\nheaders:                               # 请求头\n- name: string                         # Header 名称\n  value: string                        # Header 值\n```\n对于 `host` 这个字段，在 kubernetes 官网的[解释](https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes)里面说明，大部分情况下是用不上的，有一种情况是，如果你的 container 监听了 `127.0.0.1` 并且 pod 使用了 hostNetwork，则这个 `host` 需要修改成 `127.0.0.1` 。在其他通用的使用场景中，你的 container 里面提供了多个虚拟域名（如 nginx 反向代理)，那么你应该在 `headers` 里面设置 `Host` 的值，而不是使用 `host` 。\n\n###### method：TCP\n```yaml\nport: pint                             # TCP 端口\n```\n\n\n#### 类型：volume\n```yaml\nname: string                           # 数据卷名称，在容器中被引用\ntype: string(\"Scratch\")                # 可选项为 Dedicated，Dynamic，Static，Scratch，Config，Secret，HostPath。Dedicated 仅在控制器为 StatefulSet 时可用\nsource:                                # source 的设置与 type 有关\n  ... \nstorage:                               # 存储需求\n  request: string(\"5Gi\")               # 请求的最小存储容量\n  limit: string(\"10Gi\")                # 请求的最大存储容量\n```\n\n##### source：Dynamic，Dedicated\n```yaml\nclass: string                          # 存储方案名称\nmodes:\n- string(\"ReadWriteOnce\")              # 数据卷读写模式，可以为 ReadWriteOnce，ReadOnlyMany，ReadWriteMany\n```\nDynamic 和 Dedicated 两种类型的数据卷实际上都是使用存储方案来实现，即通过创建 PVC 并关联 storage class。  \n但是 Dynamic 只用于创建单一的 PVC，如果多个容器引用同一个 Dynamic，那么实际上多个副本是共享数据卷的（多副本时 mode 不能为 ReadWriteOnce）。  \nDedicated 类型仅用于 StatefulSet 类型的控制器。StatefulSet 会根据 Dedicated 的设置动态创建多个 PVC，并且每个 Pod 会绑定不同的 PVC，即每个 Pod 的数据卷是独立的。\n这两种类型的数据卷在部署后，volume 中的所有字段值都不能进行更改。\n\n##### source：Static\n```yaml\ntarget: string                         # 已创建的数据卷名称\nreadonly: bool(false)                  # 是否以只读形式挂载\n```\nStatic 类型的数据卷只能用于使用已经创建好数据卷（PVC）。\n\n##### source：Scratch\n```yaml\nmedium: string(\"\")                     # 存储介质，可以为 空字符串 或 Memory\n```\nScratch 表示使用临时数据卷 EmptyDir。\n\n##### source：Config，Secret\n```yaml\ntarget: string                         # 已创建的 Config 或 Secret\nitems:\n- key: string                          # 配置文件 data 中的 key\n  path: string                         # 设置 key 对应的值在数据卷中的绝对路径\n  mode: string(\"0644\")                 # 文件读写模式，如果这里为空则使用默认文件读写模式\ndefault: string(\"0644\")                # 默认文件读写模式\noptional: bool(false)                  # 是否允许指定的 Config 或 Secret 不存在\n```\nConfig 和 Secret 表示使用 配置 或 秘钥 作为数据卷。能够指定 配置 和 秘钥 的多个 key 作为文件使用。\n\n##### source：HostPath\n```yaml\npath: string                           # 本地文件路径\n```\n\n##### source：Glusterfs\n```yaml\nendpoints: string                      # glusterfs endpoints\npath: string                           # glusterfs volume path\nreadonly: bool(false)                  # 是否以只读形式挂载\n```\n\n#### 类型：service\n```yaml\nname: string                           # 服务名称\ntype: string(ClusterIP)                # 服务类型，可以是 ClusterIP，NodePort\nports:\n- protocol: string(HTTP)               # 端口协议，可以是 HTTP，HTTPS，TCP，UDP\n  targetPort: pint                     # 容器端口\n  port: pint                           # 服务端口\n  nodePort: uint(0)                    # 节点端口，[30000,32767]\nannotations:                           # 服务附加信息,仅用于保存服务额外信息\n- key: string                          # 键\n  value: string                        # 值\nselector:                              # 服务会将流量路由到标签匹配的 Pod\n  string: string                       # 直接指定标签值\nsessionAffinity: ClientIP              # 会话保持类型 仅支持 ClientIP 和 None\naffinityTimeout: 10800                 # 会话保持超时时间 单位秒 默认 10800 范围是 (0, 86400]\n```\n服务可以以两种形式暴露给外部：\n- ClusterIP：使用该形式暴露的服务，其它应用可以通过服务名访问当前服务\n- NodePort：使用该形式暴露的服务，其它应用可以通过节点 IP 访问当前服务\n\n服务类型为 NodePort 时，才可以设置 ports 中的 nodePort 字段。  \n服务在部署后，服务名称不可变更。\n\n#### 类型：config\n```yaml\nname: string                           # 配置名称\ndata:\n- key: string                          # 键\n  value: string                        # 值\n```\n\n#### 类型：secret\n```yaml\nname: string                           # 加密配置名称\ntype: string(Opaque)                   # 加密配置类型\ndata:\n- key: string                          # 键\n  value: string                        # 值，必须是原始值经过 base64 编码后的字符串\n```\n\n加密配置的类型包括：\n\n- Opaque：默认加密配置类型，key 可以是任意有效的字符串\n- kubernetes.io/service-account-token： ServiceAccount，key 包括\n  - kubernetes.io/service-account.name\n  - kubernetes.io/service-account.uid\n  - token\n  - kubernetes.kubeconfig\n  - ca.crt\n  - namespace\n- kubernetes.io/dockercfg： Docker config，key 包括\n  - .dockercfg\n- kubernetes.io/dockerconfigjson： Docker config json，key 包括\n  - .dockerconfigjson\n- kubernetes.io/basic-auth： Basic auth，key 包括\n  - username\n  - password\n- kubernetes.io/ssh-auth： SSH auth，key 包括\n  - ssh-privatekey\n- kubernetes.io/tls： TLS 证书密钥（PEM），key 包括\n  - tls.crt\n  - tls.key\n\n\n### 一个配置文件的例子\n```yaml\n_config:\n  _metadata:\n    name: template\n    version: 1.0.0\n    description: \"A basic template for application\"\n    creationTime: \"2017-07-14 12:00:00\"\n    source: \"/library/template/1.0.0\"\n    class: Default\n    template:\n      type: \"template.caicloud.io/application\"\n      version: 1.0.0\n  controllers:\n  - type: StatefulSet\n    controller:\n      replica: 3\n      name: \"mysqlcluster\"\n      domain: \"mysql\"\n    schedule:\n      labels:\n        cpu: heavy\n        io: heavy\n      affinity:\n        node:\n          type: Prefered\n          terms:\n          - weight: 10\n            expressions:\n            - key: cpu\n              operator: NotIn\n              values:\n              - heavy\n              - midium\n        pod:\n          type: Required\n          terms:\n          - selector:\n              labels:\n                cpu: heavy\n      antiaffinity:\n        pod:\n          type: Prefered\n          terms:\n          - weight: 10\n            selector:\n              expressions:\n              - key: cpu\n                operator: In\n                values:\n                - heavy\n                - midium\n    pod:\n      host:\n        network: true\n    initContainers:\n    - image: mysql-init:v1.0.0\n      mounts:\n      - name: db-volume\n        path: /var/lib/mysql\n      resources:\n        requests:\n          cpu: 100m\n          memory: 100Mi\n        limits:\n          cpu: 100m\n          memory: 100Mi\n    containers:\n    - image: mysql:v5.6\n      ports:\n      - protocol: TCP\n        port: 3306\n      mounts:\n      - name: db-volume\n        path: /var/lib/mysql\n      - name: shared-volume\n        path: /var/lib/logs\n      envFrom:\n      - type: Config\n        name: someconfigmap\n        prefix: XXXX_\n        optional: false\n      downwardPrefix: MY_ENV\n      env:\n      - name: XXSS_\n        value: \"sd\"\n      resources:\n        requests:\n          cpu: 100m\n          memory: 100Mi\n        limits:\n          cpu: 100m\n          memory: 100Mi\n      probe:\n        liveness:\n          handler:\n            type: HTTP\n            method:\n              port: 80\n              path: /liveness\n          delay: 10\n        readiness:\n          handler:\n            type: EXEC\n            method:\n              command:\n              - curl\n              - http://localhost\n          delay: 15\n    volumes:\n    - name: db-volume\n      type: Dedicated\n      source:\n        class: hdd\n        modes:\n        - ReadWriteOnce\n      storage:\n        request: 5Gi\n      propagation: None\n    - name: shared-volume\n      type: Dynamic\n      source:\n        class: ssd\n        modes:\n        - ReadWriteMany\n      storage:\n        request: 5Gi\n        limit: 100Gi\n    services:\n    - name: mysql1\n      type: ClusterIP\n      ports:\n      - protocol: HTTP\n        targetPort: 80\n        port: 80\n      sessionAffinity: ClientIP\n      affinityTimeout: 10800\n    - name: mysql2\n      type: NodePort\n      ports:\n      - protocol: HTTPS\n        targetPort: 443\n        port: 443\n        nodePort: 31222\n  - type: Deployment\n    controller:\n      replica: 1\n      name: simplelog\n    containers:\n    - image: cargo.caicloudprivatetest.com/caicloud/simplelog\n      mounts:\n      - name: cfgvolume\n        path: /etc/simplelog\n      resources:\n        requests:\n          cpu: 100m\n          memory: 100Mi\n        limits:\n          cpu: 100m\n          memory: 100Mi\n    services:\n    - name: log1\n      type: ClusterIP\n      ports:\n      - protocol: HTTP\n        targetPort: 80\n        port: 80\n    volumes:\n      name: cfgvolume\n      type: Config\n      source:\n        target: simplecfg\n        items:\n        - key: \"config.yaml\"\n          path: \"config.yaml\"\n    configs:\n    - name: simplecfg\n      data:\n      - key: \"config.yaml\"\n        value: |\n          sync: \"5m\"\n          deadline: \"3h\"\n    secrets:\n    - name: simplesecret\n      data:\n      - key: \"encrypted.cfg\"\n        value: c3luYzogIjVtIgpkZWFkbGluZTogIjNoIgo=\nsubchart:\n  _config:\n    略\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcaicloud%2Fcharts","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcaicloud%2Fcharts","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcaicloud%2Fcharts/lists"}