目录

核心概念

核心概念
  • 开发项目概念
  • 流水线概念
  • 关键配置

核心概念

/docs/01-overview/04-concepts/images/dev-space.png

  • 现在让我们先搞懂开发空间界面上的各个核心概念

开发项目

  • Dory-Engine是一个非常简单的k8s远程开发环境,创建开发项目就相当于为开发团队创建相互独立/隔离的k8s远程开发空间,k8s远程开发空间包括以下内容:
    • 代码仓库: 开发团队的项目代码存放在哪个代码仓库,支持使用 gitlab[支持私有化部署] / gitea[支持私有化部署] / github.com / gitee.com / 其他git代码仓库
    • 镜像仓库: 编译打包的容器镜像自动推送到哪个镜像仓库,支持使用 harbor[支持私有化部署] / 其他容器镜像仓库
    • 制品仓库[可选]: 编译生成的制品压缩包自动保存到哪个制品仓库,支持使用 nexus[支持私有化部署,nexus同时可以作为编译依赖的代理与缓存] / Dory-Engine内置制品仓库 / http,ftp,sftp方式上传制品
    • 代码扫描仓库[可选]: 对项目的源代码进行代码质量扫描,支持使用 sonarqube[支持私有化部署]
    • k8s环境: 把编译打包的容器镜像部署到哪个k8s集群,支持 v1.16.x - v1.31.x 各种版本的k8s,支持x86 / arm64 等不同架构的k8s节点,支持为项目设置 CPU / GPU 等不同类型的资源配额

/docs/01-overview/04-concepts/images/create-new-project.png

  • 开始使用Dory-Engine之前,首先需要创建开发项目,创建开发项目后,开发人员才能使用k8s远程开发空间
  • 开通开发项目的时候,需要填写相关项目信息,包括以下内容: 项目基础信息、代码仓库信息、镜像仓库信息、制品仓库信息、代码扫描仓库信息、k8s环境信息
  • 项目开通过程将会进行以下操作:
    1. 自动在代码仓库中创建演示项目的所有代码,后续执行流水线将会自动从这个代码仓库拉取源代码
    2. 自动在镜像仓库中创建项目,后续执行流水线将会自动推送镜像到这个镜像仓库
    3. 自动在制品仓库中创建仓库,后续执行流水线将会自动把制品压缩包推送到这个制品仓库
    4. 自动在代码扫描仓库中创建项目,后续执行流水线将会在代码扫描仓库中生成扫描报告
    5. 自动在k8s环境中创建项目的名字空间,自动分配共享存储,自动为项目分配资源配额,后续执行流水线将会自动把应用部署到这个k8s环境
  • 创建开发项目后,开发人员无需编写任何流水线脚本,无需编写任何k8s部署清单,无需配置任何代码仓库、镜像仓库和k8s连接参数,修改项目代码即可自动把源代码编译、打包、部署到k8s环境,在k8s环境中调试自己开发的程序
  • 每个开发项目的代码仓库镜像仓库制品仓库代码扫描仓库k8s环境都有独立的访问账号和密码,相互独立/隔离

/docs/01-overview/04-concepts/images/get-password-token.png

  • 可以在 开发空间 - 项目详情 获取项目镜像仓库制品仓库代码扫描仓库k8s环境的访问密码和token

流水线

流水线 - 源代码 - 模块

/docs/01-overview/04-concepts/images/pipeline-modules.png

  • 一个代码仓库中可以包含多个不同编程语言编写的微服务源代码,每个微服务的源代码存在放在不同的目录中
  • 流水线需要经过三个步骤: 编译构建镜像打包k8s部署 才能实现从源代码到k8s环境的上线流程
  • Dory-Engine流水线对应以上三个关键步骤,分别对应三种关键模块:
    • 构建模块: 用于定义代码仓库中特定目录的源代码如何进行编译构建,一个构建模块对应一个代码目录,通过模块构建定义来设置多个构建模块
    • 镜像打包模块: 用于定义编译构建出来的制品如何打包成容器镜像,支持把多个构建模块构建出来的制品打包到同一个容器镜像中,通过镜像打包定义来设置多个镜像打包模块
    • 容器部署模块: 用于定义打包出来的容器镜像如何部署到k8s环境,支持把一个容器镜像部署成不同的k8s部署实例,通过容器部署定义来设置多个容器部署模块,容器部署定义是区分环境的
  • 注意,流水线只是用于组装这些构建、镜像打包和容器部署模块来运行这些模块,所有流水线其实是共用模块构建定义镜像打包定义容器部署定义
  • Dory-Engine的模块设计可以支持各种复杂的软件开发场景
  • 以自动创建的演示项目为例子,演示项目源代码包含了7个目录,对应7个构建模块
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    
    demo-codes # 各个演示项目微服务的源代码存放目录
    ├── backend # 后端微服务代码存放目录
    │   ├── gin-demo # 使用go语言编写的后端接口微服务
    │   ├── go-demo # 使用go语言编写的后端接口微服务
    │   ├── gradle-demo # 使用groovy语言编写的样例代码,仅用于构建
    │   ├── node-demo # 使用nodejs编写的后端接口微服务
    │   ├── python-demo # 使用python编写的后端接口微服务
    │   └── spring-demo # 使用java编写的springboot后端接口微服务
    └── frontend # 前端微服务代码存放目录
        └── vue-demo # 使用vuejs编写的前端呈现界面,打包到go-demo镜像中
    
    • 编译构建阶段,7个构建模块会生成7个制品
    • 镜像打包阶段,编辑构建出来的制品会打包成容器镜像,其中vue-demo和go-demo生成的制品会打包成go-demo镜像,5个镜像打包模块会生成5个容器镜像
    • k8s部署阶段,5个容器镜像会分别部署到k8s环境,5个容器部署模块会生成5个k8s部署

流水线 - 阶段 - 环节 - 步骤

