如何使用 Mgmt Driver 部署带有持久卷的 Kubernetes 集群

概述

通常,在 Kubernetes 集群下部署的 CNF 容量较小,在存储管理方面不易管理,并且容易丢失存储内容。在本用户指南中,我们支持部署的 Kubernetes 集群 VNF 具有带有 Cinder 卷的存储服务器,以便用户可以在其上部署具有持久卷 (PersistentVolumes) 的 CNF。 这样,PersistentVolumes 中的数据将存储在存储服务器中,从而避免上述问题。

使用持久卷实例化 Kubernetes 集群

1. 准备工作

安装 Kubernetes 集群的准备工作与 如何使用 Mgmt Driver 部署 Kubernetes 集群 中的相同。您可以参考它来了解如何设置 OpenStack 配置、如何下载 ubuntu 镜像、如何注册 Mgmt Driver 以及 VNF 包的使用方法。

VNF 包

它基本上与用户指南 如何使用 Mgmt Driver 部署 Kubernetes 集群 相同,除了以下补充说明。

  1. 将与存储服务器 VM 相关的定义添加到 VNFD 和 Heat 模板 (Base HOT) 中,如以下示例所示。

VNFD

node_templates:
  ...
  storage_server:
    type: tosca.nodes.nfv.Vdu.Compute
    properties:
      name: storage_server
      description: storage server compute node
      vdu_profile:
        min_number_of_instances: 1
        max_number_of_instances: 1
      sw_image_data:
        name: Image for storage server
        version: '20.04'
        checksum:
          algorithm: sha-512
          hash: fb1a1e50f9af2df6ab18a69b6bc5df07ebe8ef962b37e556ce95350ffc8f4a1118617d486e2018d1b3586aceaeda799e6cc073f330a7ad8f0ec0416cbd825452
        container_format: bare
        disk_format: qcow2
        min_disk: 0 GB
        size: 2 GB

    artifacts:
      sw_image:
        type: tosca.artifacts.nfv.SwImage
        file: ../Files/images/ubuntu-20.04-server-cloudimg-amd64.img

    capabilities:
      virtual_compute:
        properties:
          requested_additional_capabilities:
            properties:
              requested_additional_capability_name: m1.medium
              support_mandatory: true
              target_performance_parameters:
                entry_schema: test
          virtual_memory:
            virtual_mem_size: 4 GB
          virtual_cpu:
            num_virtual_cpu: 2
          virtual_local_storage:
            - size_of_storage: 45 GB

    requirements:
      - virtual_storage: storage_server_volume

  storage_server_volume:
    type: tosca.nodes.nfv.Vdu.VirtualBlockStorage
    properties:
      virtual_block_storage_data:
        size_of_storage: 5 GB

  storage_server_CP:
    type: tosca.nodes.nfv.VduCp
    properties:
      layer_protocols: [ ipv4 ]
      order: 0
    requirements:
      - virtual_binding: storage_server

Heat 模板 (Base HOT)

resources:
  ...
  storage_server_volume:
    type: OS::Cinder::Volume
    properties:
      name: storage_server_volume
      size: 5

  storage_server_CP:
    type: OS::Neutron::Port
    properties:
      network: { get_param: [ nfv, CP, storage_server_CP, network ] }

  storage_server:
    type: OS::Nova::Server
    properties:
      flavor: { get_param: [ nfv, VDU, storage_server, flavor ] }
      name: storage_server
      image: { get_param: [ nfv, VDU, storage_server, image ] }
      block_device_mapping_v2:
      - device_name: vdb
        volume_id: { get_resource: storage_server_volume }
        boot_index: -1
      networks:
      - port: { get_resource: storage_server_CP }
  1. 在 Files/kubernetes 下添加 nfs-pv1.yaml 和 nfs-pv2.yaml。

nfs-pv1.yaml 和 nfs-pv2.yaml 的示例如下

nfs-pv1.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-pv1
spec:
  capacity:
    storage: 1Gi
  persistentVolumeReclaimPolicy: Retain
  accessModes:
    - ReadWriteOnce
  nfs:
    server: 0.0.0.0
    path: "/volume/nfs/pv1"

