Zadig 的服务可以是一组 Kubernetes 资源集合(下面简称 K8s YAML)、一个完整的 Helm Chart 或者是主机服务。下面分别介绍这几种类型的服务操作。

K8s YAML 服务

新增服务

项目中点击服务部分,进入服务管理页面。

创建服务

K8s YAML 服务的创建支持平台管理、代码仓库托管以及从 K8s YAML 模板导入三种方式:

  • 平台管理:在创建服务时手动输入服务的 K8s YAML 配置文件,内容存储在 Zadig 系统中。
  • 仓库托管:服务的相关 K8s YAML 配置文件托管在代码仓库中,可通过在 Zadig 平台配置好 YAML 文件的目录路径后导入该部分配置。支持两种方式来从代码仓库中同步服务的 K8s YAML 配置文件:

    • 手动同步:点击加载按钮,获取仓库中最新的配置。
    • 自动同步:通过配置 Webhook(参阅 Webhook 配置),Zadig 监听分支上有代码改动,对应的服务配置会被自动同步。

    在 Zadig v1.3.0及以上版本中,创建服务时选择从代码库导入后,Zadig 系统会自动完成在代码平台的 Webhook 设置用于配置文件同步,用户无需再次手动配置。

  • 从 K8s YAML 模板导入:事先在平台中创建 K8s YAML 模板,创建服务时,在模板的基础上对服务进行重新定义。

平台管理

  • 点击新建按钮新建服务。

创建服务

  • 输入新的服务名称。

创建服务

  • 将服务 YAML 填入编辑器并保存。

创建服务

  • 更新环境,该服务会自动加入到选择的环境中。

更新环境

仓库托管

  • 选择仓库托管,选择代码仓库
  • 选择服务配置所在文件目录,加载服务

从模板导入

前提

需要先在系统模板库里创建 K8s YAML 模板,请参考 K8s YAML 模板管理

  • 访问使用 K8s YAML 部署的项目的服务模块,点击+按钮新建服务,输入服务名称后,点击从模板导入

使用 K8s YAML 模板

  • 选择具体的 K8s YAML 模板后,可修改模板中预定义的变量值。点击确定后即可基于模板和新的赋值创建服务成功。

解锁模板中变量的更多使用姿势

  1. 在 K8s YAML 模板中定义变量并赋予默认常量值。从模板导入服务时,对默认值进行修改,见下图中的 MyVersion 变量和 MemoryLimits 变量。

  2. 在 K8s YAML 模板中定义变量并赋予系统支持的变量值,见下图中的 IngressPrefix 变量和 CPULimitsInTemplate 变量。系统支持被赋值的变量可参考变量配置

使用 K8s YAML 模板

更新服务

平台管理

  • 修改服务 YAML 并保存。

修改服务

  • 选择相应环境进行更新。

更新环境中的服务

仓库托管

  • 提交服务配置变更到代码仓库

配置变更

  • 变更合并到主干分支后,通过 Webhook 的能力自动同步最新配置到 Zadig 系统。也可以在界面上手动同步服务配置,如下图所示。

服务手动配置同步

  • 在 Zadig 集成环境中,查看服务配置的变更,点击服务更新按钮执行更新操作

服务版本diff 服务更新

删除服务

  • 服务 模块中将服务配置删除。
  • 更新环境,将删除的服务从相应环境中移除。

删除环境

服务编排

Zadig 系统支持对多个服务进行编排,重新组合定义多个服务的启动顺序,适用于多个服务的启动顺序有先后依赖关系的场景。

访问项目的服务,点击服务编排图标,按照实际需要对服务启动顺序进行拖拽组合。

K8s 服务编排

提示

服务编排启动顺序改变后,已创建的集成环境将会变为可更新状态,对集成环境进行更新即可按照最新启动顺序更新服务。

K8s 环境可更新

共享服务

一个 K8s YAML 服务在某个项目中被设置为共享后,可被添加到使用 K8s YAML 部署的其他项目中去,参与该项目的服务编排。

  • 设置共享服务:访问项目的服务,点击选中需要被设置为共享的服务,勾选共享服务复选框即可设置该服务为共享服务。

设置 K8s YAML 共享服务

  • 使用共享服务:访问另一个项目的服务,可查看共享服务列表,点击服务右侧的+即可将该服务添加到当前项目中,在该项目的服务列表中,会有共享字段标识。

添加 K8s YAML 共享服务

更多小知识

使用共享服务只是复用服务的定义,并不是共享服务实例。在不同项目的集成环境中,相同的共享服务也是独立的服务实例。