/docs/01-overview/04-concepts/images/pipeline-demo.png

  • 一条流水线分为多个阶段,每个阶段顺序执行,例如上边的流水线包括: 拉取代码、获取运行配置、编译构建、镜像打包、k8s部署、检查部署状态等阶段
  • 每个阶段下可以有多个环节,每个环节并行执行,例如上边的流水线,编译构建阶段有6个不同模块的环节,镜像打包和k8s部署阶段有5个不通模块的环节
  • 每个环节可以由多个步骤构成,同一个环节下的步骤顺序执行,大部分情况下一个环节下只有一个步骤
  • 设置多个构建模块镜像打包模块容器部署模块可以让编译构建镜像打包k8s部署环节下有多个并行环节

流水线 - 分支 - 环境

/docs/01-overview/04-concepts/images/create-new-pipeline.png

  • 项目控制台 - 项目流水线设置 界面,一个开发项目支持创建多条流水线,一条流水线对应代码仓库的一个分支,创建流水线的时候会自动在代码仓库创建对应分支
  • 一条流水线把源代码进行编译构建、镜像打包之后,可以把容器镜像分别部署到多个k8s环境,这里环境分两类:
    • 测试环境: 容器镜像部署到k8s环境之后,可以执行自动化测试步骤
    • 生产环境: 容器镜像部署到k8s环境之后,不会执行自动化测试步骤
  • 流水线会先进行测试环境部署,然后弹出人工确认提示,在流水线上进行人工确认后再进行生产环境部署,生产环境为非必填项目
  • 一条流水线可以部署到多个测试环境,也可以部署到多个生产环境。多个测试环境和生产环境的情况下,会进行顺序部署

/docs/01-overview/04-concepts/images/pipeline-branch-env.png

  • 创建流水线后,可以看到项目的流水线清单,流水线名称为: ${projectName}-${branchName}
  • 执行流水线,会从代码仓库的拉取对应分支的源代码,进行编译构建、镜像打包,然后把容器镜像部署到对应的测试环境和生产环境
  • 流水线可以设置不同的架构,amd64架构表示使用x86的CPU架构进行编译构建、镜像打包;arm64v8架构表示使用arm的CPU架构进行编译构建、镜像打包
  • 上图的设置表示,demo-project这个开发项目有两条流水线:
    • develop流水线: 拉取代码仓库的develop分支代码,使用x86的CPU架构进行编译构建、镜像打包,然后部署到devops这个测试环境
    • release流水线: 拉取代码仓库的release分支代码,使用arm的CPU架构进行编译构建、镜像打包,然后部署到uat这个测试环境,进行自动化测试;经过人工确认,再部署到prod这个生产环境

交互式流水线

/docs/01-overview/04-concepts/images/pipeline-ops.png

  • 开发空间 界面,有一种非常特殊的ops流水线,这是一种交互式流水线,交互式流水线不对应任何分支和环境
  • 执行ops流水线过程中会弹出各种操作选项,流水线根据操作选项决定在哪个分支、哪个环境、执行哪些操作,交互式执行过程如下:
    1. 选择代码仓库的分支,例如选择develop分支 /docs/01-overview/04-concepts/images/pipeilne-ops-branch.png
    2. 选择目标操作环境,develop分支流水线配置的环境只有devops环境,所以这里可选的环境只有devops环境 /docs/01-overview/04-concepts/images/pipeilne-ops-env.png
    3. 选择操作类型,除编译构建镜像打包这两种特殊操作之外,交互式流水线可以选择各种步骤,还支持自定义步骤 /docs/01-overview/04-concepts/images/pipeilne-ops-op.png
    4. 选择模块,之前的操作类型选择了执行容器部署,这里要选择哪些模块要执行容器部署 /docs/01-overview/04-concepts/images/pipeilne-ops-module.png
    5. 选择容器部署模块之后,正式执行容器部署操作
  • ops交互式流水线提供一个灵活的方式执行流水线,例如你只是调整了容器部署模块中的某些k8s部署参数,但是又不想重新走一次编译、打包流程,这个时候执行ops流水线,直接进行k8s部署

流水线运行记录

/docs/01-overview/04-concepts/images/runs.png

  • 流水线一旦执行就会形成运行记录
  • 流水线执行有多种触发方式:
    • WEBHOOK: 修改了源代码并push到代码仓库,由代码仓库的webhook触发执行流水线
    • MANUAL: 手工点击执行按钮执行流水线
    • CRONTAB: 流水线设置了计划任务,通过计划任务触发执行流水线

/docs/01-overview/04-concepts/images/run.png

  • 流水线的运行记录可以以流程图方式查看流水线各个步骤的执行情况,也可以以列表形式查看各个步骤的执行记录,以及查看详细的步骤执行日志

步骤执行记录

/docs/01-overview/04-concepts/images/steps.png

  • 流水线执行后会形成步骤执行记录,步骤执行记录会抽取该步骤执行过程中的关键信息,让用户无需翻查步骤日志,即可快速了解步骤的关键信息
  • 例如容器部署状态检查步骤的执行记录,可以快速查看各个pod的状态,以及快速链接到k8s-dashboard管理容器

关键配置

流水线定义

/docs/01-overview/04-concepts/images/def-pipeline-basic.png

  • 流水线定义主要用于设置流水线的开关,通过这些开关可以设置要启用哪些模块执行流水线,也可以设置启用流水线的哪些步骤
  • 流水线定义界面分为四个部分:
    1. 流水线基础设置
    2. 模块开关设置: 可以设置需要启用哪些模块执行流水线,这里的模块是指构建模块,通过构建模块的开关可以自动控制相关镜像打包模块容器部署模块的开关。如上图表示只执行 node-demo / python-demo / spring-demo 三个模块的编译、打包、部署
    3. 流水线步骤设置: 可以设置是否启用本步骤、超时设置、重试设置等,根据选择的步骤不同,流水线步骤显示不同的步骤设置。另外也会显示与本步骤相关的定义,例如选择编译构建代码步骤,会显示模块构建定义,这里可以设置本步骤有多少模块,以及模块的参数设置
    4. 流水线步骤选择: 选择不同的步骤,流水线步骤设置会显示不同的参数配置
  • 详细流水线定义
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
# 流水线架构
pipelineArch: amd64
# 是否开启构建模块自动检测
# ++ 假如开启,cicd流水线将会根据代码提交内容自动检测对应构建模块的代码路径中是否有代码文件发生变更,自动设置本次流水线开启哪些构建模块
# ++ 如果本设置开启,那么cicd流水线自动忽略以下builds(构建模块开关设置)的设置
isAutoDetectBuild: false
# 是否串行执行
# ++ 假如开启,同时只能执行一条流水线,其他流水线将会以队列的形式等待执行
isQueue: false
# 构建模块开关设置*
# ++ 设置哪些模块需要构建,如果模块需要构建,请设置run为true;如果模块不需要构建,请设置run为false
builds:
  # 构建模块名称*
  # @@ 只读,来源于cicd获取流水线定义接口,不能修改