nfs-pv2.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-pv2
spec:
  capacity:
    storage: 2Gi
  persistentVolumeReclaimPolicy: Retain
  accessModes:
    - ReadWriteOnce
  nfs:
    server: 0.0.0.0
    path: "/volume/nfs/pv2"

注意

有关详细信息,请参阅 持久卷

2. 部署 Kubernetes 集群

使用 PersistentVolumes 实例化的操作步骤和方法与 部署 Kubernetes 集群如何使用 Mgmt Driver 部署 Kubernetes 集群 中的相同。不同之处在于,用于实例化的参数文件需要在实例化 Kubernetes 时添加 storage_serverpv_registration_params 以实例化存储服务器。

将以下属性添加到用户指南 如何使用 Mgmt Driver 部署 Kubernetes 集群 中描述的 additionalParams 中。

以下表格显示了 KeyValuePairs

additionalParams.k8s_cluster_installation_param.storage_server(由用户指定) 列表

参数

数据类型

description

必需/可选

ssh_cp_name

字符串

Mgmt Driver 在通过 SSH/SFTP 访问存储服务器 VM 时使用的 CP 名称。

必需

nic_cp_name

字符串

与存储服务器 VM 的 NIC 相关的 CP 名称。

必需

username

字符串

Mgmt Driver 在通过 SSH/SFTP 访问存储服务器 VM 时使用的用户名。

必需

password

字符串

Mgmt Driver 在通过 SSH/SFTP 访问存储服务器 VM 时使用的用户密码。

必需

cinder_volume_setup_params

列表

存储服务器 VM 上 Cinder 卷目录的配置。

必需

nfs_server_setup_params

列表

存储服务器 VM 上 NFS 导出的配置。

必需

cinder_volume_setup_params 列表

参数

数据类型

description

必需/可选

volume_resource_id

字符串

Heat 模板 (Base HOT) 中定义的 Cinder 卷的资源 ID。 Mgmt Driver 使用此属性来标识 Cinder 卷。

必需

mount_to

字符串

Cinder 卷将在存储服务器 VM 上挂载到的目录路径。

必需

nfs_server_setup_params 列表

参数

数据类型

description

必需/可选

export_dir

字符串

要通过 NFS 导出的目录路径。

必需

export_to

字符串

目录通过 NFS 导出的网络地址。

必需

additionalParams.k8s_cluster_installation_param.pv_registration_params(由用户指定) 列表

参数

数据类型

description

必需/可选

pv_manifest_file_path

字符串

VNF 包中 Kubernetes PersistentVolume 的 manifest 文件的路径。

必需

nfs_server_cp

字符串

NFS 服务器的 CP 名称。 如果为 NFS 使用的网络启用了 DHCP,则无法在 Kubernetes PersistentVolume 的 manifest 文件中预配置 NFS 服务器 IP 地址。 因此,manifest 文件中的 NFS 服务器 IP 地址将替换为由此属性指定的 CP 的 IP 地址。

必需

persistent_volumes_kubernetes_param_file.json

