Por padrão, o armazenamento de contêineres é efêmero: os dados gravados em um contêiner se perdem na reinicialização. Montar um volume de disco permite que os dados persistam entre reinicializações. Este tópico explica como montar um disco como volume ao criar uma elastic container instance pela API CreateContainerGroup.
Pré-requisitos
Antes de começar, verifique se você tem:
Uma elastic container instance na zona de disponibilidade de destino
Um disco com pagamento conforme o uso na mesma zona de disponibilidade da instância (para provisionamento estático)
Limitações
Somente discos com pagamento conforme o uso podem ser montados. Consulte Faturamento de block storage.
Um disco pode ser montado em apenas uma elastic container instance por vez; não há suporte para compartilhamento de discos.
Cada elastic container instance aceita no máximo seis volumes de disco.
O disco deve estar na mesma zona de disponibilidade da elastic container instance. Não há suporte para montagem entre zonas. Crie o disco na zona de destino antes de montá-lo.
Discos NVMe com o recurso de montagem múltipla ativado (discos compartilhados NVMe) não podem ser montados.
Discos com partições não podem ser montados. Se você usar um snapshot para criar o disco e o disco resultante tiver partições, a montagem também falhará.
Como funciona
Os volumes de disco usam o plug-in FlexVolume com o driver alicloud/disk. Ao chamar CreateContainerGroup, você:
Declara um volume com os parâmetros
Volume.N.*e especifica a source do disco (disco existente ou novo).Monta o volume declarado em um contêiner com os parâmetros
Container.N.VolumeMount.N.*e defina o caminho de montagem e o comportamento.
Os dois modos de provisionamento diferem na source do disco:
|
Modo |
Quando usar |
Parâmetro principal |
|
Provisionamento estático |
Você já tem um disco para anexar |
|
|
Provisionamento dinâmico |
O ECI cria um novo disco na inicialização |
|
Declare um volume
Defina os seguintes parâmetros Volume.N.* para declarar um volume de disco.
|
Parâmetro |
Tipo |
Exemplo |
Descrição |
|
|
String |
|
Nome do volume. Referenciado por |
|
|
String |
|
Defina como |
|
|
String |
|
Defina como |
|
|
String |
|
Tipo de sistema de arquivos. Valores válidos: |
|
|
String |
|
String JSON com a configuração do disco. Consulte as seções a seguir para ver as chaves disponíveis. |
Provisionamento estático — use um disco existente
Forneça volumeId em FlexVolume.Options para anexar um disco existente. O disco deve estar no estado Pending e na mesma zona de disponibilidade da instância. Quando volumeId for especificado, todos os outros parâmetros de atributo do disco (volumeSize, performanceLevel, etc.) serão ignorados. Caso não especifique volumeId, especifique volumeSize.
|
Chave de opção |
Descrição |
|
|
ID do disco a ser anexado. |
Provisionamento dinâmico — crie um novo disco
Omita volumeId e forneça volumeSize para que o ECI crie um novo disco na inicialização. O sistema usa automaticamente um SSD aprimorado (ESSD); não é possível especificar a categoria do disco.
|
Chave de opção |
Obrigatório |
Descrição |
|
|
Sim |
Tamanho do disco em GiB. Valores válidos: 20–32768. Se você também especificar |
|
|
Não |
Nível de desempenho (PL) do ESSD. Consulte ESSDs. |
|
|
Não |
Indica se o disco deve ser liberado quando a instância for liberada. Padrão: |
|
|
Não |
Indica se o disco deve ser criptografado. Padrão: |
|
|
Não |
ID da chave do Key Management Service (KMS) usada para criptografia do disco. |
|
|
Não |
ID do snapshot a ser usado na criação do disco. Consulte Visão geral. |
|
|
Não |
Tags para anexar ao disco. Até 20 tags. Formato: |
Monte um volume em um contêiner
Após declarar um volume, use os parâmetros Container.N.VolumeMount.N.* para montá-lo em um contêiner.
|
Parâmetro |
Tipo |
Exemplo |
Descrição |
|
|
String |
|
Nome do volume a ser montado. Deve corresponder a um valor de |
|
|
String |
|
Caminho dentro do contêiner onde o volume é montado. Dados existentes nesse caminho ficam ocultos pelo volume. |
|
|
String |
|
Subdiretório do volume a ser montado. Use este parâmetro para montar diferentes subdiretórios do mesmo volume em contêineres distintos. |
|
|
Boolean |
|
Define se o caminho de montagem é somente leitura. Padrão: |
|
|
String |
|
Controla se as montagens são compartilhadas entre contêineres e o host. Padrão: |
Modos de propagação de montagem
|
Valor |
O que o contêiner vê |
O que o host vê |
|
|
Apenas montagens presentes no momento da anexação; nenhuma montagem subsequente neste volume ou em seus subdiretórios fica visível. |
Nenhuma montagem criada dentro do contêiner fica visível no host. |
|
|
Todas as montagens subsequentes feitas neste volume ou em seus subdiretórios no host tornam-se visíveis dentro do contêiner. |
Nenhuma montagem criada dentro do contêiner fica visível no host. |
|
|
Todas as montagens subsequentes feitas neste volume ou em seus subdiretórios no host tornam-se visíveis dentro do contêiner. |
Todas as montagens criadas dentro do contêiner propagam-se de volta para o host e para todos os contêineres de todas as elastic container instances que usam o mesmo volume. |
Para montar volumes em init containers, use os mesmos parâmetros comInitContainerno lugar deContainer.
Exemplos
Os exemplos a seguir mostram os principais parâmetros a serem passados para CreateContainerGroup.
Exemplo 1: Provisionamento estático (disco existente)
ContainerGroupName=test-disk1
SecurityGroupId=sg-bp1daxpbz9lzpvvc****
VSwitchId=vsw-bp1gds63lmlm7ib05****
# Declare the volume
Volume.1.Name=disk-demo
Volume.1.Type=FlexVolume
Volume.1.FlexVolume.Driver=alicloud/disk
Volume.1.FlexVolume.FsType=ext4
Volume.1.FlexVolume.Options={"volumeId":"d-2zebuamrpar7xnj****"}
# Mount the volume to the container
Container.1.Name=nginx
Container.1.Image=registry-vpc.cn-hangzhou.aliyuncs.com/eci_open/nginx:1.14.2
Container.1.VolumeMount.1.Name=disk-demo
Container.1.VolumeMount.1.MountPath=/data
O disco deve estar no estado Pending e na mesma zona de disponibilidade da instância antes de você executar esta operação.
Exemplo 2: Provisionamento dinâmico (novo disco)
ContainerGroupName=test-disk2
# Declare the volume
Volume.1.Name=disk-demo
Volume.1.Type=FlexVolume
Volume.1.FlexVolume.Driver=alicloud/disk
Volume.1.FlexVolume.FsType=ext4
Volume.1.FlexVolume.Options={"volumeSize":"50","tags":"test:eci"}
# Mount the volume to the container
Container.1.Name=nginx
Container.1.Image=registry-vpc.cn-hangzhou.aliyuncs.com/eci_open/nginx:1.14.2
Container.1.VolumeMount.1.Name=disk-demo
Container.1.VolumeMount.1.MountPath=/data
Um ESSD de 50 GiB é criado automaticamente quando a instância é iniciada. Por padrão, o disco é liberado junto com a instância (deleteWithInstance: true).
O exemplo a seguir mostra como usar o software development kit (SDK) Python (versão 1.0.8 ou posterior) para criar uma aplicação MySQL. Os arquivos de dados são salvos em um disco em nuvem com o ID d-2zefzudpm3649e****.
from aliyunsdkcore.client import AcsClient
from aliyunsdkeci.request.v20180808.CreateContainerGroupRequest import CreateContainerGroupRequest
client = AcsClient('LTAI5tRxth3WTjpJWeURGogg', 'iUXTd7GLjGHbazSvg06ykJH60nLU8A', 'cn-shanghai')
request = CreateContainerGroupRequest()
request.set_SecurityGroupId("sg-xxx")
request.set_VSwitchId("vsw-xxx")
request.set_ContainerGroupName("name-xxx")
request.set_EipInstanceId("eip-xxx")
request.set_RestartPolicy('Always')
# volume1 is a cloud disk volume used to save MySQL data files
volume1 = {
'Name': 'mysql-data-volume',
'Type': 'FlexVolume',
'FlexVolume.Driver': 'alicloud/disk',
'FlexVolume.FsType': 'ext4',
'FlexVolume.Options': '{\"volumeId\": \"d-2zefzudpm3649e****\"}',
}
# volume2 is a ConfigFile volume used to inject configuration data. The Content must be Base64-encoded.
configFileToPath = {
'Path': 'my.cnf',
'Content': 'aGVsbG8gd29ybGQ=',
}
volume2 = {
'Name': 'mysql-config-volume',
'Type': 'ConfigFileVolume',
'ConfigFileVolume.ConfigFileToPaths': [configFileToPath],
}
request.set_Volumes([volume1, volume2])
volume_mount1 = {
'Name': 'mysql-data-volume',
'MountPath': '/var/lib/mysql',
'ReadOnly': False,
}
volume_mount2 = {
'Name': 'mysql-config-volume',
'MountPath': '/etc/mysql/conf.d/',
'ReadOnly': False,
}
# Environment variable
env = {
'Key': 'MYSQL_ROOT_PASSWORD',
'Value': '123456',
}
# Container ports
port = {
'Protocol': 'TCP',
'Port': 3306,
}
# Containers
container = {
'Image': 'mysql:5.7',
'Name': 'mysql',
'Cpu': 0.5,
'Memory': 1.0,
'ImagePullPolicy': 'Always',
'VolumeMounts': [volume_mount1, volume_mount2],
'EnvironmentVars': [env],
'Ports': [port],
}
request.set_Containers([container])
response = client.do_action_with_exception(request)
print(str(response))