web-dev-qa-db-fra.com

Mise en réseau entre KVM VM et conteneur Docker sur le même hôte

Sur un hôte Debian-Stretch (connecté à un réseau local physique), j'ai une nouvelle installation de docker (v18.09) avec un conteneur de base de données (port mappé à l'hôte) et j'exécute KVM/libvirt avec certaines machines virtuelles Debian-Stretch. Je peux accéder au conteneur Docker et aux machines virtuelles à partir du réseau local (en fonction de la configuration via le tunnel SSH ou direct), mais j'ai du mal à accéder au conteneur Docker à partir des machines virtuelles.

enter image description here

# brctl show
bridge name         bridge id           STP enabled interfaces
br-f9f3ccd64037     8000.0242b3ebe3a0   no      
docker0             8000.024241f39b89   no      veth35454ac
virbr0              8000.525400566522   yes     virbr0-nic

Après avoir lu pendant des jours, j'ai trouvé une solution très convaincante dans ce post Docker et KVM avec un pont ( original ) que je n'ai pas La solution suggère d'initier Docker avec un code de configuration daemon.json d'une ligne pour utiliser le pont KVM "par défaut". Comme ce serait bien! Y a-t-il de l'espoir?

J'ai essayé deux configurations différentes pour la mise en réseau entre les machines virtuelles KVM. Dans les deux cas, la communication entre les machines virtuelles et le LAN + routeur + cloud est sans faille, mais je ne sais tout simplement pas comment surmonter la clôture - à l'herbe plus verte ... :)

Conf 1 - KVM bridge par défaut avec NAT: je peux accéder à l'hôte Debian et accéder au port du conteneur docker mais y a-t-il une configuration avec une route directe?

Conf 2 - adaptateur macvtap en mode pont vers le réseau local: je ne peux pas envoyer de requête ping à l'adresse IP du réseau local hôte à partir du VM bien que les deux soient connectés au même routeur. Réponse du VM lui-même est Destination Host Unreachable. Tu as pensé pourquoi?

Serait-il préférable d'exécuter le démon docker dans un VM plutôt que directement sur l'hôte Debian? De cette façon, le conteneur et la VM pourraient accéder au KVM bridge par défaut. Mais je pensais que c'était un peu étrange d'exécuter docker dans un VM sur un KVM Host.

Tout conseil clair serait apprécié!

Btw, le pont br-f9f3ccd64037 est un pont défini par l'utilisateur que j'ai créé avec docker pour les futures communications entre conteneurs. Il n'est pas utilisé.

Mise à jour:

Je viens de réaliser qu'avec la première configuration, je peux simplement me connecter au conteneur Docker par son adresse IP (172.17.0.2) à partir des invités VM.

Ma configuration initiale était la deuxième configuration parce que je voulais RDP dans les VMs, ce qui est plus facile car le pilote macvtap connecte les VMs directement au LAN et aucun lien SSH n'est nécessaire. C'est alors que je n'ai pas pu atteindre le conteneur.

7
sdittmar

La solution était aussi simple que celle indiquée dans l'article lié. Je ne sais pas pourquoi ma configuration n'a pas changé la première fois que j'ai redémarré le démon docker.

Après avoir trouvé des preuves dans la documentation du démon Docker pour l'argument bridge dans daemon.json, je lui ai donné un nouvel essai et le démon docker a pris le pont par défaut KVM sur Commencez.

J'ai d'abord créé le fichier de configuration /etc/docker/daemon.json comme suggéré dans la documentation avec le contenu suivant (la ligne iptables peut même ne pas être nécessaire):

{
"bridge": "virbr0",
"iptables": false
}

tout ce qui était nécessaire était:

docker stop mysql
systemctl stop docker
systemctl start docker
docker start mysql

Et le conteneur docker existant s'exécutait sur le pont KVM. L'adresse IP du conteneur peut être vérifiée avec:

docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mysql
192.168.122.2

Je ne sais pas si je peux supprimer le pont docker0 maintenant, mais le conteneur est répertorié sous virbr0 avec les trois machines virtuelles.

brctl show
bridge name bridge id           STP enabled interfaces
docker0     8000.024241f39b89   no      
virbr0      8000.068ff2a4a56e   yes         veth2abcff1
                                            virbr0-nic
                                            vnet0
                                            vnet1
                                            vnet2
2
sdittmar