变量配置

变量主要分为系统内置变量和自定义变量,均可在服务 YAML 中进行引用。

变量

添加服务或者更新服务时可创建或更新变量

系统内置变量

包括 $Namespace$$Product$$Service$$EnvName$ ,可直接在 YAML 中进行引用,具体说明如下:

  • $Namespace$:项目创建的集成环境所在的 K8s 空间名称
  • $Product$:项目名称
  • $Service$:服务名称
  • $EnvName$:创建的集成环境名称

自定义变量

通过平台新增 Key,可输入默认 Value,通过关键字:{{.key}} 引用

例如:在 K8s YAML 中引用配置的变量

  1. apiVersion: extensions/v1beta1
  2. kind: Ingress
  3. metadata:
  4. name: $Product$-index //引用系统内置变量 $Product$,环境创建时被渲染
  5. spec:
  6. rules:
  7. - host: {{.portal_host}} //引用自定义变量 portal_host,环境创建时被渲染
  8. http:
  9. paths:
  10. - backend:
  11. serviceName: $Product$-index
  12. servicePort: 80
  13. path: /

变量的使用

创建集成环境时使用

在集成环境创建时,对项目中所有服务的 YAML 和服务配置文件进行渲染。

创建集成环境变量渲染

环境变量更新时使用

在集成环境中,对于正常运行中的服务,可以自行更新变量值,基本操作中点击更新环境变量,即可更新对应集成环境中的环境变量。

更新集成环境变量渲染

服务 YAML 样例

无状态服务

概念:服务运行的实例不会在本地存储需要持久化的数据,并且多个实例对于同一个请求响应的结果是完全一致的。可以参考这篇文章 服务 - 图22 (opens new window)了解无状态服务的更多细节。

点击查看

  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. name: nginx-deployment
  5. spec:
  6. selector:
  7. matchLabels:
  8. app: nginx
  9. replicas: 2 # 2 个 Pod 实例
  10. template:
  11. metadata:
  12. labels:
  13. app: nginx
  14. spec:
  15. containers:
  16. - name: nginx
  17. image: nginx:1.14.2
  18. ports:
  19. - containerPort: 80

有状态服务

概念:服务的实例可以将一部分数据随时进行备份,并且在创建一个新的有状态服务时,可以通过备份恢复这些数据,以达到数据持久化的目的。可以参考这篇文章 服务 - 图23 (opens new window)了解有状态服务的更多细节。

