支持 Kubernetes VIM 的 Helm 图表

https://blueprints.launchpad.net/tacker/+spec/helmchart-k8s-vim

问题描述

Tacker Wallaby 版本支持在 CNF 的 VNF 生命周期管理中将 Kubernetes 资源文件作为托管容器基础设施对象包 (MCIOP)。 另一方面,由于云原生应用程序开发的趋势,Helm 图表也应作为 MCIOP 支持。

本规范为 Kubernetes VIM 提出新的接口,用于支持 Helm 图表。 它使用户能够在他们的 VNF 包中包含 Helm 图表文件,并实例化、扩展/缩减以及修复 CNF。

提议的变更

当用户使用 ETSI NFV-SOL003 VNF 生命周期管理将 Kubernetes 集群作为 VNF 实例管理时,还必须更新 MgmtDriver 以支持 Helm 图表。 否则,用户需要在他们的 Kubernetes 集群中安装和配置 Helm 图表环境。

本规范描述了 Tacker 仓库中 MgmtDriver 示例 [1] 的更改方式,以及 CNF 操作(例如实例化、扩展和修复)需要进行的更改。

Kubernetes 集群 VNF 的 MgmtDriver 需要进行以下更改

  1. 实例化 Kubernetes 集群 VNF

    • instantiate_end 方法中添加新的逻辑来安装 Helm 相关软件包。

    • 将 Master 节点 SSH 连接信息存储到 VIM 表和 VnfInstance.vimConnectionInfo 中,在 instantiate_end 方法中。

    注意

    由于管理多个连接信息带来的挑战,在规范“支持使用 MgmtDriver 进行 HA Kubernetes Master 部署” [2] 中描述的 HA Master 节点可能不受支持。

  2. 修复 Kubernetes 集群 VNF 中的 Master 节点

    • heal_end 方法中添加新的逻辑来安装 Helm 相关软件包。

  3. 修复整个 Kubernetes 集群 VNF

    • 将新的 Master 节点 SSH 连接信息存储到 VIM 表和 VnfInstance.vimConnectionInfo 中,在 heal_end 方法中。

CNF 操作需要进行以下更改

  1. CNF 常见操作

    • 在 Kubernetes InfraDriver 中,根据 InstantiateVnfRequest.vimConnectionInfo 检测 Helm 图表模式。

    • 实现 Helm 图表客户端。

  2. CNF 实例化

    • 将 Helm 图表注册到 Helm 仓库。

    • 从 Kubernetes InfraDriver 调用 Helm 图表客户端。

    • 将部署的 Kubernetes 资源信息存储到 Helm 图表中,并保存到数据库中。

  3. CNF 终止

    • 从 Helm 仓库注销 Helm 图表。

    • 从 Kubernetes InfraDriver 调用 Helm 图表客户端。

  4. CNF 扩展

    • 从 Kubernetes InfraDriver 调用 Helm 图表客户端。

    注意

    扩展操作可能需要使用 Kubernetes PythonClient,而不是 Helm 图表客户端。副本数可能未在 Helm 图表的 values.yaml 中公开。在这种情况下,Tacker 需要将与 Kubernetes Python Client 实例化操作相同的数据存储到数据库中。

  5. CNF 修复

    • 从 Kubernetes InfraDriver 调用 Helm 图表客户端

    注意

    修复操作可能需要使用 Kubernetes PythonClient,而不是 Helm 图表客户端。Helm cli 不支持修复操作。在这种情况下,Tacker 需要将与 Kubernetes Python Client 实例化操作相同的数据存储到数据库中。