{
  "flavourId": "simple",
  "additionalParams": {
    "k8s_cluster_installation_param": {
      "script_path": "Scripts/install_k8s_cluster.sh",
      "vim_name": "kubernetes_vim",
      "master_node": {
        "aspect_id": "master_instance",
        "ssh_cp_name": "masterNode_CP1",
        "nic_cp_name": "masterNode_CP1",
        "username": "ubuntu",
        "password": "ubuntu",
        "pod_cidr": "192.168.3.0/16",
        "cluster_cidr": "10.199.187.0/24",
        "cluster_cp_name": "masterNode_CP1"
      },
      "worker_node": {
        "aspect_id": "worker_instance",
        "ssh_cp_name": "workerNode_CP2",
        "nic_cp_name": "workerNode_CP2",
        "username": "ubuntu",
        "password": "ubuntu"
      },
      "proxy": {
        "http_proxy": "http://user1:password1@host1:port1",
        "https_proxy": "https://user2:password2@host2:port2",
        "no_proxy": "192.168.246.0/24,10.0.0.1",
        "k8s_node_cidr": "10.10.0.0/24"
      },
      "storage_server": {
        "ssh_cp_name": "storage_server_CP",
        "nic_cp_name": "storage_server_CP",
        "username": "ubuntu",
        "password": "ubuntu",
        "cinder_volume_setup_params": [
          {
            "volume_resource_id": "storage_server_volume",
            "mount_to": "/volume"
          }
        ],
        "nfs_server_setup_params": [
          {
            "export_dir": "/volume/nfs/pv1",
            "export_to": "10.10.0.0/24"
          },
          {
            "export_dir": "/volume/nfs/pv2",
            "export_to": "10.10.0.0/24"
          }
        ]
      },
      "pv_registration_params": [
        {
          "pv_manifest_file_path": "Files/kubernetes/nfs-pv1.yaml",
          "nfs_server_cp": "storage_server_CP"
        },
        {
          "pv_manifest_file_path": "Files/kubernetes/nfs-pv2.yaml",
          "nfs_server_cp": "storage_server_CP"
        }
      ]
    },
    "lcm-operation-user-data": "./UserData/k8s_cluster_user_data.py",
    "lcm-operation-user-data-class": "KubernetesClusterUserData"
  },
  "extVirtualLinks": [
    {
      "id": "net0_master",
      "resourceId": "f0c82461-36b5-4d86-8322-b0bc19cda65f",
      "extCps": [
        {
          "cpdId": "masterNode_CP1",
          "cpConfig": [
            {
              "cpProtocolData": [
                {
                  "layerProtocol": "IP_OVER_ETHERNET"
                }
              ]
            }
          ]
        }
      ]
    },
    {
      "id": "net0_worker",
      "resourceId": "f0c82461-36b5-4d86-8322-b0bc19cda65f",
      "extCps": [
        {
          "cpdId": "workerNode_CP2",
          "cpConfig": [
            {
              "cpProtocolData": [
                {
                  "layerProtocol": "IP_OVER_ETHERNET"
                }
              ]
            }
          ]
        }
      ]
    },
    {
      "id": "net0_storage",
      "resourceId": "f0c82461-36b5-4d86-8322-b0bc19cda65f",
      "extCps": [
        {
          "cpdId": "storage_server_CP",
          "cpConfig": [
            {
              "cpProtocolData": [
                {
                  "layerProtocol": "IP_OVER_ETHERNET"
                }
              ]
            }
          ]
        }
      ]
    }
  ],
  "vimConnectionInfo": [
    {
      "id": "8a3adb69-0784-43c7-833e-aab0b6ab4470",
      "vimId": "8d8373fe-6977-49ff-83ac-7756572ed186",
      "vimType": "openstack"
    }
  ]
}

1. 确认存储服务器上的实例化操作是否成功

要确认使用持久卷实例化 Kubernetes 集群是否成功,您需要确认以下内容。

  1. 确认 Cinder 卷作为存储服务器中的 NFS 共享目录公开。

  2. 确认 NFS 共享目录已注册为 Kubernetes 持久卷。

实例化后,以下命令可以检查确认点 1 和 2。

存储服务器 VM 中的卷信息

$ ssh ubuntu@10.10.0.45
$ df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            978M     0  978M   0% /dev
tmpfs           199M  940K  198M   1% /run
/dev/vda1       9.6G  1.5G  8.1G  16% /
tmpfs           994M     0  994M   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           994M     0  994M   0% /sys/fs/cgroup
/dev/vda15      105M  3.9M  101M   4% /boot/efi
/dev/loop0       68M   68M     0 100% /snap/lxd/18150
/dev/loop2       32M   32M     0 100% /snap/snapd/10707
/dev/loop1       56M   56M     0 100% /snap/core18/1944
/dev/vdb        4.9G   21M  4.6G   1% /volume
tmpfs           199M     0  199M   0% /run/user/1000
$ sudo exportfs -v
/volume/nfs/pv1
            10.10.0.0/24(rw,wdelay,insecure,root_squash,all_squash,no_subtree_check,sec=sys,rw,insecure,root_squash,all_squash)
