数据库同步错误处理¶
本文档描述了如何处理数据库同步错误。
数据库同步描述¶
如果 TackerDB 和 Kubernetes 之间存在 Pod 信息差异(Pod 数量、Pod 名称),Tacker 将针对所有 VNF 实例将 TackerDB 信息与 Kubernetes 信息同步,并根据 VNFD 中定义的伸缩策略进行同步。
注意
TackerDB 和 Kubernetes 之间数据库同步任务的间隔为 300 秒。您可以在 /etc/tacker/tacker.conf 中更改它
$ vim /etc/tacker/tacker.conf
db_synchronization_interval = 300
数据库同步错误¶
数据库同步过程中存在一些错误和相应的错误处理操作。
Pod 的最大或最小数量超出范围
计算伸缩级别错误
- LCM 操作
与 LCM 操作冲突
LCM 操作状态异常
Pod 的最大或最小数量超出范围¶
在同步期间,Tacker 将检查 Pod 的最大或最小数量的范围。如果发现超出范围,Tacker 将输出错误日志,并且不会更新数据库。
当 tacker-conductor.log 包含以下错误日志时,表示 Pod 的最大或最小数量超出范围。
注意
如果您没有 tacker-conductor.log,可以执行以下 CLI 命令查找日志。
journalctl -u devstack@tacker-conductor
错误日志
Failed to update database vnf 81c4be9d-25ad-4726-8640-f2c4c326de2e vdu: VDU1. Pod num is out of range. pod_num: 5
错误处理操作
要解决此错误,您可以采取以下方法:
检查 VNFD 中 Pod 的最大或最小数量范围。
更改 Kubernetes 中 Pod 数量的定义。
检查 VNFD 中 Pod 的最大或最小数量范围¶
注意
VNF 包中包含的 VNFD 文件在 vdu_profile 中定义了 Pod 最大或最小数量的范围。以下描述以 helloworld3_df_simple.yaml 为例。
$ cat helloworld3_df_simple.yaml
tosca_definitions_version: tosca_simple_yaml_1_2
description: Simple deployment flavour for Sample VNF
imports:
- etsi_nfv_sol001_common_types.yaml
- etsi_nfv_sol001_vnfd_types.yaml
- helloworld3_types.yaml
...
node_templates:
VNF:
type: company.provider.VNF
properties:
flavour_description: A simple flavour
VDU1:
type: tosca.nodes.nfv.Vdu.Compute
properties:
name: curry-probe-test001
description: kubernetes controller resource as VDU
vdu_profile:
min_number_of_instances: 1
max_number_of_instances: 3
...
注意
vdu_profile.min_number_of_instances 定义了 Pod 的最小数量。vdu_profile.max_number_of_instances 定义了 Pod 的最大数量。
您可以按照以下步骤查找 VNFD 文件
a. 在 tacker-conductor.log 中查找 VNF 实例 ID¶
执行以下 CLI 命令查找 tacker-conductor.log。
$ cat /opt/stack/logs/tacker-conductor.log | grep "Failed to update database vnf"
注意
如果您没有 tacker-conductor.log,可以执行以下 CLI 命令查看日志。
journalctl -u devstack@tacker-conductor
结果
Failed to update database vnf 81c4be9d-25ad-4726-8640-f2c4c326de2e Pod num is out of range. pod_num: 5
注意
在本例中,VNF 实例 ID 为 81c4be9d-25ad-4726-8640-f2c4c326de2e。
b. 使用 VNF 实例 ID 查找 VNFD ID¶
执行以下 CLI 命令查找 VNFD ID。
$ openstack vnf package list --filter '(eq,vnfdId,68014f5a-1f6b-47b2-914b-11bf0d1bd820)' -c 'Id'
结果
+---------+--------------------------------------+
| Field | Value |
+---------+--------------------------------------+
| VNFD ID | 68014f5a-1f6b-47b2-914b-11bf0d1bd820 |
+---------+--------------------------------------+
c. 使用 VNFD ID 查找 VNF 包 ID¶
执行以下 CLI 命令查找 VNF 包 ID。
$ openstack vnf package list --filter '(eq,vnfdId,68014f5a-1f6b-47b2-914b-11bf0d1bd820)' -c 'Id'
结果
+--------------------------------------+
| Id |
+--------------------------------------+
| eceb8b32-efb5-4940-a065-cef47fcdd973 |
+--------------------------------------+
d. 使用 VNF 包 ID 查找 VNFD 文件¶
执行以下 CLI 命令查找 VNF 包 ID。
$ openstack vnf package download eceb8b32-efb5-4940-a065-cef47fcdd973 --vnfd --file sample_vnfd.zip
$ unzip sample_vnfd.zip
$ vim sample_vnfd/Definitions/helloworld3_df_simple.yaml
更改 Kubernetes 中 Pod 数量的定义¶
注意
您可以查看 检查 VNFD 中 Pod 的最大或最小数量范围,使用 VDU1.properties.name 中的 helloworld3_df_simple.yaml 查找 Kubernetes 部署名称。
您需要首先登录到 Kubernetes 的 master 节点,并执行以下 CLI 命令来更改 Kubernetes 中 Pod 数量的定义。
$ kubectl edit deploy curry-probe-test001 -n kube-system
apiVersion: apps/v1
kind: Deployment
...
spec:
progressDeadlineSeconds: 600
replicas: 2
revisionHistoryLimit: 10
selector:
matchLabels:
app.kubernetes.io/name: curry-probe-test001
...
注意
更改 spec.replicas 中的 Pod 数量。
计算伸缩级别错误¶
在同步期间(添加或删除 vnfc 资源),Tacker 将计算 scale_level。当 Kubernetes 中的 Pod 数量与 VNFD 中的初始数量加上伸缩数量不同时,Tacker 将输出错误日志,并且不会更新数据库。
当 tacker-conductor.log 包含以下错误日志时,表示计算伸缩级别错误。
注意
如果您没有 tacker-conductor.log,可以执行以下 CLI 命令显示 tacker-conductor.log。
journalctl -u devstack@tacker-conductor
错误日志
Error computing 'scale_level'. current Pod num: 4 delta: 2. vnf: 81c4be9d-25ad-4726-8640-f2c4c326de2e vdu: VDU1
错误处理操作
要解决此错误,您可以采取以下方法:
检查 VNFD 中的 scale_level。
更改 Kubernetes 中 Pod 数量的定义
检查 VNFD 中的 scale_level(以 vdu1 为例)¶
注意
helloworld3_df_simple.yaml 在 vdu1_scaling_aspect_deltas.properties.deltas.delta_1.number_of_instances 中定义了 vdu1 的 scale_level,并在 vdu1_initial_delta.properties.initial_delta.number_of_instances 中定义了初始 delta。
$ cat helloworld3_df_simple.yaml
tosca_definitions_version: tosca_simple_yaml_1_2
description: Simple deployment flavour for Sample VNF
imports:
- etsi_nfv_sol001_common_types.yaml
- etsi_nfv_sol001_vnfd_types.yaml
- helloworld3_types.yaml
...
policies:
- scaling_aspects:
type: tosca.policies.nfv.ScalingAspects
properties:
aspects:
vdu1_aspect:
name: vdu1_aspect
description: vdu1 scaling aspect
max_scale_level: 2
step_deltas:
- delta_1
- vdu1_initial_delta:
type: tosca.policies.nfv.VduInitialDelta
properties:
initial_delta:
number_of_instances: 1
targets: [ VDU1 ]
- vdu1_scaling_aspect_deltas:
type: tosca.policies.nfv.VduScalingAspectDeltas
properties:
aspect: vdu1_aspect
deltas:
delta_1:
number_of_instances: 1
targets: [ VDU1 ]
- instantiation_levels:
type: tosca.policies.nfv.InstantiationLevels
properties:
levels:
instantiation_level_1:
description: Smallest size
scale_info:
vdu1_aspect:
scale_level: 0
instantiation_level_2:
description: Largest size
scale_info:
vdu1_aspect:
scale_level: 2
default_level: instantiation_level_1
- vdu1_instantiation_levels:
type: tosca.policies.nfv.VduInstantiationLevels
properties:
levels:
instantiation_level_1:
number_of_instances: 1
instantiation_level_2:
number_of_instances: 3
targets: [ VDU1 ]
注意
您可以按照以下步骤查找 VNFD 文件,参考 检查 VNFD 中 Pod 的最大或最小数量范围 从 a. 在 tacker-conductor.log 中查找 VNF 实例 ID 到 d. 使用 VNF 包 ID 查找 VNFD 文件
更改 Kubernetes 中 Pod 数量的定义¶
Pod 数量应满足 Kubernetes 中的 Pod 数量减去初始增量是伸缩级别的倍数。
注意
您可以查看 检查 VNFD 中的 scale_level(以 vdu1 为例) 查找初始 delta 和伸缩级别,并参考 更改 Kubernetes 中 Pod 数量的定义 获取详细信息。
LCM 操作¶
与 LCM 操作冲突¶
存在两种类型的冲突
数据库同步发生在 LCM 操作进行中时。
LCM 操作在 DB 同步期间发生。
数据库同步发生在 LCM 操作进行中时¶
当 tacker-conductor.log 包含以下信息日志时,表示数据库同步与 LCM 操作冲突,并且数据库同步将被跳过。
注意
如果您没有 tacker-conductor.log,可以执行以下 CLI 命令显示 tacker-conductor.log。
journalctl -u devstack@tacker-conductor
信息日志
There is an LCM operation in progress, so skip this DB synchronization. vnf:81c4be9d-25ad-4726-8640-f2c4c326de2e
冲突解决操作:等待 LCM 操作完成,数据库同步将在默认时间后重复。
LCM 操作在 DB 同步期间发生¶
当 LCM 操作响应 409 时,它与数据库同步冲突。
冲突解决操作
在数据库同步完成后再次执行 LCM 操作。
注意
完成时,您可以从日志中获取以下信息。
调试日志
Ended sync_db
LCM 操作状态异常¶
在同步期间,Tacker 检查 VnfLcmOpOcc 的 operationState。对于相同的 vnf 实例,如果在 operationState 中存在 FAILED_TEMP,或者最新的 operationState 为 FAILED,Tacker 将输出错误日志,并且不会更新数据库。
注意
如果您没有 tacker-conductor.log,可以执行以下 CLI 命令显示 tacker-conductor.log。
journalctl -u devstack@tacker-conductor
错误日志
The LCM operation status of the vnf: 81c4be9d-25ad-4726-8640-f2c4c326de2e is abnormal, so skip this DB synchronization.
错误处理操作
要解决此错误,您可以采取以下方法:
有关
FAILED_TEMP操作状态,请参阅 ETSI NFV-SOL VNF 错误处理。对于
FAILED操作状态,请对该 vnf 实例执行其他 LCM 操作,直到结果为COMPLETED。