实例化 Kubernetes 集群 VNF

                                     +--------------+ +---------+
                                     | Helm         | |         |
                                     | Install      | |  VNFD   |
                                     | Script       | |         |
                                     +-------+------+ +-+-------+
                                             |          |
                                             +-----v    v     +---------------+
                                                +----------+  | Instantiation |
                                                |          |  | Request       |
                                                |   CSAR   |  | Additional    |
                                                |          |  | Params        |
                                                +----+-----+  +-+-------------+
                                                     |          |
                                                     |          |
                                               +-----+----------+--------------+
                                               |     v          v         VNFM |
                                               |  +-------------------+        |
                                               |  |   Tackerserver    |        |
                                               |  +-------+-----------+        |
                                               |          |                    |
                                               |          v                    |
           2. Kubernetes Cluster               |  +----------------------+     |
              & Helm Installation              |  |    +-------------+   |     |
        +-------------+------------------------+--+----| MgmtDriver  |   |     |
        |             |                        |  |    +-------------+   |     |
+-------|-------------|------------+           |  |                      |     |
|       |             |            |           |  |                      |     |
|  +----|------+  +---|-------+    |           |  |                      |     |
|  |    v      |  |   v       |    |           |  |    +-------------+   |     |
|  |  +------+ |  | +------+  |    | 1. Create |  |    |OpenStack    |   |     |
|  |  |Worker| |  | |Master|  |<---------------+--+----|Infra Driver |   |     |
|  |  +------+ |  | +------+  |    |    VMs    |  |    +-------------+   |     |
|  |    VM     |  |   VM      |    |           |  |                      |     |
|  +-----------+  +-----------+    |           |  |                      |     |
+----------------------------------+           |  |      Tacker Conductor|     |
+----------------------------------+           |  +----------------------+     |
|       Hardware Resources         |           |                               |
+----------------------------------+           +-------------------------------+

该图显示了 Kubernetes 集群 VNF 的实例化操作。当 MgmtDriver 调用 instantiate_end 时,将添加以下步骤

  1. MgmtDriver 使用 shell 脚本安装 Helm。

  2. MgmtDriver 将 Master 节点访问信息添加到 TackerDB 作为 VIMVnfInstance.vimConnectionInfo

以下序列图描述了涉及的组件以及使用 MgmtDriver 操作安装 Helm 的流程

../../_images/0131.png

该过程由上述序列中说明的以下步骤组成。

  1. 客户端发送实例化请求。

  2. 这基本上与规范“支持使用 MgmtDriver 部署 Kubernetes 集群” [3] 相同。

  3. 将在 instantiate_end 中添加以下流程。

    1. MgmtDriver 通过 shell 脚本在新的 Master 节点上安装 Helm。

      1. 通过 SSH 访问 Master 节点

      2. 将脚本文件从“helm_installation_script_path”复制到 Master 节点。

      3. 运行脚本。

    2. MgmtDriver 将 Master 节点访问信息添加到 VnfInstance.vimConnectionInfo

支持 Helm 图表的示例请求参数

InstantiateVnfRequest 中需要以下参数来支持 Helm 图表。

属性名称

参数描述

helm_installation_script_path

安装 Helm 的脚本文件的文件路径。

以下是请求体的示例

{
  "flavourId": "ha_k8s_install",
  "extVirtualLinks": [
    {
      "id": "net0",
      "resourceId": "f0c82461-36b5-4d86-8322-b0bc19cda65f",
      "extCps": [
        {
          "cpdId": "CP1",
          "cpConfig": [
            {
              "cpProtocolData": [
                {
                  "layerProtocol": "IP_OVER_ETHERNET"
                }
              ]
            }
          ]
        }
      ]
    }
  ],
  "additionalParams": {
    "lcm-operation-user-data": "./UserData/lcm_user_data.py",
    "lcm-operation-user-data-class": "SampleUserData",
    "k8s_cluster_installation_param": {
      "script_path": "Scripts/install_k8s_ha.sh",
      "vim_name": "kubernetes_vim_all_param",
      "master_node": {
        "aspect_id": "master_instance",
        "ssh_cp_name": "CP1",
        "username": "ubuntu",
        "password": "ubuntu",
        "pod_cidr": "192.168.3.0/16",
        "cluster_cidr": "10.199.187.0/24",
        "cluster_cp_name": "vrrp_CP"
      },
      "worker_node": {
        "aspect_id": "worker_instance",
        "ssh_cp_name": "CP2",
        "username": "ubuntu",
        "password": "ubuntu"
      },
      "proxy": {
        "http_proxy": "http://user1:password1@host1:port1",
        "https_proxy": "https://user2:password2@host2:port2",
        "no_proxy": "192.168.10.0/24,10.0.0.1"
      },
      "helm_installation_script_path": "Scripts/install_helm.sh"
    }
  },
  "vimConnectionInfo": [
    {
      "id": "8a3adb69-0784-43c7-833e-aab0b6ab4470",
      "vimId": "8d8373fe-6977-49ff-83ac-7756572ed186",
      "vimType": "openstack"
    }
  ]
}