/volume/nfs/pv2
            10.10.0.0/24(rw,wdelay,insecure,root_squash,all_squash,no_subtree_check,sec=sys,rw,insecure,root_squash,all_squash)

注意

确认在 df -h 命令的结果中已将“/dev/vdb”挂载到“/volume”,并确认在 sudo exportfs -v 命令的结果中显示了“/volume/nfs/pv1”和“/volume/nfs/pv2”。

Kubernetes 集群中的卷信息

$ ssh ubuntu@10.10.0.84
$ kubectl get pv
NAME      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
nfs-pv1   1Gi        RWO            Retain           Available                                   14h
nfs-pv2   2Gi        RWO            Retain           Available                                   14h

注意

确认在 kubectl get pv 命令的结果中,“nfs-pv*”可以在“NAME”列中看到,并且“nfs-pv1”和“nfs-pv2”的“STATUS”为“Available”。

如果您想登录到存储服务器 VM,请使用 Heat CLI 以以下方式查询 IP 地址。

$ openstack stack resource show \
  vnflcm_0c11bf51-353a-41be-af47-d06783413495 storage_server_CP \
  --fit-width -c attributes -f yaml | grep ip_address
- ip_address: 10.10.0.45

3. 使用持久卷修复整个 Kubernetes 集群

此处使用的修复整个 Kubernetes 集群的参数文件与 如何使用 Mgmt Driver 部署 Kubernetes 集群 中使用的参数文件没有变化。

使用 PersistentVolumes 修复整个 Kubernetes 集群的操作步骤和方法与 如何使用 Mgmt Driver 部署 Kubernetes 集群 中的 修复 整个 Kubernetes 集群修复 Kubernetes Master/Worker 节点 中的相同。

1. 确认存储服务器上的修复操作是否成功

要确认整个 Kubernetes 集群是否成功,您需要确认以下内容。

  1. 确认 Cinder 卷作为重新启动的存储服务器中的 NFS 共享目录公开。

  2. 确认 NFS 共享目录已注册为 Kubernetes 持久卷。

修复后,以下命令可以检查确认点 1 和 2。

存储服务器 VM 中的卷信息

$ ssh ubuntu@10.10.0.45
$ df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            978M     0  978M   0% /dev
tmpfs           199M  940K  198M   1% /run
/dev/vda1       9.6G  1.5G  8.1G  16% /
tmpfs           994M     0  994M   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           994M     0  994M   0% /sys/fs/cgroup
/dev/vda15      105M  3.9M  101M   4% /boot/efi
/dev/loop0       68M   68M     0 100% /snap/lxd/18150
/dev/loop2       32M   32M     0 100% /snap/snapd/10707
/dev/loop1       56M   56M     0 100% /snap/core18/1944
/dev/vdb        4.9G   21M  4.6G   1% /volume
tmpfs           199M     0  199M   0% /run/user/1000
$ sudo exportfs -v
/volume/nfs/pv1
            10.10.0.0/24(rw,wdelay,insecure,root_squash,all_squash,no_subtree_check,sec=sys,rw,insecure,root_squash,all_squash)
/volume/nfs/pv2
            10.10.0.0/24(rw,wdelay,insecure,root_squash,all_squash,no_subtree_check,sec=sys,rw,insecure,root_squash,all_squash)

注意

确认在 df -h 命令的结果中已将“/dev/vdb”挂载到“/volume”,并确认在 sudo exportfs -v 命令的结果中显示了“/volume/nfs/pv1”和“/volume/nfs/pv2”。

Kubernetes 集群中的卷信息

$ ssh ubuntu@10.10.0.84
$ kubectl get pv
NAME      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
nfs-pv1   1Gi        RWO            Retain           Available                                   12s
nfs-pv2   2Gi        RWO            Retain           Available                                   12s