- name: tp1-spring-demo
  # 是否执行构建*
  run: true
# 流水线步骤开关设置*
# ++ 需要开启的步骤设置为true,需要关闭的步骤设置为false
pipelineStep:
  # 拉取代码
  gitPull:
    # 超时设置
    # ++ 0表示不限时,单位:秒
    timeout: 60
    # 是否需要选择tag进行后续集成
    selectTag: false
  # 编译构建代码
  build:
    # 是否启用
    # ++ 假如禁用,那么所有后续步骤都不执行
    enable: true
    # 超时设置
    # ++ 0表示不限时,单位:秒
    timeout: 60
    # 重试设置
    # ++ 执行异常的情况下重试次数
    retry: 0
  # 代码扫描
  scanCode:
    # 是否启用
    enable: true
    # 异常是否继续执行
    ignoreError: true
    # 超时设置
    # ++ 0表示不限时,单位:秒
    timeout: 60
    # 重试设置
    # ++ 执行异常的情况下重试次数
    retry: 0
  # 容器镜像打包上传
  packageImage:
    # 是否启用
    # ++ 假如禁用,那么后续scanImage、deploy等步骤都不执行
    enable: true
    # 超时设置
    # ++ 0表示不限时,单位:秒
    timeout: 60
    # 重试设置
    # ++ 执行异常的情况下重试次数
    retry: 0
    # 是否推送到额外的镜像仓库
    # ++ 模块镜像打包定义中设置了要把镜像推送到其他镜像仓库情况下才有效
    extraPush: false
  # 容器镜像扫描
  scanImage:
    # 是否启用
    enable: true
    # 异常是否继续执行
    ignoreError: true
    # 超时设置
    # ++ 0表示不限时,单位:秒
    timeout: 60
    # 重试设置
    # ++ 执行异常的情况下重试次数
    retry: 0
    # 中风险漏洞门禁数量
    # ++ 超过该数量则镜像扫描失败
    gateMedium: 5
    # 高风险漏洞门禁数量
    # ++ 超过该数量则镜像扫描失败
    gateHigh: 0
    # 关键风险漏洞门禁数量
    # ++ 超过该数量则镜像扫描失败
    gateCritical: 0
  # 制品打包上传
  artifact:
    # 是否启用
    # ++ 假如禁用,那么后续deployArtifact步骤都不执行
    enable: true
    # 重试设置
    # ++ 执行异常的情况下重试次数
    retry: 0
  # 同步生产环境镜像到集成环境
  syncImage:
    # 是否启用
    # ++ 只有发布到生产环境的流水线需要设置,假如开启那么发布到集成环境的时候,会把生产环境所有应用的镜像同步到集成环境
    enable: true
    # 重试设置
    # ++ 执行异常的情况下重试次数
    retry: 0
  # 容器应用部署
  deploy:
    # 是否启用
    enable: true
    # 重试设置
    # ++ 执行异常的情况下重试次数
    retry: 0
    # 强制替换资源
    # ++ 执行kubectl apply的时候是否强制先delete资源再apply资源
    forceReplace: false
    # 是否把部署文件归档到nexus
    archive: true
    # 是否只校验部署设置,但不进行实际部署
    try: false
    # 忽略执行的模块名,只要模块名中包含设置的字符串就会忽略执行
    ignoreExecuteModuleNames: ["xxx"]
  # 部署ingress
  applyIngress:
    # 是否启用
    enable: true
    # 重试设置
    # ++ 执行异常的情况下重试次数
    retry: 0
  # 服务网格设置
  applyMesh:
    # 是否启用
    enable: true
    # 重试设置
    # ++ 执行异常的情况下重试次数
    retry: 0
  # 容器应用状态检查
  checkDeploy:
    # 是否启用
    enable: true
    # 异常是否继续执行
    ignoreError: true
    # 重试设置
    # ++ 执行异常的情况下重试次数
    retry: 0
    # 检查次数设置
    # ++ 检查次数,0表示使用默认设置
    repeat: 60
    # 检查间隔设置
    # ++ 0表示使用默认设置,单位:秒
    repeatInterval: 5
  # 项目容器资源配额检查
  checkQuota:
    # 是否启用
    enable: true
    # 重试设置
    # ++ 执行异常的情况下重试次数
    retry: 0
  # 主机应用部署
  deployArtifact:
    # 是否启用
    enable: true
    # 超时设置
    # ++ 0表示不限时,单位:秒
    timeout: 60
    # 重试设置
    # ++ 执行异常的情况下重试次数
    retry: 0
    # 是否把部署文件归档到nexus
    archive: true
    # 是否只校验部署设置,但不进行实际部署
    try: false
    # 忽略执行的模块名,只要模块名中包含设置的字符串就会忽略执行
    ignoreExecuteModuleNames: ["xxx"]
  # 接口自动化测试
  testApi:
    # 是否启用
    enable: true
    # 异常是否继续执行
    ignoreError: true
    # 超时设置
    # ++ 0表示不限时,单位:秒
    timeout: 60
    # 重试设置
    # ++ 执行异常的情况下重试次数
    retry: 0
    # 通过率门禁
    passingRate: 100
    # 忽略执行的模块名,只要模块名中包含设置的字符串就会忽略执行
    ignoreExecuteModuleNames: ["xxx"]
  # 性能自动化测试
  testPerformance:
    # 是否启用
    enable: true
    # 异常是否继续执行
    ignoreError: true
    # 超时设置
    # ++ 0表示不限时,单位:秒
    timeout: 60
    # 重试设置
    # ++ 执行异常的情况下重试次数
    retry: 0
    # 忽略执行的模块名,只要模块名中包含设置的字符串就会忽略执行
    ignoreExecuteModuleNames: ["xxx"]
  # 界面自动化测试
  testWebui:
    # 是否启用
    enable: true
    # 异常是否继续执行
    ignoreError: true
    # 超时设置
    # ++ 0表示不限时,单位:秒
    timeout: 60
    # 重试设置
    # ++ 执行异常的情况下重试次数
    retry: 0
    # 通过率门禁
    passingRate: 100
    # 忽略执行的模块名,只要模块名中包含设置的字符串就会忽略执行
    ignoreExecuteModuleNames: ["xxx"]
  # 等待输入
  input:
    # 是否启用
    enable: true
    # 只能通过API输入
    isApiOnly: true
