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:

- storageSelectors seleciona um disco EVS ou um disco local com base no valor de storageType.
- Discos locais não suportam correspondência exata. Todos os discos locais serão selecionados como discos de dados.
- Os discos EVS correspondem aos discos criados em dataVolumes com base nas configurações de matchLabels.
- 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:
- 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.
- 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.
- 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.

- O seletor cceUse corresponde a um disco de dados de 100 GiB.
- O disco selecionado é gerenciado pelo CCE e usado como um disco de dados.
- 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.

- O seletor user1 seleciona um disco de dados de 100 GiB.
- Crie um VG chamado vguser1 usando o LVM.
- 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:

- storageSelectors corresponde a todos os discos EVS em dataVolumes porque matchLabels não está contido em storageSelectors.
- Crie um VG chamado vgpaas usando o LVM.
- Reparta 90% do espaço vgpaas em LVs de tempo de execução.
- 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
}
}