支持 Helm 图表的示例数据库表

以下参数存储在 ETSI NFV-SOL003 v2.6.1 [4] 中定义的 VnfInstance.vimConnectionInfoextra 字段中,作为对 Master 节点的访问信息。该 extra 字段定义为 ETSI NFV-SOL003 v2.6.1 中的键/值对。

属性名称

参数描述

helm_info

在 Master 节点中安装 Helm 的访问信息。

> masternode_ip

Master 节点的 IP 地址。

> masternode_username

Master 节点的 SSH 登录用户名。

> masternode_password

Master 节点的 SSH 登录密码。

存储在数据库中的表的示例

{
  "vim_type": "kubernetes",
  "access_info": {
    "auth_url":"http://123.124.64.6:8443",
    "username": "some-username",
    "password": "some-password",
    "bearer_token": "value of bearer token",
    "ssl_ca_cert_hash": "hash value of ssl ca certification",
    "certificate_key": "value of certificate key"
  },
  "interface_info": {
  },
  "extra": {
    "helm_info": {
        "masternode_ip": "192.168.100.100",
        "masternode_username": "user1",
        "masternode_password": "password",
    }
  }
}

支持 Helm 图表的 Kubernetes 集群 VNF 修复

所需的更改仅限于 MgmtDriver 的 heal_end 方法。Tacker 使用 SOL002 支持 VNFC 修复操作,并使用 SOL003 支持 VNF 修复操作。在两种情况下,都添加了与实例化操作类似的流程。

使用 SOL002 修复 Master 节点

将在 heal_end 中添加以下流程。

  1. MgmtDriver 通过 shell 脚本在新的 Master 节点上安装 Helm。

    1. 通过 SSH 访问 Master 节点

    2. 将脚本文件从“helm_installation_script_path”复制到 Master 节点。

    3. 运行脚本。

  2. MgmtDriver 删除已修复 Master 节点的访问信息,并将其添加到 VnfInstance.vimConnectionInfo

修复整个 Kubernetes 集群 VNF

此案例遵循终止和实例化操作中的相同逻辑。值得注意的是,VIMVnfInstance.vimConnectionInfo 表应使用新的 Kubernetes 集群信息进行更新。

使用 Helm 图表实例化 CNF

下图显示了使用 Helm 图表进行实例化的操作

                                                                          +------+ +------------+
                                                                          | VNFD | | Helm chart |
                                                                          |      | |            |
                                                                          +-+----+ ++-----------+
                                                                            |       |
                                                                          +-v-------v-+ +-----------------+
                                                                          |           | | Instantiation   |
                                                                          | CSAR      | | Request with    |
                                                                          |           | | additionalParam |
                                                                          +-----+-----+ +-----------+-----+
                                                                                |                   |
   +-----------------------+                                                    |  1. Request with  |
   | CNF with Helm chart   |                                                    |     Helm chart    |
   |                       |                                              +-------------------------------+
   |  +------+   +------+  |                                              |     |                   |     |
   |  | Pod  |   | Pod  |  |                                              |  +--v-------------------v--+  |
   |  |      |   |      |  <--------------------+                         |  |                         |  |
   |  +------+   +------+  |                    |                         |  |      TackerServer       |  |
   |                       |                    |                         |  |                         |  |
   +-----------------------+                    |                         |  +------+------------------+  |
                                                |                         |         |                     |
