数据库同步错误处理

本文档描述了如何处理数据库同步错误。

数据库同步描述

如果 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.yamlvdu1_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 ]

更改 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