容器服务
分批发布任务 BatchRelease 引用 statefulset 与 Service,并将2者 yaml 设置数据 Base64加密后在保密字典保存了一份,目前容器服务控制台在操作BatchRelease与其子资源statefulset 与 Service,后台并未同步更新数据,也没有相关提示,导致实际发布的statefulset,Service 在修改,删除等操作后,数据不一致,极其容易导致线上故障。
apiVersion: v1
items:
- apiVersion: alicloud.com/v1beta1
kind: BatchRelease
metadata:
annotations:
aliyun.batchnum: "2"
name: lippi-hermes
namespace: lippi-xxxx
spec:
serviceSecretName: batchrelease-lippi-xxxx-svc.secret
statefulSetSecretName: batchrelease-lippi-xxxx.28802.secret
status:
control: {}
release:
batch_order: "1"
progress: finished
status: WaitingForConfirm
resources:
Service:
name: batchrelease-lippi-xxxx-svc
namespace: lippi-xxxx
StatefulSet:
name: batchrelease-lippi-xxxx
namespace: lippi-hermes
kind: List
具体测试和验证步骤如下:
1. 建立容器服务分批发布任务:
操作过程:
建立分批发布任务,控制台可设置选项只有:
- 镜像地址、版本、secret;
- 容器数量,资源限制和所需资源;
- 访问设置的服务;
- 容器配置的 command;
- 数据卷和环境变量
缺少容器应用配置最常用的就绪检查,存活检查,prestart,prestop,亲和力等设置(初次配置,认为肯定可以修改 yaml 方式修改配置);
保存建立后,容器服务顺利建立分批发布任务,同时在 statefulset和服务建立相应的有状态副本集、服务以及保密字典里保存的 service 和 statefulset 的 yaml(Base64加密,直接在控制台可见)。
根据自己的需求修改 statefulset 的 yaml,增加就绪检查,存活检查,prestop 做优雅下线,保存;
根据自己的需求修改 service 的相关设置,增加https 服务证书等设置
(注意修改了 statefulset 后实际上还需要修改保密字典,如果没有同步修改保密字典的 statefulset 和 service,后面发布会产生配置数据丢失,保密字典可编辑修改,是容器服务近期上线的不错的功能)
2. 更新分批发布任务分批发布
操作过程:
点击分批发布任务的更新,设置条件中没有包含就绪检查,存活检查,prestop等配置选项, 使用 statefulset 并在保密字典修改过的数据卷设置也没法显示,点击保存;
查看有状态副本集 statefulset,之前设置的就绪检查,存活检查,prestop以及数据卷等设置已经丢失。
查看保密字典,生成了一个新的保密字典,之前设置的就绪检查,存活检查,prestop以及数据卷等设置已经丢失。
修复 BUG建议:
- 编辑分批发布任务增加与 statefulset 一致的编辑选项,并提供 yaml 修改方式。
- 编辑完毕更新后,除了更新 statefulset 设置也更新保密字典保存的 statefulset 数据,不要新建保密字典,在原保密字典上保存;
- 编辑 statefulset 后,保存时判断该 statefulset 是否被分批发布任务引用,如果被引用,同步更新分批发布任务的保密字典设置数据。
3. 分批发布执行:
为了测试下面的 bug,继续在 statefulset,保密字典 添加就绪检查,存活检查,prestop以及数据卷等设置;
点击详情,点击新的变更进行分批发布,这个时候控制台不再显示就绪检查,存活检查,prestop,数据卷数据明显来自变更后新自动保存保密字典,丢失了数据,点击更新,这时候查看有状态副本集等配置,就绪检查,存活检查,prestop等数据再次丢失;
修复 BUG建议:
- 变更分批发布任务增加与 statefulset 一致的编辑选项,并提供 yaml 修改方式。
- 变更完毕后,除了更新 statefulset 设置也更新保密字典保存的 statefulset 数据,不要新建保密字典,在原保密字典上保存;
4. 删除分批发布任务
选择分批发布任务,点击删除,任务成功删除,查服务和 statefulset,发现服务,有状态副本集,保密字典,服务对应的 SLB 都被无预警删除干净,slb 包含的设置信息,比如访问控制等都被清除;
修复建议:
- 分批发布任务删除时,必须提示服务和 statefulset等都可能被删除,提供可选是否接连删除的选项后执行;
- 服务删除连带 slb 删除是很容易产生故障的,slb 的地址往往是域名,访问控制等使用的,修复需要一定时间;
5. 修改或删除 statefulset
修改或删除 statefulset,该操作后,如果有分批发布任务关联,并没有随着修改保密字典的 statefulset 数据,如果删除,分批发布任务BatchRelease中引用的 statefulset 并没有清除, 在发布分批发布任务或某种状态下,BatchRease 会按照保密字典的 statefulset 设置,重新建立 statefulset,并发布;
修复建议:
- 修改 statefulset 后,提示确认后,判断是否有分批发布任务引用,如果有修改分批发布任务的保密字典里 statefulset 的设置与 statefulset 保持一致;
- 删除 statefulset 后,提示确认后,判断是否有分批发布任务引用,如果有清理 BatchRelease 里对该任务的引用,删除对该 BatchRelease 里保密字典引用;
6. 修改或删除 service
修改或删除 service,该操作后,如果有分批发布任务关联,并没有随着修改保密字典的 service 数据,如果删除,分批发布任务BatchRelease中引用的 service 并没有清除;
修复建议:
- 修改 service 后,提示确认后,判断是否有分批发布任务引用,如果有修改分批发布任务的保密字典里 service 的设置与 service 保持一致;
- 删除 service 后,提示确认后,判断是否有分批发布任务引用,如果有清理 BatchRelease 里对该任务的引用,删除对该 service 里保密字典引用;