+--------------------------------------------------------+                |  +-------------------------+  |
| Kubernetes cluster VNF                        |        |                |  |      |  TackerConductor |  |
|                                               |        |                |  |      |                  |  |
|  +-----------------------+  +-----------------------+  |                |  |  +---v---------------+  |  |
|  |        Worker         |  |        Master   |     |  |                |  |  | VnflcmDriver      |  |  |
|  |                       |  |                 |     |  |                |  |  |                   |  |  |
|  |                       |  |  +--------------+--+  |  |                |  |  +---+---------------+  |  |
|  |                       |  |  | kubectl         |  |  |                |  |      |                  |  |
|  |                       |  |  +--------------^--+  |  |                |  |  +---v---------------+  |  |
|  |                       |  |                 |     |  |                |  |  | Kubernetes        |  |  |
|  |                       |  |  +--------------+--+  |  |                |  |  | InfraDriver       |  |  |
|  |                       |  |  | Helm            |  |  | 3. Helm cli    |  |  |                   |  |  |
|  |                       |  |  +-----------------+  |  |    via SSH     |  |  |  +-------------+  |  |  |
|  |                       |  |  | Helm cli        <-------+-----------------------+ Helm client |  |  |  |
|  |                       |  |  +-----------------+  |  | |              |  |  |  +-------------+  |  |  |
|  |                       |  |  | Helm Repository <-------+              |  |  |                   |  |  |
|  |                       |  |  +-----------------+  |  | 2. Register    |  |  +-------------------+  |  |
|  |                       |  |                       |  |    repository  |  |                         |  |
|  +-----------------------+  +-----------------------+  |    with Helm   |  +-------------------------+  |
|                                                        |    cli via SSH |                               |
+--------------------------------------------------------+                +-------------------------------+
  1. KubernetesInfraDriver 使用 Helm cli 将 Helm 图表注册到 Helm 仓库。

  2. KubernetesInfraDriver 使用 Helm cli 创建 Kubernetes 资源。

以下序列图描述了使用 Helm 图表进行 CNF 实例化的组件和流程