# cicd流水线在哪些步骤后边执行自定义步骤设置
customStepInsertDefs:
  # 内置步骤名称
  scanCode:
    # 插入的步骤名称
    customStepName: xxx
    # 是否启用
    enable: true
    # 异常是否继续执行
    ignoreError: true
    # 超时设置
    # ++ 0表示不限时,单位:秒
    timeout: 60
    # 重试设置
    # ++ 执行异常的情况下重试次数
    retry: 0
    # 等待输入后执行
    enableInput: false
    # 只能通过API输入
    isApiOnly: false
    # 等待输入后继续执行后续步骤
    enableInputFinish: false
    # 只能通过API输入,继续执行后续步骤
    isApiOnlyFinish: false

内置的流水线步骤

步骤名称 步骤详细说明 相关定义 相关开关设置
gitPull
拉取代码
从代码仓库拉取代码,并checkout到对应分支 超时设置(timeout)
选择tag进行后续集成(selectTag)
getRunSettings
获取运行配置
build
编译构建代码
使用步骤执行器docker启动编译环境,执行编译构建命令 模块构建定义 是否启用(enable)
超时设置(timeout)
重试设置(retry)
scanCode
代码扫描
使用sonarqube扫描代码 模块构建定义 是否启用(enable)
异常是否继续执行(ignoreError)
超时设置(timeout)
重试设置(retry)
packageImage
镜像打包上传
打包容器镜像并推送到镜像仓库 模块镜像打包定义/
镜像打包忽略定义
是否启用(enable)
超时设置(timeout)
重试设置(retry)
推送到其他镜像仓库(extraPush)
scanImage
镜像扫描
使用trivy扫描容器镜像 模块镜像打包定义/
镜像打包忽略定义
是否启用(enable)
异常是否继续执行(ignoreError)
超时设置(timeout)
重试设置(retry)
中风险漏洞门禁数量(gateMedium)
高风险漏洞门禁数量(gateHigh)
关键风险漏洞门禁数量(gateCritical)
artifact
制品打包上传
把编译的制品压缩包上传到制品仓库 模块制品打包定义 是否启用(enable)
重试设置(retry)
syncImage
同步生产环境镜像到测试环境
只有流水线配置了测试环境和生产环境的情况下有效,把生产环境的镜像版本更新到测试环境 模块容器部署定义 是否启用(enable)
重试设置(retry)
deploy
容器应用部署
部署应用到k8s环境 模块容器部署定义 是否启用(enable)
重试设置(retry)
强制替换资源(forceReplace)
把部署文件归档到制品库(archive)
不执行实际部署(try)
忽略执行的模块名(ignoreExecuteModuleNames)
applyIngress
部署ingress
模块容器部署定义 是否启用(enable)
重试设置(retry)
applyMesh
服务网格设置
使用istio部署应用的服务网格策略 模块服务网格网关定义/
模块服务网格定义
是否启用(enable)
重试设置(retry)
checkDeploy
容器应用状态检查
检查部署到k8s的pod是否ready 模块容器部署定义 是否启用(enable)
异常是否继续执行(ignoreError)
重试设置(retry)
检查次数设置(repeat)
检查间隔设置(repeatInterval)
checkQuota
项目容器资源配额检查
检查项目k8s名字空间已经使用了多少资源 是否启用(enable)
重试设置(retry)
deployArtifact
主机应用部署
把编译的制品部署到远程主机环境 模块制品部署定义 是否启用(enable)
超时设置(timeout)
重试设置(retry)
把部署文件归档到制品库(archive)
不执行实际部署(try)
忽略执行的模块名(ignoreExecuteModuleNames)
testApi
接口自动化测试
使用robotframework进行接口自动化测试 是否启用(enable)
异常是否继续执行(ignoreError)
超时设置(timeout)
重试设置(retry)
测试用例通过百分比(passingRate)
忽略执行的模块名(ignoreExecuteModuleNames)
testWebui
界面自动化测试
使用robotframework进行界面自动化测试 是否启用(enable)
异常是否继续执行(ignoreError)
超时设置(timeout)
重试设置(retry)
测试用例通过百分比(passingRate)
忽略执行的模块名(ignoreExecuteModuleNames)
testPerformance
性能自动化测试
使用jmeter进行界面自动化测试 是否启用(enable)
异常是否继续执行(ignoreError)
超时设置(timeout)
重试设置(retry)
测试用例通过百分比(passingRate)
忽略执行的模块名(ignoreExecuteModuleNames)
input
等待输入
在部署到生产环境之前是否需要在流水线上进行人工确认 是否启用(enable)
步骤执行前需要API接口确认(isApiOnly)

模块构建定义

/docs/01-overview/04-concepts/images/def-build.png

  • 模块构建定义主要用于设置build(编译构建代码)步骤如何编译源代码
  • 详细模块构建定义
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
  # 构建模块名称*