注意

确认在 kubectl get pv 命令的结果中,“nfs-pv*”可以在“NAME”列中看到,并且“nfs-pv1”和“nfs-pv2”的“STATUS”为“Available”。

4. 修复存储服务器 VM

修复存储服务器 VM 的操作步骤和方法与 如何使用 Mgmt Driver 部署 Kubernetes 集群 中的 修复 Worker 节点修复 Kubernetes Master/Worker 节点 中的相同。

修复存储服务器 VM 操作将删除存储服务器 VM 并重建它,附加到存储服务器 VM 的 Cinder 卷也将被重建,并且卷中存储的数据将被初始化。

注意

请注意,在执行修复操作之前,不得使用 PersistentVolumes。

1. 确认 Kubernetes 上的修复前卷的使用情况

在修复之前,您需要确认以下内容。

  1. 确认 Kubernetes 集群中所有已注册的 PersistentVolumes 均未被使用。

以下命令可以检查确认点 1。

Kubernetes 集群中的卷信息

$ ssh ubuntu@10.10.0.84
$ kubectl get pv
NAME      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
nfs-pv1   1Gi        RWO            Retain           Available                                   14h
nfs-pv2   2Gi        RWO            Retain           Available                                   14h

注意

确认在 kubectl get pv 命令的结果中,“nfs-pv1”和“nfs-pv2”的“STATUS”为“Available”。 如果 PV 的状态为“Bound”,则 PV 正在使用中。

2. 确认存储服务器 VM 上的修复操作是否成功

要确认修复存储服务器 VM 是否成功,您需要确认以下内容。

  1. 确认 Cinder 卷作为重新启动的存储服务器中的 NFS 共享目录公开。

  2. 确认 NFS 共享目录已注册为 Kubernetes 持久卷。

修复后,以下命令可以检查确认点 1 和 2。

存储服务器 VM 中的卷信息

$ ssh ubuntu@10.10.0.45
$ df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            978M     0  978M   0% /dev
tmpfs           199M  940K  198M   1% /run
/dev/vda1       9.6G  1.5G  8.1G  16% /
tmpfs           994M     0  994M   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           994M     0  994M   0% /sys/fs/cgroup
/dev/vda15      105M  3.9M  101M   4% /boot/efi
/dev/loop0       68M   68M     0 100% /snap/lxd/18150
/dev/loop2       32M   32M     0 100% /snap/snapd/10707
/dev/loop1       56M   56M     0 100% /snap/core18/1944
/dev/vdb        4.9G   21M  4.6G   1% /volume
tmpfs           199M     0  199M   0% /run/user/1000
$ sudo exportfs -v
/volume/nfs/pv1
            10.10.0.0/24(rw,wdelay,insecure,root_squash,all_squash,no_subtree_check,sec=sys,rw,insecure,root_squash,all_squash)
/volume/nfs/pv2
            10.10.0.0/24(rw,wdelay,insecure,root_squash,all_squash,no_subtree_check,sec=sys,rw,insecure,root_squash,all_squash)

注意

确认在 df -h 命令的结果中已将“/dev/vdb”挂载到“/volume1”,并确认在 sudo exportfs -v 命令的结果中显示了“/volume/nfs/pv1”和“/volume/nfs/pv2”。

Kubernetes 集群中的卷信息

$ ssh ubuntu@10.10.0.84
$ kubectl get pv
NAME      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
nfs-pv1   1Gi        RWO            Retain           Available                                   12s
nfs-pv2   2Gi        RWO            Retain           Available                                   12s

注意

确认在 kubectl get pv 命令的结果中,“nfs-pv*”可以在“NAME”列中看到,并且“nfs-pv1”和“nfs-pv2”的“STATUS”为“Available”。

限制

  1. 不支持存储服务器 VM 的缩放操作。

  2. 如果在执行修复存储服务器 VM 操作之前 PersistentVolumes 正在使用中,则操作将失败。

  3. 修复存储服务器 VM 将导致卷中存储的数据被初始化。