Recipientes LXD e redes com IP estático

5

Eu fiz alguns testes do Docker ao longo dos anos, mas para um tipo específico de teste, eu preciso de um pouco mais do que apenas contêineres de aplicativos. Então eu virei para recipientes LXC / LXD, o que é ótimo. Depois de instalar o LXD, criei meu próprio contêiner:

>> willem@ubuntu:/$ lxc launch images:centos/7/amd64 thing Creating thing
Starting thing 
>> willem@ubuntu:/$ lxc list
+-------+---------+------------------+------+------------+-----------+ 
| NAME  |  STATE  |       IPV4       | IPV6 |    TYPE    | SNAPSHOTS |
+-------+---------+------------------+------+------------+-----------+ 
| thing | RUNNING | 10.0.3.30 (eth0) |      | PERSISTENT |         0 |
+-------+---------+------------------+------+------------+-----------+

Ótimo. Só que não pareço ter nenhum controle sobre o endereço IP aqui. Eu encontrei (com a ajuda do Google e localizei) um arquivo de controle:

>> root@ubuntu:/# locate lxc.conf 
/etc/init/lxc.conf 
..
/var/log/lxd/thing/lxc.conf

em que você pode colocar um (o que parece) endereço IP4 estático. Somente após a reinicialização do contêiner, o host parece ter esquecido o meu IP estático e recebe o do DHCP. Perguntas:

  • Qual é a maneira correta de fazer isso (o Docker mais recente tem uma opção --ip em docker run , que define o endereço IP)?
por Willem 02.03.2016 / 23:02

4 respostas

3

Essas configurações devem ser colocadas no arquivo /var/lib/lxc/ContainerName/config . Os valores possíveis dos parâmetros são especificados no no Manual . Eles pertencem a áreas diferentes, hostname, rede, console, ttys, ponto de montagem, cgroups, capacidades, ...

Na rede, você encontrará tudo o que precisa. Valores sensíveis são automaticamente produzidos para variáveis não especificadas. A parte mais relevante para sua pergunta é a seguinte:

lxc.network.name

the interface name is dynamically allocated, but if another name is needed because the configuration files being used by the container use a generic name, eg. eth0, this option will rename the interface in the container.

lxc.network.hwaddr

the interface mac address is dynamically allocated by default to the virtual interface, but in some cases, this is needed to resolve a mac address conflict or to always have the same link-local ipv6 address

lxc.network.ipv4

specify the ipv4 address to assign to the virtualized interface. Several lines specify several ipv4 addresses. The address is in format x.y.z.t/m, eg. 192.168.1.123/24. The broadcast address should be specified on the same line, right after the ipv4 address.

lxc.network.ipv4.gateway

specify the ipv4 address to use as the gateway inside the container. The address is in format x.y.z.t, eg. 192.168.1.123. Can also have the special value auto, which means to take the primary address from the bridge interface (as specified by the lxc.network.link option) and use that as the gateway. auto is only available when using the veth and macvlan network types.

    
por 03.03.2016 / 10:42
5

Se você quiser especificar endereços IP para contêineres no LXD, consulte o arquivo / etc / default / lxd-bridge. Lá você encontrará um local para incluir um arquivo de configuração externo do dnsmasq.

Supondo que você esteja no Ubuntu 16.04,

Abra / etc / default / lxd-bridge no seu editor favorito. Você precisará usar o sudo.

Por volta da linha 16,

LXD_CONFILE=""

Adicione uma entrada que aponte para um arquivo de configuração do dnsmasq. Você terá que criar este arquivo. Então nomeie o que você quiser. Algo como lxd_bridge.conf.

Em seguida, crie e edite o arquivo que você nomeou acima.

Adicione uma linha para cada container ao qual você deseja atribuir um endereço IP específico.

Assim:

dhcp-host = containername, ipaddress

Em seguida, você precisará reiniciar o lxd-bridge e, em seguida, reiniciar os contêineres.

Aqui está um artigo detalhado sobre isso:

IPs estáticos do LXD

Observe que, se você estiver executando o Alpine Linux em seus contêineres, etapas adicionais precisam ser tomadas para que isso funcione. alpino

    
por 03.08.2016 / 20:11
1

Informações do sistema: lxc-3.0.1 on Ubuntu Server 18.04.1 .

Depois de muita pesquisa, encontrei este comando simples para atribuir um ip estático a um contêiner:

lxc config set [container] raw.lxc 'lxc.net.[i].ipv4.address = [ip]/[subnet-mask]'

em que [container] , [i] , [ip] e [subnet-mask] são o nome do contêiner, o número da interface de rede, o endereço IP estático desejado e o CIDR da máscara de sub-rede desejada, respectivamente.

Por exemplo, se você deseja atribuir 240.10.0.20 com a máscara de sub-rede 255.255.255.0 à 0'th interface de rede do contêiner denominado hello , é possível usar:

lxc config set hello raw.lxc 'lxc.net.0.ipv4.address = 240.10.0.20/24'

Dê uma olhada aqui para obter as chaves de configuração aceitáveis que podem ser adicionadas %código%. Esta página da Web contém informações sobre a notação CIDR.

Você provavelmente precisará reiniciar o contêiner após executar o comando.

Infelizmente, não consigo lembrar onde encontrei essa solução pela primeira vez. Aqui está um problema do GitHub relevante que pode conter informações úteis.

    
por 14.09.2018 / 23:34
0

Para quem ainda está lutando como atribuir endereços IP estáticos aos contêineres lxd.

Minha primeira tentativa foi fazê-lo sobre o dnsmasq, então eu adicionei os endereços IP dos contêineres em /var/lib/lxd/networks/lxdbr0/dnsmasq.hosts/<container> e recarreguei o serviço dnsmasq. Ele realmente funcionou, mas não persistiu depois de reiniciar o host.

Eu pensei que deveria ser possível conseguir isso com a ferramenta lxd. Na verdade, foi mencionado no lcd-doc . Eu realmente não sabia como configurar a chave user.network-config usando o comando lxc config set <container> user.network-config <value> . Desde que eu não pude injetar vários chave: valores no argumento de valor.

  1. verifique a sub-rede do contêiner

    lxc network show lxdbr0
    
  2. primeiro crie um arquivo yml (network.yml) com o seguinte valor

    version: 1
    config:
      - type: physical
        name: eth1
        subnets:
          - type: static
            ipv4: true
            address: <ip>
            netmask: 255.255.255.0
            gateway: <gateway> // ends often with .1
            control: auto
      - type: nameserver
        address: 8.8.8.8       // for example
    
  3. crie um contêiner com essas configurações de rede

    lxc launch ubuntu:18.04 test --config=user.network-config="$(cat network.yml)"    
    

voalá :)

Eu tentei mudar o endereço IP depois de criar o container

   lxc config set <container> user.network-config "$(cat network.yml)"

Eu reiniciei o contêiner, mas o ip não foi atualizado. Se algum corpo souber como fazê-lo funcionar depois de criar o contêiner, ficarei muito grato.

lxd versão 3.0.1

    
por 04.07.2018 / 19:08