../../_images/0221.png
  1. 客户端发送实例化请求。

  2. 直到调用 Kubernetes InfraDriver 为止,与现有实现没有变化。

  3. Kubernetes InfraDriver 执行以下步骤。

    1. 确定 InstantiateVnfRequest 中的“use_helm”参数。

    2. 从 Tacker 数据库的 VnfInstance.vimConnectionInfo.extra 中获取 Master 节点访问信息。

    3. (可选:“exthelmchart” == “false”) 从 VNF 包中获取 Helm 图表并将其转发到 Master 节点。

      scp /<helmchartfile_path> <masternode username>@<masternode_ip>:/var/tacker/helm/<vnf_instance_id>
      

      注意

      • <helmchartfile_path>:请求中 Helm 图表文件的路径。

      • <masternode_username>:存储在 VnfInstance.vimConnectionInfo 中的 Master 节点的用户名,用于 SSH 登录。

      • <masternode_ip>:存储在 VnfInstance.vimConnectionInfo 中的 Master 节点的 IP 地址。

      • <vnf_instance_id>:TackerAPI 请求中提供的 VNF 实例 ID。

      在 Master 节点上提取转发的软件包文件。

      tar -xzf /var/tacker/helm/<vnf_instance_id>/<chartfilepackage>
      

      注意

      • <chartfilepackage>:从 <helmchartfile_path> 获得的转发的 .tgz 软件包文件名。

    4. (可选:“exthelmchart” == “true”) 从仓库中获取目标 Helm 图表。

      helm repo add <helmrepositoryname> <repositoryURL>
      

      注意

      • <helmrepositoryname>:指定为仓库名称的目录名称。此参数由 additionalParams 中的“helmrepositoryname”字段提供。

      • <repositoryURL>:此参数指定请求参数的“exthelmrepo_url”或本地仓库的 URL,否则。

    5. 通过 Helm cli 实例化 CNF。

      如果“exthelmchart”为“true”,

      helm install <helmreleasename> <helmrepositoryname>/<helmchartname> --namespace <namespace> <helmparameter>
      

      如果“exthelmchart”为“false”,

      helm install <helmreleasename> /var/tacker/helm/<vnf_instance_id>/<extracted_package>
      

      注意

      • <namespace>:此参数从请求参数的“namespace”获得。如果未在请求参数的“namespace”中设置,则此参数未设置。

      • <helmchartname>:此参数从请求参数的“helmchartname”获得。

      • <helmreleasename>:此参数从请求参数的“helmreleasename”获得并设置。

      • <helmparameter>:此参数从请求参数的“helmparameter”获得并设置。这些参数必须使用 helm install cli 命令的 --set 标志添加。

      • <extracted_package>:此参数将是从 <chartfilepackage> 提取的目录名称。

    6. 获取 Kubernetes 资源文件。

      helm get manifest <helmreleasename>
      

      注意

      • <helmreleasename>:此参数从请求参数的“helmreleasename”获得并设置。

    7. 将 Kubernetes 资源保存到 TackerDB 中。

      注意

      数据表应以与 Python 客户端相同的方式生成。

    8. 获取并更新已部署资源的的状态。

使用 Helm 图表请求 CNF 实例化数据

以下参数将需要实例化使用 Helm 图表的 CNF。这些参数在 ETSI NFV-SOL003 v2.6.1 [4] 中定义的 additionalParams 中指定,作为键值对。

属性名称

数据类型

参数描述

namespace

字符串

部署 Kubernetes 资源的命名空间。如果不存在,则使用 Helm 图表中的值为默认值。

use_helm

布尔值

如果为“true”,Kubernetes InfraDriver 使用 Helm 客户端,否则,使用 Kubernetes Python 客户端。true:使用 Helm,false:不使用 Helm

using_helm_install_param

数组

与 Helm 图表相关的步骤的参数。如果“use_helm”为“true”,则必须存在。

> exthelmchart

布尔值

如果为 true,Helm 图表不在 VNF 包中。true:外部 Helm 图表,false:在 VNF 包中

> helmchartfile_path

字符串

VNF 包中 Helm 图表文件的路径。如果“exthelmchart”为“false”,则必须存在。

> helmreleasename

字符串

Helm 图表的实例名称。

> helmparameter

数组

Helm 安装期间指定的键值对参数。

> helmrepostitoryname

字符串

Helm 仓库名称。如果“exthelmchart”为“true”,则必须存在。

> helmchartname

字符串

Helm 图表名称。如果“exthelmchart”为“true”,则必须存在。

> exthelmrepo_url

字符串

外部 Helm 仓库的 URL。如果“exthelmchart”为“true”,则必须存在。

以下示例显示了 exthelmchart 为“true”的情况下的请求体

{
  "additionalParams": {
    "namespace": "namespaceA",
    "use_helm": "true",
    "using_helm_install_param": [
      {
        "exthelmchart": "true",
        "helmreleasename": "myrelease",
        "helmparameter": [
          "key1=value1",
          "key2=value2"
          ],
        "helmrepositoryname": "mychart",
        "helmchartname": "example",
        "exthelmrepo_url": "http://helmrepo.example.com/sample-charts"
      }
    ]
  }
}

以下示例显示了 exthelmchart 为“false”的情况下的请求体

