Jaringan antara KVM VM dan kontainer docker pada host yang sama

Pada Host Debian-Stretch (terhubung ke LAN fisik) saya memiliki instalasi docker baru (v18.09) dengan satu wadah database (port dipetakan ke host) dan saya menjalankan KVM/libvirt dengan beberapa vm Debian-Stretch. Saya dapat mengakses wadah buruh pelabuhan dan VM dari LAN (tergantung pada konfigurasi melalui terowongan SSH atau langsung) tetapi saya berjuang untuk mengakses wadah buruh pelabuhan dari VM.

enter image description here

# brctl showbridge name         bridge id           STP enabled interfacesbr-f9f3ccd64037     8000.0242b3ebe3a0   no      docker0             8000.024241f39b89   no      veth35454acvirbr0              8000.525400566522   yes     virbr0-nic

Setelah membaca selama berhari-hari, saya menemukan satu solusi yang sangat menarik dalam posting ini Docker dan KVM dengan Jembatan (asli) bahwa saya tidak bisa bekerja. Solusinya menyarankan untuk memulai docker dengan daemon konfigurasi satu baris.kode json untuk menggunakan jembatan "default" KVM. Betapa senangnya itu! Apakah ada harapan?

Saya mencoba dua konfigurasi berbeda untuk jaringan antara VM KVM. Dalam kedua kasus, komunikasi antara VM dan ke LAN+router+cloud sempurna tetapi saya tidak tahu cara melewati pagar - ke rumput yang lebih hijau... :)

Conf 1-KVM default bridge dengan NAT: saya dapat ssh ke host Debian dan mengakses port kontainer docker tetapi apakah ada pengaturan dengan rute langsung?

Conf 2-macvtap adapter dalam mode Bridge ke LAN: saya tidak bisa ping host LAN IP dari VM meskipun keduanya terhubung ke router yang sama. Respon dari VM itu sendiri adalah Destination Host Unreachable. Ada yang berpikir mengapa?

Apakah lebih baik menjalankan daemon docker di VM terpisah daripada langsung di host Debian? Dengan cara ini, wadah dan VM, dapat mengakses jembatan default KVM. Tapi saya pikir agak aneh menjalankan docker di VM pada Host KVM.

Setiap panduan yang jelas akan dihargai!

Btw, jembatan br-f9f3ccd64037 adalah jembatan yang ditentukan pengguna yang saya buat dengan docker untuk komunikasi antar-kontainer di masa mendatang. Hal ini tidak digunakan.

Pembaruan:

Saya baru menyadari bahwa dengan konfigurasi pertama saya cukup terhubung ke wadah docker dengan alamat IP-nya (172.17.0.2) dari tamu VM.

Pengaturan awal saya adalah konfigurasi kedua karena saya ingin RDP ke VMs, yang lebih mudah karena driver macvtap menghubungkan VMs langsung ke LAN dan tidak diperlukan tautan SSH. Saat itulah saya tidak bisa mencapai wadah.

Solusinya sesederhana yang dinyatakan dalam artikel terkait. Saya tidak yakin mengapa konfigurasi saya tidak berubah saat pertama kali saya me-restart daemon docker.

Setelah saya menemukan bukti di Docker daemon dokumentasi untuk argumen jembatan di daemon.json, saya mencobanya lagi dan daemon buruh pelabuhan mengambil jembatan default KVM saat startup.

Pertama saya membuat file konfigurasi /etc/docker/daemon.json seperti yang disarankan dalam dokumentasi dengan konten berikut (baris iptables bahkan mungkin tidak diperlukan):

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

yang dibutuhkan hanyalah:

docker stop mysqlsystemctl stop dockersystemctl start dockerdocker start mysql

Dan kontainer docker yang ada berjalan di jembatan KVM. Alamat IP wadah dapat diperiksa dengan:

docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mysql192.168.122.2

Saya tidak yakin apakah saya dapat menghapus jembatan docker0 sekarang, tetapi wadah terdaftar di bawah virbr0 bersama dengan tiga vm.

brctl showbridge name bridge id           STP enabled interfacesdocker0     8000.024241f39b89   no      virbr0      8000.068ff2a4a56e   yes         veth2abcff1                                            virbr0-nic                                            vnet0                                            vnet1                                            vnet2

