it-roy-ru.com

Сеть между KVM VM и док-контейнером на одном хосте)

На хосте Debian-Stretch (подключенном к физической локальной сети) у меня установлена ​​новая докерская установка (v18.09) с одним контейнером базы данных (порт сопоставлен с хостом), и я запускаю KVM/libvirt с некоторыми виртуальными машинами Debian-Stretch. Я могу получить доступ к Docker-контейнеру и виртуальным машинам из локальной сети (в зависимости от конфигурации через SSH-туннель или напрямую), но я изо всех сил пытаюсь получить доступ к Docker-контейнеру из виртуальных машин.

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

Прочитав несколько дней, я нашел одно очень убедительное решение в этом посте Docker и KVM с мостом ( оригинал ), которого я не сделал приступить к работе. В решении предлагается запустить докер с помощью однострочного кода конфигурации daemon.json, чтобы использовать мост KVM "по умолчанию"). Насколько это хорошо! Есть ли надежда?

Я попробовал две разные конфигурации для взаимодействия между виртуальными машинами KVM). В обоих случаях связь между виртуальными машинами и локальной сетью + маршрутизатор + облако безупречна, но я просто не знаю, как с этим справиться забор - к зеленой траве ... :)

Conf 1 - KVM мост по умолчанию с NAT: я могу подключиться по ssh к хосту Debian и получить доступ к порту док-контейнера, но есть ли настройка с прямым маршрутом?

Conf 2 - адаптер Macvtap в режиме моста к локальной сети: я не могу пропинговать IP-адрес хост-локальной сети с VM, хотя оба подключены к одному маршрутизатору. Ответ от VM само по себе является Destination Host Unreachable. Есть мысли почему?

Было бы лучше запустить демон докера в отдельном VM, а не непосредственно на хосте Debian? Таким образом, и контейнер, и виртуальная машина могут получить доступ к KVM мост по умолчанию. Но я подумал, что странно запускать докер на VM на KVM хосте).

Любое четкое руководство будет оценено!

Кстати, мост br-f9f3ccd64037 - это определенный пользователем мост, который я создал с помощью docker для будущей межконтейнерной связи. Не используется.

Update:

Я только что понял, что с первой конфигурацией я могу просто подключиться к док-контейнеру по его IP-адресу (172.17.0.2) из ​​гостей VM).

Моей первоначальной настройкой была вторая конфигурация, потому что я хотел включить RDP в виртуальные машины, что проще, поскольку драйвер macvtap подключает виртуальные машины напрямую к локальной сети, и соединение SSH не требуется. Вот когда я не смог добраться до контейнера.

7
sdittmar

Решение было так же просто, как указано в связанной статье. Я не уверен, почему моя конфигурация не изменилась при первом запуске демона docker.

После того, как я нашел в документации Docker-демона аргумент bridge в daemon.json, я дал ему еще одну попытку, и демон-докер поднял KVM мост по умолчанию при запуске.

Сначала я создал файл конфигурации /etc/docker/daemon.json, как это предлагается в документации, со следующим содержанием (строка iptables может даже не понадобиться):

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

все что было нужно было:

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

И существующий док-контейнер работал на мосту KVM. IP-адрес контейнера можно проверить с помощью:

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

Я не уверен, смогу ли я сейчас удалить мост docker0, но контейнер указан в списке virbr0 вместе с тремя виртуальными машинами.

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

Я привык реализовывать это, используя следующую настройку:

  • Я создаю br0 мост с физическим ником внутри

  • kVM-машины подключены к мосту с помощью приведенного ниже фрагмента конфигурации qemu xml.

    <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>
  • все стеки докеров работают одинаково: я резервирую общедоступный маршрутизируемый IP для каждого стека. Я подключаю этот публичный IP к мосту br0 используя приведенный ниже фрагмент конфигурации службы opensvc.

    • [ip#0] раздел говорит, что мы хотим, чтобы ip 1.2.3.4 настроен в контейнер с идентификатором ресурса container#0 который является докером google/pause и подключен к мосту br0

    • все остальные докеры в стеке из конфигурации сети из container#0 из-за конфигурации netns = container#0 в объявлении докера

    • при запуске службы opensvc настройка сети выполняется агентом, который выдает все команды, указанные в журналах ниже.

конфигурация службы 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

журнал запуска

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