从OpenShift模板挑选对象:按顺序部署特定DeploymentConfig的需求
我明白你的痛点——一个大模板里塞了20个DeploymentConfig和对应的Service,直接用oc new-app --template=my-template会一股脑全启动,完全不管部署顺序的依赖,而且官方也没提供直接指定单个DC部署的选项,selector参数也解决不了这个问题。下面给你几个实际能用的解决方案,你可以根据自己的场景选:
1. 拆分模板为多个依赖子集
最直观的方法就是把原大模板拆成几个小模板,按照你的部署顺序分组。比如:
- 第一组模板:包含所有需要最先部署的Service和它们对应的DC
- 第二组模板:依赖第一组的后续Service和DC
- 以此类推
部署的时候就按顺序执行:
# 先部署第一组 oc new-app --template=my-template-group-1 # 等这组资源都就绪后,再部署第二组 oc new-app --template=my-template-group-2 # 直到所有组部署完成
这个方法的好处是逻辑清晰,符合OpenShift模板的设计思路,拆分后的小模板还能单独复用,适合依赖关系比较固定的场景。
2. 用脚本解析模板,按顺序逐个创建资源
如果你不想修改原模板,可以把模板导出成YAML,然后用工具提取指定资源,按你要的顺序逐个创建。比如用yq(YAML处理工具)来做:
首先导出模板:
oc get template my-template -o yaml > my-template.yaml
然后按顺序创建资源(比如先创建指定的Service,再创建对应的DC):
# 先创建第一个依赖的Service yq e '.objects[] | select(.kind == "Service" and .metadata.name == "service-1")' my-template.yaml | oc create -f - # 再创建第二个Service yq e '.objects[] | select(.kind == "Service" and .metadata.name == "service-2")' my-template.yaml | oc create -f - # 等Service就绪后,创建对应的DC yq e '.objects[] | select(.kind == "DeploymentConfig" and .metadata.name == "dc-1")' my-template.yaml | oc create -f - yq e '.objects[] | select(.kind == "DeploymentConfig" and .metadata.name == "dc-2")' my-template.yaml | oc create -f -
这种方式可以精确控制每一个资源的创建顺序,完全不需要改动原模板,适合临时处理复杂的部署顺序要求。
3. 给DeploymentConfig加Init容器,实现自动等待依赖
如果你的依赖关系是“某个DC必须等对应的Service就绪才能启动”,可以给DC加一个Init容器,让它自动检查依赖的Service是否可用,只有满足条件后才启动主容器。这样你甚至可以直接用oc new-app --template=my-template,DC会自己等待依赖。
比如在DC的Pod模板里加这样的Init容器:
spec: template: spec: initContainers: - name: wait-for-service image: busybox:1.35 command: ['sh', '-c', 'until nslookup service-1.default.svc.cluster.local; do echo "Waiting for service-1 to be ready..."; sleep 2; done;']
这个Init容器会一直尝试解析依赖Service的DNS,直到解析成功(说明Service已经就绪),才会退出并启动主容器。这个方法不需要拆分模板,也不需要额外脚本,适合依赖关系是“服务就绪等待”的场景。
4. 用OpenShift Applier工具做规范化部署
如果你的项目是长期维护的复杂场景,可以试试OpenShift Applier(基于Ansible的工具)。它允许你在Inventory文件里定义资源的部署顺序,甚至可以配置依赖检查,自动按顺序部署所有资源。不过这个需要花点时间学习工具的使用,但一旦搭建好,长期维护会非常方便。
内容的提问来源于stack exchange,提问作者Cosmo

