更新时间:2023-11-03 gmt 08:00

节点磁盘挂载-凯发k8国际娱乐官网入口

应用现状

在自规划磁盘、创建条带逻辑盘等使用场景下,如何在创建节点时,灵活的挂载和划分磁盘成为一个问题。

节点创建中storage字段通过磁盘的大小、磁盘类型等参数的匹配来选择数据盘,避免了盘符匹配失败导致的节点创建、重置、迁移、纳管失败问题(例如当创建节点时nodeextendparam字段中dockerlvmconfigoverride.disktype参数设置为evs,c7机型的节点会创建失败)。

凯发k8国际娱乐官网入口的解决方案

本文对节点创建中storage字段进行详细的解释说明,方便用户通过创建节点api实现较为复杂的磁盘选择与功能划分。

storage字段由storageselectors和storagegroups组成:storageselectors字段负责选盘逻辑,storagegroups字段负责磁盘处理逻辑。

字段匹配基础逻辑如下:

  1. storageselectors根据storagetype字段选择evs云盘或是local本地盘。
    1. local本地盘无精确匹配模式,将全选所有本地盘作为数据盘。
      若需保留部分本地盘,请在安装前启动脚本中将磁盘占用。类似如下脚本。
      # prepare
      vgname=vg-test
      storagedevice=/dev/vdb
      # vgcreate
      vgcreate ${vgname} ${storagedevice}
    2. evs云盘通过matchlabels字段去模糊匹配datavolumes字段中创建的云盘。
  2. matchlabels的匹配存在优先级,storageselectors中靠前的策略优先匹配,datavolumes中靠前的云盘也优先被选择。由于matchlabels采用宽匹配策略,因此建议将匹配范围小的匹配策略前置。例如:
    1. 1中匹配大小为100g,存储类型为sas的evs盘,匹配到datavolumes中的第一块盘;2中匹配大小为100g的evs盘,由于第一块盘已被选择,因此匹配到第二块盘;
    2. 3中匹配大小为100g的evs盘,由于未填写volumetype或count,因此能匹配到datavolumes中的两块盘,导致4中无可用磁盘匹配。
  3. storagegroups根据selectorname与storageselectors做关联。最终选择到两块100g的盘。cce后端将这两块物理卷(pv)组成一个卷组(vg),并以9:1的比例划分两个逻辑卷(lv)。其中10%的kubernetes逻辑卷以条带(striped)方式进行划分。90%的runtime逻辑卷由于未配置runtimeconfig,采用默认的线性方式进行划分。

创建裸盘

在控制台,单击新增数据盘后,在高级配置中默认,则创建磁盘为裸盘。

使用api调用则可以按如下配置。

  1. cceuse selector匹配到一块100g 数据盘。
  2. 所选磁盘被cce管理用作数据盘。
  3. datavolumes中创建的另一块100g 数据盘未被任何selector选中并被group管理。因此此块云盘作为裸盘挂载至节点,不做初始化。

创建后登录节点查看,可以发现有一块100g的盘已经挂载但没有被初始化。

api示例如下:

{
	"kind": "node",
	"apiversion": "v3",
	"metadata": {
		"name": "test-83790"
	},
	"spec": {
		"flavor": "c3.large.2",
		"az": "cn-north-4b",
		"os": "euleros 2.9",
		"datavolumes": [
			{
				"size": 100,
				"volumetype": "sas"
			},
			{
				"size": 100,
				"volumetype": "sas"
			}
		],
		"billingmode": 0,
		"extendparam": {
			"maxpods": 110
		},
		"nodenicspec": {
			"primarynic": {
				"subnetid": "ca964acf-8468-4735-8229-97940ef6c881"
			}
		},
		"rootvolume": {
			"size": 50,
			"volumetype": "sas"
		},
		"runtime": {
			"name": "docker"
		},
		"login": {
			"userpassword": {
				"username": "root",
				"password": "******"
			}
		},
		"storage": {
			"storageselectors": [
				{
					"name": "cceuse",
					"storagetype": "evs",
					"matchlabels": {
						"size": "100",
						"volumetype": "sas",
						"count": "1"
					}
				}
			],
			"storagegroups": [
				{
					"name": "vgpaas",
					"selectornames": [
						"cceuse"
					],
					"ccemanaged": true,
					"virtualspaces": [
						{
							"name": "runtime",
							"size": "90%"
						},
						{
							"name": "kubernetes",
							"size": "10%"
						}
					]
				}
			]
		},
		"count": 1
	}
}

挂载用户磁盘至指定路径

在控制台,单击新增数据盘后,在高级配置中选择挂载到指定目录,填写指定的磁盘挂载目录,则由cce实现该磁盘的默认初始化及挂载。