- buildName: tp1-spring-demo
  # 构建步骤ID*
  # ++ 相同的构建步骤ID表示并行构建,必须大于0
  buildPhaseID: 1
  # 构建模块代码路径*
  # ++ 构建模块在代码仓库中的相对路径
  buildPath: Codes/Backend/tp1-spring-demo
  # 模块构建环境*
  buildEnv: maven-jdk14
  # 模块构建命令*
  buildCmds:
  - mvn clean package
  # 模块构建结果验证命令*
  buildChecks:
  - ls -al target/
  # 代码目录下需要缓存的子目录路径
  buildCaches:
  - node_modules
  # 代码目录扫描额外参数设置
  # ++ 假如有额外需要特殊设置的sonar-project.properties扫描参数请提供
  # ++ 扫描参数参见: https://docs.sonarqube.org/latest/analysis/analysis-parameters/
  sonarExtraSettings:
  - "sonar.junit.reportsPath=target/surefire-reports"

模块镜像打包定义

/docs/01-overview/04-concepts/images/def-package.png

  • 模块镜像打包定义主要用于设置packageImage(镜像打包上传)步骤如何把编译的制品打包成容器镜像,并推送到镜像仓库
  • 重点需要关注 来源构建模块(relatedBuilds),该参数表示需要哪些构建模块先执行编译构建才能打包本模块的容器镜像,注意这里支持多个来源构建模块
  • 详细模块镜像打包定义
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
  # 镜像打包模块名称*
- packageName: tp1-spring-demo
  # 来源构建模块*
  # ++ 镜像打包模块的制品来源于哪些构建模块
  relatedBuilds:
  - tp1-spring-demo
  # Dockerfile* 
  # ++ 请填写dockerfile内容,支持流水线变量
  dockerFile: XXX
  # 把镜像推送到额外的镜像仓库设置
  # ++ 需要把制作的镜像推送到其他镜像仓库情况下需要设置
  extraPushImages:
  # 镜像路径名称
  # ++ 请不要包含镜像标签
  # ++ 格式例如:your.harbor.local:5000/your-path/your-image
  - imagePath: your.harbor.local:5000/your-path/your-image
    # 镜像仓库用户名
    username: xxx
    # 镜像仓库密码
    password: yyy

模块容器部署定义

/docs/01-overview/04-concepts/images/def-package.png

  • 模块镜像打包定义主要用于设置deploy(容器应用部署)步骤如何把容器镜像部署到k8s
  • 重点需要关注 来源镜像打包模块(relatedPackage),该参数表示使用哪个镜像打包模块生成的镜像进行k8s部署
  • 详细模块容器部署定义
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
  # 容器发布模块名称*
