Este conteúdo foi traduzido por máquina para sua conveniência e a Huawei Cloud não pode garantir que o conteúdo foi traduzido com precisão. Para exibir o conteúdo original, use o link no canto superior direito para mudar para a página em inglês.
Atualizado em 2024-09-10 GMT+08:00

Anexação de discos a um nó

Desafios

No planejamento de disco e na criação de discos lógicos distribuídos, é difícil para os usuários anexar e particionar discos de forma flexível ao criar um nó.

Durante a criação do nó, o campo storage seleciona um disco de dados com base em parâmetros, como o tamanho do disco e o tipo de disco, para evitar falhas na criação do nó, redefinição, migração e gerenciamento causadas por falhas de correspondência de letras de unidade. Por exemplo, se DockerLVMConfigOverride.diskType no campo NodeExtendParam estiver definido como evs durante a criação do nó, os nós C7 não serão criados.

Solução

Esta seção fornece detalhes sobre o campo storage usado na criação de nó para que você possa implementar a seleção de disco complexo e o particionamento chamando a API de criação de nó.

O campo storage consiste em storageSelectors e storageGroups. O campo storageSelectors é responsável pela seleção do disco e o campo storageGroups é responsável pelo processamento do disco.

A lógica básica para correspondência de campo é a seguinte:

  1. storageSelectors seleciona um disco EVS ou um disco local com base no valor de storageType.
    1. Discos locais não suportam correspondência exata. Todos os discos locais serão selecionados como discos de dados.
      Se alguns discos locais precisarem ser reservados, ocupe os discos no script de pré-instalação. O script é semelhante ao seguinte:
      # prepare
      vgName=vg-test
      storageDevice=/dev/vdb
      # vgcreate
      vgcreate ${vgName} ${storageDevice}
    2. Os discos EVS correspondem aos discos criados em dataVolumes com base nas configurações de matchLabels.
  2. As políticas têm prioridades para corresponder a matchLabels. A política matchLabels mais próxima de storageSelectors tem uma prioridade mais alta e o disco mais próximo de dataVolumes será preferencialmente correspondido. Como matchLabels usa correspondência solta, é recomendável colocar a política matchLabels com um pequeno intervalo de correspondência na parte superior. Por exemplo:
    1. Na etapa 1, o primeiro disco em dataVolumes corresponde ao disco EVS cujo tamanho é 100 GiB e a classe de armazenamento é SAS. Na etapa 2, o segundo disco em dataVolumes é correspondido pelo disco EVS cujo tamanho é 100 GiB porque o primeiro disco foi selecionado.
    2. Na etapa 3, dois discos em dataVolumes podem ser correspondidos porque volumeType ou count não é especificado em matchLabels. Nesse caso, nenhum disco está disponível para correspondência na etapa 4.
  3. storageGroups se associa a storageSelectors com base em selectorName. Finalmente, dois discos de 100 GiB são selecionados. O back-end do CCE agrupa os dois PVs em um grupo de volume (VG) e divide o VG em dois volumes lógicos (LVs) na proporção de 9: 1. 10% dos LVs do Kubernetes são particionados no modo distribuído. 90% dos LVs de tempo de execução são particionados no modo linear por padrão porque runtimeConfig não está configurado.

Criar um disco bruto

Durante a criação do nó no console do CCE, o clique em Add Data Disk. Em seguida, clique em Expand ao lado do disco de dados recém-adicionado e selecione Default. O disco criado é um disco bruto.

A figura a seguir mostra a lógica de chamadar API.

  1. O seletor cceUse corresponde a um disco de dados de 100 GiB.
  2. O disco selecionado é gerenciado pelo CCE e usado como um disco de dados.
  3. O outro disco de dados de 100 GiB criado em dataVolumes não é selecionado por nenhum seletor e é gerenciado por storageGroups. Portanto, esse disco EVS será anexado ao nó como um disco bruto e não será inicializado.

Depois que o nó for criado, efetue logon no nó e verifique se um disco de 100 GiB foi anexado, mas não inicializado.

O seguinte é um exemplo de API:

{
	"kind": "Node",
	"apiVersion": "v3",
	"metadata": {
		"name": "test-83790"
	},
	"spec": {
		"flavor": "c3.large.2",
		"az": "ap-southeast-1a",
		"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
	}
}

Anexar um disco a um caminho especificado

Durante a criação do nó no console do CCE, o clique em Add Data Disk. Em seguida, clique em Expand ao lado do disco de dados recém-adicionado, selecione Mount Disk e defina o caminho de montagem. Nesse caso, o CCE inicializa e anexa o disco por padrão.

A figura a seguir mostra a lógica de chamadar API.

  1. O seletor user1 seleciona um disco de dados de 100 GiB.
  2. Crie um VG chamado vguser1 usando o LVM.
  3. Retire todo o espaço de vguser1 em um LV nomeado user e formate o disco no formato ext4. Finalmente, anexe o disco ao diretório /tmp2.

Depois que o nó for criado, efetue logon no nó e verifique se um disco de 100 GiB foi anexado e gerenciado pelo LVM.

O seguinte é um exemplo de API. Há dois discos de dados. Um é usado pelo CCE e o outro é montado no diretório /tmp2.

{
	"kind": "Node",
	"apiVersion": "v3",
	"metadata": {
		"name": "test-37106"
	},
	"spec": {
		"flavor": "c3.large.2",
		"az": "ap-southeast-1a",
		"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
	}
}

Criar LVs repartidos para melhorar o desempenho do disco

Atualmente, a função de LV repartido é suportada apenas chamando uma API. O seguinte é um exemplo:

  1. storageSelectors corresponde a todos os discos EVS em dataVolumes porque matchLabels não está contido em storageSelectors.
  2. Crie um VG chamado vgpaas usando o LVM.
  3. Reparta 90% do espaço vgpaas em LVs de tempo de execução.
  4. Reparta 10% do espaço vgpaas em LVs do Kubernetes.
  • Dois ou mais discos de dados são necessários para a repartição.
  • Ao criar um LV repartido, certifique-se de que os tipos e tamanhos dos PVs adicionados ao VG sejam os mesmos. Caso contrário, a criação falhará.
  • Ao criar um LV repartido, use a configuração da repartição para o LV de tempo de execução e o LV do Kubernetes. Caso contrário, a criação falhará.

Faça logon no nó e execute o seguinte comando para visualizar o resultado da repartição:

O seguinte é um exemplo de API:

{
    "kind": "Node",
    "apiVersion": "v3",
    "metadata": {
        "name": "test-83773"
    },
    "spec": {
        "flavor": "c3.large.2",
        "az": "ap-southeast-1a",
        "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
    }
}