点击查看

  1. apiVersion: v1
  2. kind: ConfigMap
  3. metadata:
  4. name: mysql
  5. labels:
  6. app: mysql
  7. data:
  8. master.cnf: |
  9. # Apply this config only on the master.
  10. [mysqld]
  11. log-bin
  12. slave.cnf: |
  13. # Apply this config only on slaves.
  14. [mysqld]
  15. super-read-only
  16. ---
  17. # Headless service for stable DNS entries of StatefulSet members.
  18. apiVersion: v1
  19. kind: Service
  20. metadata:
  21. name: mysql
  22. labels:
  23. app: mysql
  24. spec:
  25. ports:
  26. - name: mysql
  27. port: 3306
  28. clusterIP: None
  29. selector:
  30. app: mysql
  31. ---
  32. # Client service for connecting to any MySQL instance for reads.
  33. # For writes, you must instead connect to the master: mysql-0.mysql.
  34. apiVersion: v1
  35. kind: Service
  36. metadata:
  37. name: mysql-read
  38. labels:
  39. app: mysql
  40. spec:
  41. ports:
  42. - name: mysql
  43. port: 3306
  44. selector:
  45. app: mysql
  46. ---
  47. apiVersion: apps/v1beta1
  48. kind: StatefulSet
  49. metadata:
  50. name: mysql
  51. spec:
  52. selector:
  53. matchLabels:
  54. app: mysql
  55. serviceName: mysql
  56. # 1 master and 2 slave
  57. replicas: 3
  58. template:
  59. metadata:
  60. labels:
  61. app: mysql
  62. spec:
  63. initContainers:
  64. - name: init-mysql
  65. image: mysql:5.7
  66. command:
  67. - bash
  68. - "-c"
  69. - |
  70. set -ex
  71. # Generate mysql server-id from pod ordinal index.
  72. [[ `hostname` =~ -([0-9]+)$ ]] || exit 1
  73. ordinal=${BASH_REMATCH[1]}
  74. echo [mysqld] > /mnt/conf.d/server-id.cnf
  75. # Add an offset to avoid reserved server-id=0 value.
  76. echo server-id=$((100 + $ordinal)) >> /mnt/conf.d/server-id.cnf
  77. # Copy appropriate conf.d files from config-map to emptyDir.
  78. if [[ $ordinal -eq 0 ]]; then
  79. cp /mnt/config-map/master.cnf /mnt/conf.d/
  80. else
  81. cp /mnt/config-map/slave.cnf /mnt/conf.d/
  82. fi
  83. volumeMounts:
  84. - name: conf
  85. mountPath: /mnt/conf.d
  86. - name: config-map
  87. mountPath: /mnt/config-map
  88. - name: clone-mysql
  89. image: gcr.azk8s.cn/google-samples/xtrabackup:1.0
  90. command:
  91. - bash
  92. - "-c"
  93. - |
  94. set -ex
  95. # Skip the clone if data already exists.
  96. [[ -d /var/lib/mysql/mysql ]] && exit 0
  97. # Skip the clone on master (ordinal index 0).
  98. [[ `hostname` =~ -([0-9]+)$ ]] || exit 1
  99. ordinal=${BASH_REMATCH[1]}
  100. [[ $ordinal -eq 0 ]] && exit 0
  101. # Clone data from previous peer.
  102. ncat --recv-only mysql-$(($ordinal-1)).mysql 3307 | xbstream -x -C /var/lib/mysql
  103. # Prepare the backup.
  104. xtrabackup --prepare --target-dir=/var/lib/mysql
  105. volumeMounts:
  106. - name: data
  107. mountPath: /var/lib/mysql
  108. subPath: mysql
  109. - name: conf
  110. mountPath: /etc/mysql/conf.d
  111. containers:
  112. - name: mysql
  113. image: mysql:5.7
  114. env:
  115. - name: MYSQL_ALLOW_EMPTY_PASSWORD
  116. value: "1"
  117. ports:
  118. - name: mysql
  119. containerPort: 3306
  120. volumeMounts:
  121. - name: data
  122. mountPath: /var/lib/mysql
  123. subPath: mysql
  124. - name: conf
  125. mountPath: /etc/mysql/conf.d
  126. resources:
  127. requests:
  128. cpu: 500m
  129. memory: 1Gi
  130. limits:
  131. cpu: 500m
  132. memory: 1Gi
  133. livenessProbe:
  134. exec:
  135. command: ["mysqladmin", "ping"]
  136. initialDelaySeconds: 30
  137. periodSeconds: 10
  138. timeoutSeconds: 5
  139. readinessProbe:
  140. exec:
  141. # Check we can execute queries over TCP (skip-networking is off).
  142. command: ["mysql", "-h", "127.0.0.1", "-e", "SELECT 1"]
  143. initialDelaySeconds: 5
  144. periodSeconds: 2
  145. timeoutSeconds: 1
  146. - name: xtrabackup
  147. image: gcr.azk8s.cn/google-samples/xtrabackup:1.0
  148. ports:
  149. - name: xtrabackup
  150. containerPort: 3307
  151. command:
  152. - bash
  153. - "-c"
  154. - |
  155. set -ex
  156. cd /var/lib/mysql
  157. # Determine binlog position of cloned data, if any.
  158. if [[ -f xtrabackup_slave_info && "x$(<xtrabackup_slave_info)" != "x" ]]; then
  159. # XtraBackup already generated a partial "CHANGE MASTER TO" query
  160. # because we're cloning from an existing slave. (Need to remove the tailing semicolon!)
  161. cat xtrabackup_slave_info | sed -E 's/;$//g' > change_master_to.sql.in
  162. # Ignore xtrabackup_binlog_info in this case (it's useless).
  163. rm -f xtrabackup_slave_info xtrabackup_binlog_info
  164. elif [[ -f xtrabackup_binlog_info ]]; then
  165. # We're cloning directly from master. Parse binlog position.
  166. [[ `cat xtrabackup_binlog_info` =~ ^(.*?)[[:space:]]+(.*?)$ ]] || exit 1
  167. rm -f xtrabackup_binlog_info xtrabackup_slave_info
  168. echo "CHANGE MASTER TO MASTER_LOG_FILE='${BASH_REMATCH[1]}',\
  169. MASTER_LOG_POS=${BASH_REMATCH[2]}" > change_master_to.sql.in
  170. fi
  171. # Check if we need to complete a clone by starting replication.
  172. if [[ -f change_master_to.sql.in ]]; then
  173. echo "Waiting for mysqld to be ready (accepting connections)"
  174. until mysql -h 127.0.0.1 -e "SELECT 1"; do sleep 1; done
  175. echo "Initializing replication from clone position"
  176. mysql -h 127.0.0.1 \
  177. -e "$(<change_master_to.sql.in), \
  178. MASTER_HOST='mysql-0.mysql', \
  179. MASTER_USER='root', \
  180. MASTER_PASSWORD='', \
  181. MASTER_CONNECT_RETRY=10; \
  182. START SLAVE;" || exit 1
  183. # In case of container restart, attempt this at-most-once.
  184. mv change_master_to.sql.in change_master_to.sql.orig
  185. fi
  186. # Start a server to send backups when requested by peers.
  187. exec ncat --listen --keep-open --send-only --max-conns=1 3307 -c \
  188. "xtrabackup --backup --slave-info --stream=xbstream --host=127.0.0.1 --user=root"
  189. volumeMounts:
  190. - name: data
  191. mountPath: /var/lib/mysql
  192. subPath: mysql
  193. - name: conf
  194. mountPath: /etc/mysql/conf.d
  195. resources:
  196. requests:
  197. cpu: 100m
  198. memory: 100Mi
  199. volumes:
  200. - name: conf
  201. emptyDir: {}
  202. - name: config-map
  203. configMap:
  204. name: mysql
  205. volumeClaimTemplates:
  206. - metadata:
  207. name: data
  208. spec:
  209. accessModes: ["ReadWriteOnce"]
  210. resources:
  211. requests:
  212. storage: 10Gi