- deployName: tp1-spring-demo
  # 来源镜像打包模块*
  # ++ 容器发布模块的制品来源于哪些镜像打包模块
  # @@ 下拉选择,从packageNames中获取
  relatedPackage: tp1-spring-demo
  # 部署方式*
  # ++ 容器发布模块的部署方式
  # @@ 下拉选择 deployment statefulset job cronjob
  deployType: deployment
  # 替换镜像路径
  deployImagePath: xxxx
  # 是否headless服务
  # ++ headless服务不做负载均衡,并且pod之间可以通过域名互相访问,只有deployType为statefulset的时候,可以设置deployHeadless为true
  # @@ 下拉选择 true false
  deployHeadless: true
  # statefulset的管理策略
  # ++ OrderedReady,按顺序启动各个pod
  # ++ Parallel,并行启动各个pod
  # @@ deployType为statefulset的时候可以设置
  # @@ 下拉选择 OrderedReady Parallel
  podManagementPolicy: OrderedReady
  # 容器发布模块的meta头信息定义
  deployMeta:
    # 容器发布模块的额外标签信息
    labels:
      xxx: yyy
    # 容器发布模块的额外注释信息
    annotations:
      xxx: yyy
  # 应用启动的副本实例数*
  # @@ 默认 1
  deployReplicas: 1
  # 应用水平扩缩容设置
  # ++ 注意,仅适用于无状态应用,有状态应用启动水平扩缩容可能引起服务异常
  # ++ 当应用一段时间内实际平均使用的cpu或者内存高于预设值情况下,应用会自动进行水平扩容
  # ++ 当应用水平扩容后,应用一段时间内实际平均使用的cpu或者内存低于预设值情况下,应用会自动进行水平缩容
  # @@ memoryAverageValue memoryAverageRequestPercent cpuAverageValue cpuAverageRequestPercent 必须至少填写其中一个
  hpaConfig:
    # 应用能够扩容的最大副本实例数*
    maxReplicas:
    # 内存平均值
    # ++ 应用一段时间内的内存平均值达到该数值将启动自动扩容(100Mi表示100M内存,1Gi表示1G内存)
    memoryAverageValue:
    # 内存平均百分比
    # ++ 应用一段时间内的内存平均值达到预设值的百分比将启动自动扩容(1 - 100)
    memoryAverageRequestPercent:
    # cpu平均值
    # ++ 应用一段时间内的cpu平均值达到该数值将启动自动扩容(100m表示0.1,表示0.1个CPU)
    cpuAverageValue:
    # cpu平均百分比
    # ++ 应用一段时间内的cpu平均值达到预设值的百分比将启动自动扩容(1 - 100)
    cpuAverageRequestPercent:
  # 会话持久时间
  # ++ 对于多实例的有状态服务,如果需要启用session sticky支持,需要设置session sticky超时时间,单位秒
  deploySessionAffinityTimeoutSeconds: 30
  # 模块的NodePort端口设置
  # ++ 模块应用需要在kubernetes集群外被访问的时候,需要通过NodePort端口对外提供服务
  # @@ 同一个模块deployNodePorts和deployLocalPorts不能同时设置
  deployNodePorts:
    # 模块的内部服务端口号*
  - port: 8000
    # 协议类型*
    # @@ 下拉选择 HTTP TCP UDP SCTP
    # @@ 默认 HTTP
    protocol: HTTP
    # 模块的外部服务端口号*
    # ++ kubernetes集群外通过访问NodePort可以访问到模块的内部端口,请保证项目的管理控制台该nodePort可用,并且nodePort没有复用,否则会无法发布应用。
    # @@ 下拉选择,来源于nodePorts
    nodePort: 30102
  # 模块的内部端口设置
  # ++ 假如模块应用不需要在kubernetes集群外被访问,那么设置内部端口即可
  # @@ 同一个模块deployNodePorts和deployLocalPorts不能同时设置
  deployLocalPorts:
    # 模块的内部服务端口号*
  - port: 9000
    # 协议类型*
    # @@ 下拉选择 HTTP TCP UDP SCTP
    # @@ 默认 HTTP
    protocol: HTTP
    # 启用服务的域名解析
    # ++ kubernetes集群外通过域名和子路径访问该服务
    # ++ 访问方式为 http://${domainName}${pathPrefix}
    ingress:
      # 访问域名*
      # ++ 访问该服务的域名
      domainName: www.test-project1.local
      # 访问子路径*
      # ++ 访问该服务的子路径前缀
      # ++ 必须以/开头并且以/结尾
      pathPrefix: /c/
      # 是否自动创建自签名证书
      # ++ 设置使用https方式访问ingress域名,启用domainName和pathPrefix情况下有效
      # ++ 请保证所有容器部署模块该选项相同
      certSelfSigned: false
      # 代码仓库中的证书路径
      # ++ 设置使用https方式访问ingress域名,启用domainName和pathPrefix情况下有效
      # ++ 假如不启用自动创建自签名证书,需要设置代码仓库中证书和私钥的路径,证书和私钥文件的名字为tls.crt和tls.key
      # ++ 流水线会自动把 <certPath>/test 目录下的tls.crt和tls.key证书保存到test环境的secret中
      # ++ 代码仓库中的证书路径不能以/结尾
      # ++ 请保证所有容器部署模块该选项相同
      certPath: xxx/yyy
  # 环境变量
  # 应用容器中的环境变量设置
  # @@ 需要提供变量名 变量值 两个输入字段
  deployEnvs:
  - JAVA_OPTS=-Xms256m -Xmx256m
  # 启动应用命令行
  deployCommand: 'sh -c "java -jar example.smallest-0.0.1-SNAPSHOT.war 2>&1 | sed \"s/^/[$(hostname)] /\" | tee -a /tp1-spring-demo/logs/tp1-spring-demo.logs"'
  # 启动应用的命令行参数设置
  deployArgs: ["--var1=key1", "--var2=key2"]
  # 应用的资源配额设置
  # ++ 给应用分配多少cpu和内存资源
  deployResources:
    # 内存请求配额*
    # ++ 应用预占的内存,所有应用的预占内存总量如超过节点内存总量将无法启动应用(100Mi表示100M内存,1Gi表示1G内存)
    # @@ 默认 10Mi
    memoryRequest: 10Mi
    # 内存最大配额*
    # ++ 应用可以分配的最大内存资源,所有应用的最大内存配额总量可以超过节点内存总量(200Mi表示200M内存,1Gi表示1G内存)
    # @@ 默认 100Mi
    memoryLimit: 250Mi
    # cpu请求配额*
    # ++ 应用预占的cpu,所有应用的预占cpu总量如超过节点cpu总量将无法启动应用(100m表示0.1,表示0.1个CPU)
    # @@ 默认 10m
    cpuRequest: 0.05
    # cpu最大配额*
    # ++ 应用可以分配的最大cpu资源,所有应用的最大cpu配额总量可以超过节点cpu总量(100m表示0.1,表示0.1个CPU)
    # @@ 默认 100m
    cpuLimit: 0.25
    # 扩展请求资源配额参数设置
    extraRequest:
        # 参数名
    - name: nvidia.com/gpu
        # 参数值
        value: "1"
    # 扩展最大资源配额参数设置
    extraLimit:
        # 参数名
    - name: nvidia.com/gpu
        # 参数值
        value: "1"
  # 应用挂装存储设置  
  # ++ 该应用哪些目录或者文件需要进行持久化到共享存储
  deployVolumes:
    # 容器中挂装的目录或文件的绝对路径*
  - pathInPod: /tp1-spring-demo/logs
    # 持久化卷pvc中目录或文件的相对路径*
    pathInPv: tp1-spring-demo/logs
    # 挂装的pvc名字
    # ++ 如果使用默认pvc请不要填写
    # @@ 下拉选择,从pvcNames中对应的环境中获取下拉列表
    pvc: your-project-pvc
  # 应用状态检查设置
  # ++ 检查应用是否能正常对外提供服务,如果不能正常对外提供服务则进行重启或者标记服务不可访问
  deployHealthCheck:
    # 检查tcp端口是否可连接
    # @@ checkPort、exec、httpGet必须选其一
    checkPort: 9000
    # 执行命令并检查命令执行状态
    # ++ 假如命令状态执行成功表示检查成功
    # @@ checkPort、exec、httpGet必须选其一
    exec: "cat /etc/hosts"
    # 通过http get方法检查是否可连接*
    # ++ 通过http get方法访问指定路径和端口返回的状态码,如果状态码返回2XX-3XX则表示服务正常
    # ++ 建议每个应用单独开发一个http-get方式获取服务健康状态controller
    # @@ checkPort、exec、httpGet必须选其一
    httpGet:
      # 本应用的http路径
      path: /
      # 本应用的http端口*
      port: 9000
      # 请求中自定义的HTTP头
      httpHeaders:
        # httpHeader名称
      - name: Custom-Header
        # httpHeader值
        value: Awesome
      # 请求的scheme
      # @@ 下拉选择 HTTP HTTPS
      scheme: HTTP
    # 启动容器后等待多长时间才启动可访问性检查*
    # ++ 如果检查通过service才可以正常对外访问,单位秒
    # @@ 默认 15
    readinessDelaySeconds: 15
    # 多长时间间隔进行一次可访问性检查*
    # ++ 如果检查通过service才可以正常对外访问,单位秒
    # @@ 默认 5
    readinessPeriodSeconds: 5
    # 启动容器后等待多长时间才启动服务异常检查*
    # ++ 如果检查不通过容器将会自动重启,单位秒
    # @@ 默认 60
    livenessDelaySeconds: 150
    # 多长时间间隔进行一次服务异常检查*
    # ++ 如果检查不通过容器将会自动重启,单位秒
    # @@ 默认 30
    livenessPeriodSeconds: 30
    # 等待多长时间才进行容器启动状态检查*
    # ++ 如果检查通过容器才处于running状态,单位秒
    # @@ 默认 15
    startupDelaySeconds: 15
    # 多长时间间隔进行一次容器启动状态检查*
    # ++ 如果检查通过容器才处于running状态,单位秒
    # @@ 默认 5
    startupPeriodSeconds: 5
  # 服务依赖
  # ++ 启动该服务前必须先保证哪个服务的哪个端口先启动,如果有多个服务依赖请注意依赖的先后顺序
  dependServices:
    # 依赖的服务名
    # ++ 可以是集群内的服务名,也可以是集群外的ip地址或者主机名
  - dependName: tp1-spring-demo
    # 依赖的服务端口
    dependPort: 9000
    # 依赖的服务协议类型
    # @@ 下拉选择 TCP UDP
    # @@ 默认 TCP
    dependType: TCP
    # 依赖服务的URL
    # ++ HttpGet方式确认依赖服务是否可用
    httpGetUrl: 9000
  # 应用容器主机名解析
  # ++ 设置后应用容器中的/etc/hosts将增加相关主机名解析
  hostAliases:
    # 对应的ip地址*
  - ip: 192.168.0.1
    # 对应的主机名*
    # ++ 一个ip地址支持对应多个主机名
    hostnames:
    - "host-name01"
    - "host-name02"
  # 启动应用使用的用户和用户组配置
  # ++ 假如使用容器镜像的默认启动用户请勿配置该选项
  securityContext:
    # 应用运行的用户ID
    # @@ 默认 1000
    runAsUser: 1000
    # 应用运行的用户组ID
    # @@ 默认 0
    runAsGroup: 1000
  # 从代码仓库发送配置文件到容器云的项目共享存储目录的配置
  # ++ 注意,只支持发送到默认pvc共享存储中,不支持发送配置文件到项目自定义挂载的pvc共享存储中
  # ++ 流水线会自动把 ${配置文件所在代码目录相对路径}/test 目录下的所有文件发送到test环境的 ${共享存储项目目录相对路径}目录下
  # @@ 分为两个输入框: 配置文件所在代码目录相对路径 共享存储项目目录相对路径,路径都不能以/开头
  deployConfigSettings:
    # 配置文件所在代码目录相对路径
  - localPath: "Codes/Backend/tp1-gin-demo/config2/"
    # 对应的共享存储pvc,如果不填写表示使用默认共享存储
    pvcName: "xxx1-local-pv"
    # 共享存储项目目录相对路径
    podPath: "tp1-gin-demo/config2/"
  # 把代码中的配置文件保存成kubernetes的configmap
  deployConfigMaps:
    # configmap的名字*
  - name: tp1-configmap1
    # 来源的文件类型*
    # ++ from-file: 来源于文件,把整个文件保存到configmap
    # ++ from-env-file: 来源于环境变量文件,环境变量文件内容格式为"key=value",把环境变量文件中的变量名和变量值以键值对形式保存到configmap
    # @@ 下拉选择 from-file from-env-file
    # @@ 默认 from-file
    fromFileType: from-file
    # 文件所在代码目录相对路径*
    # ++ 支持多个文件,必须填写文件,不能填写目录
    paths:
    - Codes/Backend/tp1-gin-demo/config/a.env
  # 把代码中的配置文件保存成kubernetes的secret
  deploySecrets:
    # secret的名字*
  - name: tp1-secret1
    # secret类型*
    # ++ generic: 普通密钥,把整个文件的内容做成secret
    # ++ docker-registry: 把~/.docker/config.json的内容做成secret
    # ++ tls: 制作tls证书类型的secret
    # @@ 下拉选择 generic docker-registry tls
    # @@ 默认 generic
    secretType: generic
    # 来源的文件类型
    # ++ from-file: 来源于文件,把整个文件保存到secret
    # ++ from-env-file: 来源于环境变量文件,环境变量文件内容格式为"key=value",把环境变量文件中的变量名和变量值以键值对形式保存到secret
    # @@ 下拉选择 from-file from-env-file
    # @@ 默认 from-file
    fromFileType: from-file
    # 文件所在代码目录相对路径
    # ++ 支持多个文件,必须填写文件,不能填写目录
    paths:
    - Codes/Backend/tp1-gin-demo/config/a.env
    # docker的客户端设置文件所在代码目录相对路径
    dockerConfig: Codes/Backend/tp1-gin-demo/config/config.json
    # tls.crt证书文件所在代码目录相对路径
    cert: Codes/Backend/tp1-gin-demo/config/tls.crt
    # tls.key证书文件所在代码目录相对路径
    key: Codes/Backend/tp1-gin-demo/config/tls.key
  # 容器发布模块的生命周期事件设置
  lifecycle:
    # 容器启动后生命周期事件设置
    postStart:
      # 执行命令并检查命令执行状态
      # ++ 假如命令状态执行成功表示检查成功
      # @@ exec、httpGet必须选其一
      exec: "cat /etc/hosts"
      # 执行http get命令*
      # ++ 通过http get方法访问指定路径和端口返回的状态码,如果状态码返回2XX-3XX则表示检查成功
      # @@ exec、httpGet必须选其一
      httpGet:
        # 本应用的http路径
        path: /
        # 本应用的http端口*
        port: 9000
        # 请求中自定义的HTTP头
        httpHeaders:
          # httpHeader名称
        - name: Custom-Header
          # httpHeader值
          value: Awesome
        # 请求的scheme
        # @@ 下拉选择 HTTP HTTPS
        scheme: HTTP
    # 容器停止前生命周期事件设置
    preStop:
      # 执行命令并检查命令执行状态
      # ++ 假如命令状态执行成功表示检查成功
      # @@ exec、httpGet必须选其一
      exec: "cat /etc/hosts"
      # 执行http get命令*
      # ++ 通过http get方法访问指定路径和端口返回的状态码,如果状态码返回2XX-3XX则表示检查成功
      # @@ exec、httpGet必须选其一
      httpGet:
        # 本应用的http路径
        path: /
        # 本应用的http端口*
        port: 9000
        # 请求中自定义的HTTP头
        httpHeaders:
            # httpHeader名称
        - name: Custom-Header
            # httpHeader值
            value: Awesome
        # 请求的scheme
        # @@ 下拉选择 HTTP HTTPS
        scheme: HTTP
  # 容器发布模块的工作目录设置
  workingDir: "/tp1-gin-demo"
  # 容器发布模块的节点选择器设置
  # ++ 容器在包含以下标签的节点上启动
  nodeSelector:
    xxx: yyy
  # 容器发布模块的启动节点名字设置
  # ++ 容器在以下名字的节点上启动
  nodeName: k8s-node01
  # 优雅地停止容器所等待的时长设置
  # ++ 等待容器优雅地停止的时长设置,超过这个时间会直接执行kill容器的操作,单位秒
  # @@ 默认 30
  terminationGracePeriodSeconds: 30
  # 访问该pod的子域名设置
  # ++ 假如不设置子域名,该pod不能通过内部域名访问
  # ++ 假如设置了子域名,该pod可以通过内部域名访问,内部完整域名为: <hostname>.<subdomain>.<pod namespace>.svc.<cluster domain>
  subdomain: "example"
  # 是否启用downwardAPI
  # ++ 假如启用downwardAPI,将会把pod的状态信息暴露成环境变量和文件
  # ++ 包含的环境变量包括: K8S_METADATA_NAME, K8S_METADATA_NAMESPACE, K8S_METADATA_UID, K8S_SPEC_SERVICEACCOUNTNAME, K8S_SPEC_NODENAME, K8S_STATUS_HOSTIP, K8S_STATUS_PODIP, K8S_RESOURCE_LIMITS_CPU, K8S_RESOURCE_REQUESTS_CPU, K8S_RESOURCE_LIMITS_MEMORY, K8S_RESOURCE_REQUESTS_MEMORY
  # ++ pod的labels和annotations信息将会存放在pod容器的/etc/k8s-pod-meta目录
  enableDownwardApi: false
  # 重启策略
  # ++ Always: 非运行状态下一直重启(默认)
  # ++ OnFailure: 异常情况下重启
  # ++ Never: 不重启
  # @@ 下拉选择 Always OnFailure Never
  restartPolicy: Always
  # 任务设置
  # ++ deployType 为 job 或者 cronjob 情况下需要填写
  job:
    # 成功执行多少个子任务表示成功*
    # ++ 默认为1,必须大于1
    completions: 1
    # 可以并行执行多少个子任务*
    # ++ 默认为1,必须大于1
    parallelism: 1
    # 子任务的编号模式
    # ++ NonIndexed: 子任务随机编号,子任务以随机顺序执行(默认)
    # ++ Indexed: 子任务顺序编号,子任务以编号顺序执行
    # @@ 下拉选择 NonIndexed Indexed
    completionMode: NonIndexed
    # 子任务允许失败多少次
    # ++ 默认不设置为6
    backoffLimit: 6
    # 允许任务执行多长时间,单位秒
    # ++ 超过设置时长就会自动结束整个任务
    # ++ 不设置表示不限制时长
    activeDeadlineSeconds: 10
    # 任务结束后多长时间自动删除子任务的容器,单位秒
    # ++ 超过设置时长就会自动删除子任务的容器
    # ++ 不设置表示不自动删除子任务的容器
    ttlSecondsAfterFinished: 10
  # 计划任务设置
  # ++ deployType 为 cronjob 情况下需要填写
  cronJob:
    # 计划任务*
    # 必须遵循crontab的格式
    # 例如: 5 5 * * *
    schedule: "*/5 5 * * *"
    # 计划任务创建的任务执行时发生重叠如何处理
    # ++ Allow: 允许并发任务执行(默认)
    # ++ Forbid: 不允许并发任务执行;如果新任务的执行时间到了而老任务没有执行完,计划任务会忽略新任务的执行
    # ++ Replace: 如果新任务的执行时间到了而老任务没有执行完,计划任务会用新任务替换当前正在运行的任务
    # @@ 下拉选择 Allow Forbid Replace
    concurrencyPolicy: Allow
    # 任务延迟开始的最后期限,单位秒
    # ++ 任务如果由于某种原因错过了调度时间,开始该任务的截止时间的秒数
    # ++ 不设置表示假如超过截止时间,计划任务不会开始该任务的实例
    startingDeadlineSeconds: 10
    # 保留多少已成功的任务
    # ++ 默认为3,设置为0表示不保留
    successfulJobsHistoryLimit: 10
    # 保留多少已失败的任务
    # ++ 默认为1,设置为0表示不保留
    failedJobsHistoryLimit: 10
  # 通过patch方式追加额外的部署参数
  # ++ 假如容器部署定义中的设置参数不满足要求,那么可以使用patch的方式给容器部署追加参数
  # ++ 只有项目名字空间开启特权模式情况下,才能通过patch方式追加额外的部署参数
  patches:
    # 需要patch的资源类型*
    # + 其中deployment表示对deployment或者statefulset进行patch
    # @@ 下拉选择 deployment service hpa
  - resourceKind: deployment
    # patch参数路径*
    # ++ 例如: spec.template.spec.initContainers
    # ++ 假如该路径下不存在对应的部署参数,那么patch路径的部署参数设置直接替换为patch内容
    # ++ 假如该路径下已经存在对应的部署参数,并且部署参数的类型为数组,那么patch内容会追加到patch路径的部署参数中
    # ++ 假如该路径下已经存在对应的部署参数,并且部署参数的类型不为数组,那么不更新部署参数
    path: "spec.template.spec.initContainers"
    # yaml格式patch参数内容*
    # ++ 假如patch路径上是数组,前方务必包含代表数组的 - (减号)
    content: |
      - name: init-myservice
        image: busybox:1.28
        command: ['sh', '-c', "until nslookup myservice.$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local; do echo waiting for myservice; sleep 2; done"]