J'ai l'habitude de l'implémenter en utilisant la configuration suivante:

  • Je crée un br0 pont avec le physique à l'intérieur

  • les machines kvm sont connectées sur le pont à l'aide de l'extrait de configuration qemu xml ci-dessous

    <interface type='bridge'>
      <mac address='52:54:00:a9:28:0a'/>
      <source bridge='br0'/>
      <model type='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    </interface>
  • les piles de docker fonctionnent toutes de la même façon: je réserve une IP routable publique pour chaque pile. Je connecte cette adresse IP publique au pont br0 en utilisant l'extrait de configuration du service opensvc ci-dessous.

    • le [ip#0] la section indique que nous voulons que l'ip 1.2.3.4 configuré dans le conteneur avec l'ID de ressource container#0 qui est un docker google/pause, et connecté au pont br0

    • tous les autres dockers de la configuration du réseau stack herit de container#0 en raison de la configuration netns = container#0 dans la déclaration de docker

    • lorsque le service opensvc démarre, la configuration du réseau est effectuée par l'agent, produisant toutes les commandes signalées dans les journaux ci-dessous

configuration du service opensvc

[DEFAULT]
docker_daemon_args = --log-opt max-size=1m --storage-driver=zfs --iptables=false
docker_data_dir = /{env.base_dir}/docker
env = PRD
nodes = srv1.acme.com srv2.acme.com
orchestrate = start
id = 4958b24d-4d0f-4c30-71d2-bb820e043a5d

[fs#1]
dev = {env.pool}/{namespace}-{svcname}
mnt = {env.base_dir}
mnt_opt = rw,xattr,acl
type = zfs

[fs#2]
dev = {env.pool}/{namespace}-{svcname}/docker
mnt = {env.base_dir}/docker
mnt_opt = rw,xattr,acl
type = zfs

[fs#3]
dev = {env.pool}/{namespace}-{svcname}/data
mnt = {env.base_dir}/data
mnt_opt = rw,xattr,acl
type = zfs

[ip#0]
netns = container#0
ipdev = br0
ipname = 1.2.3.4
netmask = 255.255.255.224
gateway = 1.2.3.1
type = netns

[container#0]
hostname = {svcname}
image = google/pause
rm = true
run_command = /bin/sh
type = docker

[container#mysvc]
image = mysvc/mysvc:4.1.3
netns = container#0
run_args = -v /etc/localtime:/etc/localtime:ro
    -v {env.base_dir}/data/mysvc:/home/mysvc/server/data
type = docker

[env]
base_dir = /srv/{namespace}-{svcname}
pool = data

journal de démarrage

2019-01-04 11:27:14,617 - srv1.acme.com.appprd.mysvc.ip#0 - INFO - checking 1.2.3.4 availability
2019-01-04 11:27:18,565 - srv1.acme.com.appprd.mysvc.fs#1 - INFO - mount -t zfs -o rw,xattr,acl data/appprd-mysvc /srv/appprd-mysvc
2019-01-04 11:27:18,877 - srv1.acme.com.appprd.mysvc.fs#2 - INFO - mount -t zfs -o rw,xattr,acl data/appprd-mysvc/docker /srv/appprd-mysvc/docker
2019-01-04 11:27:19,106 - srv1.acme.com.appprd.mysvc.fs#3 - INFO - mount -t zfs -o rw,xattr,acl data/appprd-mysvc/data /srv/appprd-mysvc/data
2019-01-04 11:27:19,643 - srv1.acme.com.appprd.mysvc - INFO - starting docker daemon
2019-01-04 11:27:19,644 - srv1.acme.com.appprd.mysvc - INFO - dockerd -H unix:///var/lib/opensvc/namespaces/appprd/services/mysvc/docker.sock --data-root //srv/appprd-mysvc/docker -p /var/lib/opensvc/namespaces/appprd/services/mysvc/docker.pid --exec-root /var/lib/opensvc/namespaces/appprd/services/mysvc/docker_exec --log-opt max-size=1m --storage-driver=zfs --iptables=false --exec-opt native.cgroupdriver=cgroupfs
2019-01-04 11:27:24,669 - srv1.acme.com.appprd.mysvc.container#0 - INFO - docker -H unix:///var/lib/opensvc/namespaces/appprd/services/mysvc/docker.sock run --name=appprd..mysvc.container.0 --detach --hostname mysvc --net=none --cgroup-parent /opensvc.slice/appprd.slice/mysvc.slice/container.slice/container.0.slice google/pause /bin/sh
2019-01-04 11:27:30,965 - srv1.acme.com.appprd.mysvc.container#0 - INFO - output:
2019-01-04 11:27:30,965 - srv1.acme.com.appprd.mysvc.container#0 - INFO - f790e192b5313d7c3450cb257d075620f40c2bad3d69d52c8794eccfe954f250
2019-01-04 11:27:30,987 - srv1.acme.com.appprd.mysvc.container#0 - INFO - wait for up status
2019-01-04 11:27:31,031 - srv1.acme.com.appprd.mysvc.container#0 - INFO - wait for container operational
2019-01-04 11:27:31,186 - srv1.acme.com.appprd.mysvc.ip#0 - INFO - bridge mode
2019-01-04 11:27:31,268 - srv1.acme.com.appprd.mysvc.ip#0 - INFO - /sbin/ip link add name veth0pl20321 mtu 1500 type veth peer name veth0pg20321 mtu 1500
2019-01-04 11:27:31,273 - srv1.acme.com.appprd.mysvc.ip#0 - INFO - /sbin/ip link set veth0pl20321 master br0
2019-01-04 11:27:31,277 - srv1.acme.com.appprd.mysvc.ip#0 - INFO - /sbin/ip link set veth0pl20321 up
2019-01-04 11:27:31,281 - srv1.acme.com.appprd.mysvc.ip#0 - INFO - /sbin/ip link set veth0pg20321 netns 20321
2019-01-04 11:27:31,320 - srv1.acme.com.appprd.mysvc.ip#0 - INFO - /usr/bin/nsenter --net=/var/lib/opensvc/namespaces/appprd/services/mysvc/docker_exec/netns/fc2fa9b2eaa4 ip link set veth0pg20321 name eth0
2019-01-04 11:27:31,356 - srv1.acme.com.appprd.mysvc.ip#0 - INFO - /usr/bin/nsenter --net=/var/lib/opensvc/namespaces/appprd/services/mysvc/docker_exec/netns/fc2fa9b2eaa4 ip addr add 1.2.3.4/27 dev eth0
2019-01-04 11:27:31,362 - srv1.acme.com.appprd.mysvc.ip#0 - INFO - /usr/bin/nsenter --net=/var/lib/opensvc/namespaces/appprd/services/mysvc/docker_exec/netns/fc2fa9b2eaa4 ip link set eth0 up
2019-01-04 11:27:31,372 - srv1.acme.com.appprd.mysvc.ip#0 - INFO - /usr/bin/nsenter --net=/var/lib/opensvc/namespaces/appprd/services/mysvc/docker_exec/netns/fc2fa9b2eaa4 ip route replace default via 1.2.3.1
2019-01-04 11:27:31,375 - srv1.acme.com.appprd.mysvc.ip#0 - INFO - /usr/bin/nsenter --net=/var/lib/opensvc/namespaces/appprd/services/mysvc/docker_exec/netns/fc2fa9b2eaa4 /usr/bin/python3 /usr/share/opensvc/lib/arp.py eth0 1.2.3.4
2019-01-04 11:27:32,534 - srv1.acme.com.appprd.mysvc.container#mysvc - INFO - docker -H unix:///var/lib/opensvc/namespaces/appprd/services/mysvc/docker.sock run --name=appprd..mysvc.container.mysvc -v /etc/localtime:/etc/localtime:ro -v /srv/appprd-mysvc/data/mysvc:/home/mysvc/server/data --detach --net=container:appprd..mysvc.container.0 --cgroup-parent /opensvc.slice/appprd.slice/mysvc.slice/container.slice/container.mysvc.slice mysvc/mysvc:4.1.3
2019-01-04 11:27:37,776 - srv1.acme.com.appprd.mysvc.container#mysvc - INFO - output:
2019-01-04 11:27:37,777 - srv1.acme.com.appprd.mysvc.container#mysvc - INFO - 1616cade9257d0616346841c3e9f0d639a9306e1af6fd750fe70e17903a11011
2019-01-04 11:27:37,797 - srv1.acme.com.appprd.mysvc.container#mysvc - INFO - wait for up status
2019-01-04 11:27:37,833 - srv1.acme.com.appprd.mysvc.container#mysvc - INFO - wait for container operational
2
Chaoxiang N