6.2. 为 Validation 服务创建自定义规则
Validation 服务使用 Open Policy Agent(OPA)策略规则来检查要迁移的每个虚拟机(VM)的适用性。Validation 服务为每个虚拟机生成 问题 列表,它们作为虚拟机属性存储在 Provider Inventory 服务中。Web 控制台显示供应商清单中的每个虚拟机的顾虑。
您可以创建自定义规则来扩展 Validation 服务的默认规则集。例如,您可以创建一个规则来检查虚拟机是否有多个磁盘。
6.2.1. 关于 Rego 文件 复制链接链接已复制到粘贴板!
验证规则使用 Rego 编写,即 Open Policy Agent (OPA) 原生查询语言。规则作为 .rego 文件存储在 Validation pod 的 /usr/share/opa/policies/io/konveyor/forklift/<provider> 目录中。
每个验证规则都在单独的 .rego 文件中定义,以及对特定条件的测试。如果条件评估为 true,则该规则会将 {"category", "label", "assessment"} hash 添加到 concerns 中。concerns 内容将添加到虚拟机清单记录中的 concerns 键中。Web 控制台显示供应商清单中每个虚拟机的 concerns 键的内容。
以下 .rego 文件示例检查在 VMware 虚拟机的集群中启用了分布式资源调度:
drs_enabled.rego 示例
6.2.2. 检查默认验证规则 复制链接链接已复制到粘贴板!
在创建自定义规则前,您必须检查 Validation 服务的默认规则,以确保您不会创建重新定义现有默认值的规则。
示例:如果默认规则包含行 default valid_input = false,并且您创建一个包含行 default valid_input = true,则 Validation 服务将不会启动。
流程
连接到
Validationpod 的终端:oc rsh <validation_pod>
$ oc rsh <validation_pod>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 进入您的供应商的 OPA 策略目录:
cd /usr/share/opa/policies/io/konveyor/forklift/<provider>
$ cd /usr/share/opa/policies/io/konveyor/forklift/<provider>1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 指定
vmware或ovirt。
搜索默认策略:
grep -R "default" *
$ grep -R "default" *Copy to Clipboard Copied! Toggle word wrap Toggle overflow
6.2.3. 检索库存服务 JSON 复制链接链接已复制到粘贴板!
您可以通过向虚拟机发送一个 Inventory 服务查询来获取 Inventory 服务 JSON。输出中包含一个 "input" 键,其中包含由 Validation 服务规则查询的清单属性。
您可以根据 "input" 键中的任何属性(如 input.snapshot.kind )创建验证规则。
流程
为项目检索路由:
oc get route -n openshift-mtv
oc get route -n openshift-mtvCopy to Clipboard Copied! Toggle word wrap Toggle overflow 检索
Inventory服务路由:oc get route <inventory_service> -n openshift-mtv
$ oc get route <inventory_service> -n openshift-mtvCopy to Clipboard Copied! Toggle word wrap Toggle overflow 检索访问令牌:
TOKEN=$(oc whoami -t)
$ TOKEN=$(oc whoami -t)Copy to Clipboard Copied! Toggle word wrap Toggle overflow 触发 HTTP GET 请求(例如,使用 Curl):
curl -H "Authorization: Bearer $TOKEN" https://<inventory_service_route>/providers -k
$ curl -H "Authorization: Bearer $TOKEN" https://<inventory_service_route>/providers -kCopy to Clipboard Copied! Toggle word wrap Toggle overflow 检索供应商的
UUID:curl -H "Authorization: Bearer $TOKEN" https://<inventory_service_route>/providers/<provider> -k
$ curl -H "Authorization: Bearer $TOKEN" https://<inventory_service_route>/providers/<provider> -k1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 供应商允许的值是
vsphere、ovirt和openstack。
检索供应商的虚拟机:
curl -H "Authorization: Bearer $TOKEN" https://<inventory_service_route>/providers/<provider>/<UUID>/vms -k
$ curl -H "Authorization: Bearer $TOKEN" https://<inventory_service_route>/providers/<provider>/<UUID>/vms -kCopy to Clipboard Copied! Toggle word wrap Toggle overflow 检索虚拟机的详情:
curl -H "Authorization: Bearer $TOKEN" https://<inventory_service_route>/providers/<provider>/<UUID>/workloads/<vm> -k
$ curl -H "Authorization: Bearer $TOKEN" https://<inventory_service_route>/providers/<provider>/<UUID>/workloads/<vm> -kCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
6.2.4. 创建验证规则 复制链接链接已复制到粘贴板!
您可以通过将包含规则的配置映射自定义资源(CR)应用到 Validation 服务来创建验证规则。
-
如果您创建与现有规则相同的规则,
Validation服务将使用规则执行OR操作。 -
如果您创建使用默认规则迭代的规则,则
Validation服务将不会启动。
验证规则示例
验证规则基于由 Provider Inventory 服务收集的虚拟机(VM)属性。
例如,VMware API 使用此路径来检查 VMware 虚拟机是否配置了 NUMA 节点关联性:MOR:VirtualMachine.config.extraConfig["numa.nodeAffinity"]。
Provider Inventory 服务使用列表值简化了此配置并返回一个可测试属性:
"numaNodeAffinity": [
"0",
"1"
],
"numaNodeAffinity": [
"0",
"1"
],
您可以根据此属性创建一个 Rego 查询,并将其添加到 forklift-validation-config 配置映射中:
`count(input.numaNodeAffinity) != 0`
`count(input.numaNodeAffinity) != 0`
流程
根据以下示例创建配置映射 CR:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 通过将
forklift-controller部署扩展到0来停止Validationpod:oc scale -n openshift-mtv --replicas=0 deployment/forklift-controller
$ oc scale -n openshift-mtv --replicas=0 deployment/forklift-controllerCopy to Clipboard Copied! Toggle word wrap Toggle overflow 通过将
forklift-controller部署扩展到1来启动Validationpod:oc scale -n openshift-mtv --replicas=1 deployment/forklift-controller
$ oc scale -n openshift-mtv --replicas=1 deployment/forklift-controllerCopy to Clipboard Copied! Toggle word wrap Toggle overflow 检查
Validationpod 日志,以验证 pod 是否已启动:oc logs -f <validation_pod>
$ oc logs -f <validation_pod>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果自定义规则与默认规则冲突,则
Validationpod 将不会启动。删除源供应商:
oc delete provider <provider> -n openshift-mtv
$ oc delete provider <provider> -n openshift-mtvCopy to Clipboard Copied! Toggle word wrap Toggle overflow 添加源供应商以应用新规则:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
您必须在创建自定义规则后更新规则版本,以便 Inventory 服务检测到更改并验证虚拟机。
6.2.5. 更新清单规则版本 复制链接链接已复制到粘贴板!
每次更新规则时,您必须更新 inventory 规则版本,以便 Provider Inventory 服务检测到更改并触发 Validation 服务。
规则版本记录在每个供应商的 rules_version.rego 文件中。
流程
检索当前的规则版本:
GET https://forklift-validation/v1/data/io/konveyor/forklift/<provider>/rules_version
$ GET https://forklift-validation/v1/data/io/konveyor/forklift/<provider>/rules_version1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
{ "result": { "rules_version": 5 } }{ "result": { "rules_version": 5 } }Copy to Clipboard Copied! Toggle word wrap Toggle overflow 连接到
Validationpod 的终端:oc rsh <validation_pod>
$ oc rsh <validation_pod>Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
更新
/usr/share/opa/policies/io/konveyor/forklift/<provider>/rules_version.rego文件中的规则版本。 -
从
Validationpod 终端注销。 验证更新的规则版本:
GET https://forklift-validation/v1/data/io/konveyor/forklift/<provider>/rules_version
$ GET https://forklift-validation/v1/data/io/konveyor/forklift/<provider>/rules_version1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
{ "result": { "rules_version": 6 } }{ "result": { "rules_version": 6 } }Copy to Clipboard Copied! Toggle word wrap Toggle overflow