如何使用 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 集群 相同,除了以下补充说明。
将与存储服务器 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 }
在 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_server 和 pv_registration_params 以实例化存储服务器。
将以下属性添加到用户指南 如何使用 Mgmt Driver 部署 Kubernetes 集群 中描述的 additionalParams 中。
以下表格显示了 KeyValuePairs
参数 |
数据类型 |
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 导出的配置。 |
必需 |
参数 |
数据类型 |
description |
必需/可选 |
|---|---|---|---|
volume_resource_id |
字符串 |
Heat 模板 (Base HOT) 中定义的 Cinder 卷的资源 ID。 Mgmt Driver 使用此属性来标识 Cinder 卷。 |
必需 |
mount_to |
字符串 |
Cinder 卷将在存储服务器 VM 上挂载到的目录路径。 |
必需 |
参数 |
数据类型 |
description |
必需/可选 |
|---|---|---|---|
export_dir |
字符串 |
要通过 NFS 导出的目录路径。 |
必需 |
export_to |
字符串 |
目录通过 NFS 导出的网络地址。 |
必需 |
参数 |
数据类型 |
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 集群是否成功,您需要确认以下内容。
确认 Cinder 卷作为存储服务器中的 NFS 共享目录公开。
确认 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 集群是否成功,您需要确认以下内容。
确认 Cinder 卷作为重新启动的存储服务器中的 NFS 共享目录公开。
确认 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 上的修复前卷的使用情况¶
在修复之前,您需要确认以下内容。
确认 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 是否成功,您需要确认以下内容。
确认 Cinder 卷作为重新启动的存储服务器中的 NFS 共享目录公开。
确认 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”。
限制¶
不支持存储服务器 VM 的缩放操作。
如果在执行修复存储服务器 VM 操作之前 PersistentVolumes 正在使用中,则操作将失败。
修复存储服务器 VM 将导致卷中存储的数据被初始化。