使用api调用则可以按如下配置。

  1. storageselectors中的user1选中一块100g的数据盘。
  2. 通过lvm管理,创建一个名为vguser1的卷组(vg)。
  3. 将全部的vguser1空间划分成名叫user的逻辑卷(lv)。并以ext4的文件格式格式化磁盘。最后挂载到/tmp2的目录下。

创建后登录节点查看,可以发现有一块100g的盘已经挂载且被lvm管理。

api示例如下,有两块数据盘,其中一块给cce使用,另一块挂载到/tmp2目录下。

{
	"kind": "node",
	"apiversion": "v3",
	"metadata": {
		"name": "test-37106"
	},
	"spec": {
		"flavor": "c3.large.2",
		"az": "cn-north-4b",
		"os": "euleros 2.9",
		"datavolumes": [
			{
				"size": 100,
				"volumetype": "sas"
			},
			{
				"size": 100,
				"volumetype": "sas"
			}
		],
		"billingmode": 0,
		"extendparam": {
			"maxpods": 110
		},
		"nodenicspec": {
			"primarynic": {
				"subnetid": "ca964acf-8468-4735-8229-97940ef6c881"
			}
		},
		"rootvolume": {
			"size": 50,
			"volumetype": "sas"
		},
		"runtime": {
			"name": "docker"
		},
		"login": {
			"userpassword": {
				"username": "root",
				"password": "******"
			}
		},
		"storage": {
			"storageselectors": [
				{
					"name": "cceuse",
					"storagetype": "evs",
					"matchlabels": {
						"size": "100",
						"volumetype": "sas",
						"count": "1"
					}
				},
				{
					"name": "user1",
					"storagetype": "evs",
					"matchlabels": {
						"size": "100",
						"volumetype": "sas",
						"count": "1"
					}
				}
			],
			"storagegroups": [
				{
					"name": "vgpaas",
					"selectornames": [
						"cceuse"
					],
					"ccemanaged": true,
					"virtualspaces": [
						{
							"name": "runtime",
							"size": "80%"
						},
						{
							"name": "kubernetes",
							"size": "20%"
						}
					]
				},
				{
					"name": "vguser1",
					"selectornames": [
						"user1"
					],
					"virtualspaces": [
						{
							"name": "user",
							"size": "100%",
							"lvmconfig": {
								"lvtype": "linear",
								"path": "/tmp2"
							}
						}
					]
				}
			]
		},
		"count": 1
	}
}

创建条带化逻辑卷,提升磁盘性能

条带化逻辑卷功能当前仅只支持调用api创建,示例如下。

  1. storageselectors中matchlabels为空,则全选evs盘。
  2. 通过lvm管理,创建一个名为vgpaas的卷组(vg)。
  3. 将90%的vgpaas空间以条带的方式划分成runtime逻辑卷。
  4. 将10%的vgpaas空间以条带的方式划分成kubernetes逻辑卷。
  • 需要两块及以上数据盘才能条带化。
  • 创建条带化逻辑卷(lv)时,加入卷组(vg)的物理卷(pv)的类型与大小应尽量保持一致,以免条带化创建失败。
  • 创建条带化逻辑卷(lv)时,runtime逻辑卷和kubernetes逻辑卷应当同时使用条带化配置,以免条带化创建失败。

创建后登录节点,使用如下命令可以查看到条带化结果。

api示例如下:

{
    "kind": "node",
    "apiversion": "v3",
    "metadata": {
        "name": "test-83773"
    },
    "spec": {
        "flavor": "c3.large.2",
        "az": "cn-north-4b",
        "os": "euleros 2.9",
        "datavolumes": [
            {
                "size": 100,
                "volumetype": "sas"
            },
            {
                "size": 100,
                "volumetype": "sas"
            }
        ],
        "billingmode": 0,
        "extendparam": {
            "maxpods": 110
        },
        "nodenicspec": {
            "primarynic": {
                "subnetid": "ca964acf-8468-4735-8229-97940ef6c881"
            }
        },
        "rootvolume": {
            "size": 50,
            "volumetype": "sas"
        },
        "runtime": {
            "name": "docker"
        },
        "login": {
            "userpassword": {
                "username": "root",
                "password": "******"
            }
        },
        "storage": {
            "storageselectors": [
                {
                    "name": "cceuse",
                    "storagetype": "evs"
                }
            ],
            "storagegroups": [
                {
                    "name": "vgpaas",
                    "selectornames": [
                        "cceuse"
                    ],
                    "ccemanaged": true,
                    "virtualspaces": [
                        {
                            "name": "runtime",
                            "size": "90%",
                            "runtimeconfig": {
                                "lvtype": "striped"
                            }
                        },
                        {
                            "name": "kubernetes",
                            "size": "10%",
                            "lvmconfig": {
                                "lvtype": "striped"
                            }
                        }
                    ]
                }
            ]
        },
        "count": 1
    }
}
分享:
网站地图