Helm Chart 服务

Helm 服务 - 图24 (opens new window) 是 Kubernetes 应用的包管理工具, Helm Chart 定义、安装和升级复杂的 Kubernetes 应用。

新增服务

新增服务,服务定义支持三种来源:Git 仓库、Chart 仓库[建设中]、模板库。

访问使用 Helm Chart 部署的项目,点击服务部分,进入服务管理页面。下面分别介绍从 Git 仓库和模板库创建服务。

Helm Chart 项目预览

Git 仓库

Helm Chart 相关配置托管于指定的 Git 仓库中,将配置从 Git 仓库中导入至 Zadig 系统内。

  • 点击 + 新建服务,填写代码仓库相关信息及 Helm Chart 配置文件目录路径,加载服务。

前提

需要先集成代码源,参考 GitLab 集成/GitHub 集成

从 Git 仓库导入 Helm Chart

模板库

Helm Chart 相关配置托管于 Zadig 系统的 Helm Chart 模板中,服务可以基于模板创建。支持一次创建一个服务,也支持基于模板批量创建服务。

前提

需要先在系统模板库里创建 Helm Chart 模板,请参考 Helm Chart 模板管理

创建单个服务
  • 点击 + 按钮,选择从模板库新建服务,填写服务名称并选择模板,按需对模板中的变量进行覆盖赋值后,导入即可。

从 Git 仓库导入 Helm Chart

  • 高级设置中,系统还支持用新的 values.yaml 覆盖模板中的内容,包括手动输入和从指定 Git 仓库导入两种途径来覆盖。

从 Git 仓库导入 Helm Chart

批量创建服务
  • 点击 + 按钮,选择从模板库新建服务,点击批量创建

从 Helm Chart 模板导入服务

  • 选择 Helm Chart 模板,选择要导入服务的 values 文件,导入即可。

从 Helm Chart 模板导入服务

  • 一份 values 文件会被定义成一个服务,values 文件名即为服务名。服务批量创建完毕后,点击更新环境即可将服务快速应用于环境中。

预览从 Helm Chart 模板导入服务后效果

服务组件镜像信息自定义

导入 Helm Chart 配置文件后,系统会按照内置规则解析 vaues.yaml 文件中的镜像内容。当默认规则不满足需求时,用户可自定义镜像解析规则。

Helm Chart 服务组件自定义

Zadig 系统会解析镜像名为可被部署和更新的服务组件,系统关于 values.yaml 中服务组件内置的解析规则如下:

  1. values.yaml 中有如下代码段结构,拼接 image.repository:image.tag 作为该组件的镜像版本,服务的部署版本和更新均围绕 image.repositoryimage.tag。该例中即为:ccr.ccs.tencentyun.com/koderover-public/backend:latest