{
  "additionalParams": {
    "namespace": "namespaceA",
    "use_helm": "true",
    "using_helm_install_param": [
      {
        "exthelmchart": "false",
        "helmchartfile_path": "Files/kubernetes/example-0.1.0.tgz",
        "helmreleasename": "myrelease",
        "helmparameter": [
          "key1=value1",
          "key2=value2"
        ]
      }
    ]
  }
}

使用 Helm 图表终止 CNF

在 CNF 的终止操作中,Kubernetes InfraDriver 执行以下步骤以从仓库注销 Helm 图表并删除 Kubernetes 资源。在其他部分,不需要进行更改。

  1. VnfInstance.vimConnectionInfo 获取 Helm 图表相关信息。

  2. 通过 Helm cli 删除 Kubernetes 资源。

    helm uninstall <helmreleasename>
    

    注意

    • <helmreleasename>:此参数从 TackerDB 的“Additional Params”表中获得。

    讨论: 最好使用其他表,因为根据 ETSI NFV-SOL003,additionalParams 不应在 Tacker DB 中,VnfInstance.instantiatedVnfInfo 应该使用。

  3. (可选:“exthelmchart” == “true”) 删除 Helm 仓库。

    helm repo remove <helmrepositoryname>
    

    注意

    讨论: 最好使用其他表,因为根据 ETSI NFV-SOL003,additionalParams 不应在 Tacker DB 中,VnfInstance.instantiatedVnfInfo 应该使用。

  4. KubernetesInfraDriver 删除 Helm 图表。如果 TackerDB 的“Additional params”表中的“exthelmchart”为“false”,则执行此处理。

    rm -f /var/tacker/helm/<vnf_instance_id>
    

数据模型影响

此规范中描述的 Helm chart 支持在 vims 表中添加一个类型为 jsonextra 列。

REST API 影响

安全影响

通知影响

其他最终用户影响

性能影响

其他部署者影响

开发人员影响

实现

负责人

主要负责人

伊藤良人 <yoshito.itou.dr@hco.ntt.co.jp>

其他贡献者

Tatsuhiro Furuya <tatu.furuya@fujitsu.com>

Yoshiyuki Katada <katada.yoshiyuk@fujitsu.com>

Ayumu Ueha <ueha.ayumu@fujitsu.com>

陆梁 <lu.liang@fujitsu.com>

工作项

  • 实现 MgmtDriver 以提供支持

    • 提供一个示例脚本,用于在实例化 Kubernetes 集群 VNF 和修复 Master 节点 VNF 时执行以安装 Helm 相关软件包。

    • 在实例化 Kubernetes 集群 VNF 和修复整个 Kubernetes 集群 VNF 时存储 Master 节点的 SSH 连接信息。

  • 实现 Kubernetes InfraDriver 以提供支持

    • 在 CNF 实例化时将 Helm chart 注册到 Helm 仓库。

    • 在 CNF 终止时从 Helm 仓库注销 Helm chart。

    • 在 CNF 实例化、扩展、修复和终止时调用 Helm chart 客户端。

    • 在 CNF 实例化时将部署的 Kubernetes 资源信息存储到数据库中的 Helm chart 中。

  • 添加新的单元和功能测试。

依赖项

  • Kubernetes集群的实例化操作

    依赖于规范“支持使用 MgmtDriver 部署 Kubernetes 集群” [3]

  • Kubernetes集群的伸缩操作

    依赖于规范“支持使用 MgmtDriver 扩展 Kubernetes Worker 节点” [5]

  • Kubernetes集群的修复操作

    依赖于规范“支持使用 MgmtDriver 修复 Kubernetes Master/Worker 节点” [6]

  • Kubernetes集群的实例化操作

测试

将添加单元和功能测试,以涵盖规范所需的用例。

文档影响

将添加完整的用户指南,以解释使用 Helm chart 进行 CNF 实例化。

参考资料