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 } }