点击查看

  1. # Helm Chart values.yaml Demo
  2. key1: value1
  3. key2: value2
  4. key3:
  5. key4: value4
  6. key5:
  7. image:
  8. repository: "ccr.ccs.tencentyun.com/koderover-public/backend"
  9. tag: "latest"
  10. key6:
  11. ...
  12. ...
  1. values.yaml 中的 image 字段的值为镜像信息,服务的部署版本和更新均围绕 image。该例中即为 ccr.ccs.tencentyun.com/koderover-public/backend:latest

点击查看

  1. # Helm Chart values.yaml Demo
  2. key1: value1
  3. key2: value2
  4. key3:
  5. key4: value4
  6. key5:
  7. image: "ccr.ccs.tencentyun.com/koderover-public/backend:latest"
  8. key6:
  9. ...
  10. ...
  1. 用户也可自定义解析规则,提供关于镜像的明确信息。假设您的 values.yaml 文件中关于镜像部分的信息如下,自定义规则中填入 deploy.image.repo/deploy.image.name:deploy.image.tag 即可。

点击查看

  1. deploy:
  2. image:
  3. repo: library
  4. name: ubuntu
  5. tag: 12.04
  1. 自定义规则中的 仓库地址/命名空间标签名 非必填,下例中,在自定义规则的镜像名中填入 deploy.image.name 即可

点击查看

  1. deploy:
  2. image:
  3. name: library/ubuntu:12.04

更新服务

从 Git 仓库导入的服务

  • 服务模块,选择服务,点击服务右侧的同步按钮,点击加载同步最新的服务配置。

更新 Helm Chart 服务

基于模板创建的服务

  • 服务模块,选择服务,点击服务右侧的同步按钮,按需修改变量和 values 文件,点击导入即可。

更新 Helm Chart 服务

删除服务

  • 服务模块中将服务配置删除。
  • 点击 更新环境按钮,将删除的服务从相应环境中移除。

Git 仓库删除服务

Helm Chart 样例

建设中,敬请期待

托管项目服务

在 Zadig v1.5.0及以上版本中,支持对 Kubernetes 集群指定命名空间的资源进行托管,实现跨集群服务管理。

配置托管服务

  • 在托管项目中点击环境,进入环境管理页面,进行托管服务管理。

托管服务

  • 点击配置托管,对 dev 环境的服务进行管理。

配置托管

  • 按需选择左侧列表中的服务拖至右侧,点击下一步,新增对该服务的托管管理。

更新服务

可通过对服务进行左右侧拖动,实现对托管服务的调整和管理。

增删服务

  • 可对新加入的服务配置构建,以便使用工作流对托管的服务进行自动部署更新。

主机服务

在 Zadig 系统上主机服务的定义主要包括服务的构建脚本、资源配置、部署配置和探活配置。

新增服务

  • 项目中点击服务部分,进入服务管理页面。

新增服务

  • 点击新建按钮新建服务。

新增服务

  • 输入服务名称。

新增服务

构建脚本

  • 配置构建脚本,定义服务的构建打包过程。

主机服务的构建脚本相关配置说明,参考构建模块

资源配置

  • 通过资源配置,关联对应集成环境使用的主机资源。

需事先在系统设置 -> 主机管理 中添加主机资源,参考主机管理

关联主机

部署配置

  • 配置部署脚本,定义服务的部署过程。

部署脚本

说明:

  • 部署方式:
    • 本地直连部署:直接在 Zadig 所在集群中执行部署操作,需确保 Zadig 系统能连通或访问到脚本中的主机地址。
    • 使用 SSH Agent 远程部署:安全登录到目标机器,执行部署操作。
  • 部署脚本和构建脚本共享存储卷,在构建脚本中生成的包在部署脚本中直接获取。
  • 部署脚本可以使用构建脚本中系统内置变量,构建包需使用 $PKG_FILE 获取。

探活配置

配置探活

字段说明:

  • 协议:支持 HTTP、HTTPS 和 TCP。
  • 路径:HTTP/HTTPS 请求的健康检查路径。
  • 端口:支持 1 - 65535 端口。
  • 响应超时:超出设定时间,判断为不健康。
  • 高级设置
    • 探测间隔:两次探活请求的间隔时间,默认 2s。
    • 健康阈值:从不健康变为健康的连续探测次数。
    • 不健康阈值:从健康变为不健康的连续探测次数。

更新服务

  • 选择需要修改的服务。

更新服务

  • 修改服务配置,点击保存-> 点击更新环境->在弹框中选择需要更新的环境。

更新服务 更新服务

删除服务

  • 服务 模块中将服务配置删除。

删除服务

  • 更新环境,将删除的服务从相应的环境中移除。

删除服务