Saya terbiasa menerapkannya menggunakan pengaturan berikut :

  • Saya membuat br0 jembatan dengan nic fisik di dalamnya

  • mesin kvm terhubung di jembatan menggunakan QEMU XML config snippet di bawah ini

    <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>
  • tumpukan docker semuanya berjalan sama: saya memesan IP yang dapat dirutekan publik untuk setiap tumpukan. Saya menghubungkan IP publik ini ke Jembatan br0 menggunakan potongan konfigurasi layanan opensvc di bawah ini.

    • the [ip#0] bagian memberitahu bahwa kita ingin ip 1.2.3.4 dikonfigurasi ke dalam wadah dengan ID sumber daya container#0 yang merupakan docker google / pause, dan terhubung ke bridge br0

    • semua dockers lain dalam Konfigurasi Jaringan stack herit dari container#0 karena konfigurasi netns = container#0 dalam deklarasi docker

    • ketika layanan opensvc dimulai, pengaturan jaringan dilakukan oleh agen, menghasilkan semua perintah yang dilaporkan dalam log di bawah ini

konfigurasi layanan opensvc

[DEFAULT]docker_daemon_args = --log-opt max-size=1m --storage-driver=zfs --iptables=falsedocker_data_dir = /{env.base_dir}/dockerenv = PRDnodes = srv1.acme.com srv2.acme.comorchestrate = startid = 4958b24d-4d0f-4c30-71d2-bb820e043a5d[fs#1]dev = {env.pool}/{namespace}-{svcname}mnt = {env.base_dir}mnt_opt = rw,xattr,acltype = zfs[fs#2]dev = {env.pool}/{namespace}-{svcname}/dockermnt = {env.base_dir}/dockermnt_opt = rw,xattr,acltype = zfs[fs#3]dev = {env.pool}/{namespace}-{svcname}/datamnt = {env.base_dir}/datamnt_opt = rw,xattr,acltype = zfs[ip#0]netns = container#0ipdev = br0ipname = 1.2.3.4netmask = 255.255.255.224gateway = 1.2.3.1type = netns[container#0]hostname = {svcname}image = google/pauserm = truerun_command = /bin/shtype = docker[container#mysvc]image = mysvc/mysvc:4.1.3netns = container#0run_args = -v /etc/localtime:/etc/localtime:ro    -v {env.base_dir}/data/mysvc:/home/mysvc/server/datatype = docker[env]base_dir = /srv/{namespace}-{svcname}pool = data

startup log

2019-01-04 11:27:14,617 - srv1.acme.com.appprd.mysvc.ip#0 - INFO - checking 1.2.3.4 availability2019-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-mysvc2019-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/docker2019-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/data2019-01-04 11:27:19,643 - srv1.acme.com.appprd.mysvc - INFO - starting docker daemon2019-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=cgroupfs2019-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/sh2019-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 - f790e192b5313d7c3450cb257d075620f40c2bad3d69d52c8794eccfe954f2502019-01-04 11:27:30,987 - srv1.acme.com.appprd.mysvc.container#0 - INFO - wait for up status2019-01-04 11:27:31,031 - srv1.acme.com.appprd.mysvc.container#0 - INFO - wait for container operational2019-01-04 11:27:31,186 - srv1.acme.com.appprd.mysvc.ip#0 - INFO - bridge mode2019-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 15002019-01-04 11:27:31,273 - srv1.acme.com.appprd.mysvc.ip#0 - INFO - /sbin/ip link set veth0pl20321 master br02019-01-04 11:27:31,277 - srv1.acme.com.appprd.mysvc.ip#0 - INFO - /sbin/ip link set veth0pl20321 up2019-01-04 11:27:31,281 - srv1.acme.com.appprd.mysvc.ip#0 - INFO - /sbin/ip link set veth0pg20321 netns 203212019-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 eth02019-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 eth02019-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 up2019-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.12019-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.42019-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.32019-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 - 1616cade9257d0616346841c3e9f0d639a9306e1af6fd750fe70e17903a110112019-01-04 11:27:37,797 - srv1.acme.com.appprd.mysvc.container#mysvc - INFO - wait for up status2019-01-04 11:27:37,833 - srv1.acme.com.appprd.mysvc.container#mysvc - INFO - wait for container operational

Ketika saya membaca pertanyaan itu, saya ingin melihat apakah ada cara untuk terhubung virbr0 ke jaringan Docker. Gambar di bawah ini adalah modifikasi saya dari apa yang saya pikir diminta:

enter image description here

Jika demikian, jawabannya adalah dengan menggunakan macvlan jaringan, yang memungkinkan Anda untuk melampirkan jaringan docker langsung ke perangkat host. Jadi sesuatu seperti berikut ini akan memberi Anda apa yang Anda inginkan:

docker network create --driver=macvlan --subnet=192.168.0.0/16 -o parent=virbr0 mynet