さくらのクラウドでLXDのコンテナにグローバルIPアドレスを使う話
サーバ
Published: 2021-02-11

मैं साकुरा के क्लाउड में LXD का उपयोग कर रहा हूं, लेकिन LXD के कंटेनर में सीधे वैश्विक IP पते लगाने या स्थानीय स्विच के IP पते को सीधे लगाने के समय की नोट्स साझा कर रहा हूं।

इस बार, मैं Ubuntu20.04 पर वास्तव में निर्माण करने की कोशिश करूंगा।

संरचना

  • राउटर + स्विच से सीधे जुड़े हुए हैं
  • डिस्क दो हैं। VM के OS के लिए और LXD के कंटेनर के लिए

निर्माण

OS इंस्टॉलेशन आदि को छोड़ दिया गया है।
साकुरा के क्लाउड में उपलब्ध Ubuntu20.04.01LTS का आर्काइव इमेज का उपयोग किया जा रहा है।
/dev/vda पर OS स्थापित किया गया है और /dev/vdb को 100GB के अतिरिक्त डिस्क के रूप में माना गया है।

ubuntu@lxd:~$ cat /proc/partitions
major minor  #blocks  name

  11        0    1048575 sr0
 252        0   20971520 vda
 252        1       1024 vda1
 252        2    4194304 vda2
 252        3   16774144 vda3
 252       16  104857600 vdb

LXD की सेटअप

  • LXD का इंस्टॉलेशन
ubuntu@lxd:~$ sudo lxd init
  • LXD का प्रारंभिक सेटअप
ubuntu@lxd:~$ sudo lxd init
Would you like to use LXD clustering? (yes/no) [default=no]:
Do you want to configure a new storage pool? (yes/no) [default=yes]:
Name of the new storage pool [default=default]:
Name of the storage backend to use (zfs, ceph, btrfs, dir, lvm) [default=zfs]:
Create a new ZFS pool? (yes/no) [default=yes]:
Would you like to use an existing empty block device (e.g. a disk or partition)? (yes/no) [default=no]: yes
Path to the existing block device: /dev/vdb
Would you like to connect to a MAAS server? (yes/no) [default=no]:
Would you like to create a new local network bridge? (yes/no) [default=yes]: no
Would you like to configure LXD to use an existing bridge or host interface? (yes/no) [default=no]:
Would you like the LXD server to be available over the network? (yes/no) [default=no]:
Would you like stale cached images to be updated automatically? (yes/no) [default=yes]
Would you like a YAML "lxd init" preseed to be printed? (yes/no) [default=no]:

/dev/vdb को zfs के रूप में उपयोग करने के लिए सेट किया गया।

हालांकि, इस स्थिति में zfs कमांड भी स्थापित नहीं है, इसलिए इसे स्थापित कर लेते हैं।

  • zfsutils-linux को इंस्टॉल करें
$ sudo apt install zfsutils-linux

ब्रिज बनाएं और कंटेनर को वैश्विक IP पता दें!

ऐसा लगता है कि आप ऐसा ही करने की उम्मीद कर रहे होंगे।
साकुरा के क्लाउड में, इससे कंटेनर से बाहरी संचार नहीं हो सकता है।

साकुरा क्लाउड मैनुअल स्विच और राउटर + स्विच से गुजरने में असमर्थ पैकेट है?

यदि स्रोत MAC पता सर्वर बनाने के समय आवंटित से भिन्न है, तो यह पार नहीं होगा।

इसलिए, ऊपर दिए गए चित्र में VM बनाने के समय आवंटित किए गए ens3 के MAC पते को स्रोत के रूप में उपयोग करके,
दूसरी संचार राउटर + स्विच के माध्यम से पारित नहीं हो सकती है, इसलिए कंटेनर के eth0 के MAC पते (स्वचालित रूप से उत्पन्न) के द्वारा
पार नहीं हो सकता।

कंटेनर बनाएं और ipvlan का उपयोग करें

ब्रिज का उपयोग नहीं कर सकते, इसलिए IP पते आवंटित करने के लिए ipvlan का उपयोग करने का निर्णय लिया गया है।

ipvlan में MAC पता होस्ट का साझा किया गया है और उपयुक्त रूप से अतिरिक्त IP पते को
LXD को आवंटित किया गया है।

  • ipvlan का उपयोग करते समय, forwarding को सक्षम करने की आवश्यकता है।
ubuntu@lxd:~$ sudo sed -i 's/#net.ipv4.ip_forward=1/net.ipv4.ip_forward=1/' /etc/sysctl.conf
ubuntu@lxd:~$ sudo sysctl --system
  • कंटेनर का निर्माण
ubuntu@lxd:~$ lxc launch images:ubuntu/20.04 container1
Creating container1

The instance you are starting doesn't have any network attached to it.
  To create a new network, use: lxc network create
  To attach a network to an instance, use: lxc network attach

Starting container1
ubuntu@lxd:~$ lxc list
+------------+---------+------+------+-----------+-----------+
|    NAME    |  STATE  | IPV4 | IPV6 |   TYPE    | SNAPSHOTS |
+------------+---------+------+------+-----------+-----------+
| container1 | RUNNING |      |      | CONTAINER | 0         |
+------------+---------+------+------+-----------+-----------+

इस स्थिति में NIC आवंटित नहीं है, इसलिए NIC को आवंटित करें और ipvlan की सेटिंग करें।
हालांकि, जब कंटेनर चल रहा होता है तो NIC को आवंटित नहीं किया जा सकता इसलिए इसे कुछ समय के लिए रोकना होगा।

  • कंटेनर को रोकें
ubuntu@lxd:~$ lxc stop container1
  • NIC का आवंटन
ubuntu@lxd:~$ lxc config device add container1 eth0 nic nictype=ipvlan parent=ens3 ipv4.address=27.133.xx.85
Device eth0 added to container1
  • समय क्षेत्र को JST में सेट करें
ubuntu@lxd:~$ lxc config set container1 environment.TZ Asia/Tokyo
  • कंटेनर को शुरू करें
ubuntu@lxd:~$ lxc start container1
  • कंटेनर के भीतर जाएं और नेटवर्क सेटिंग करें
ubuntu@lxd:~$ lxc exec container1 bash
root@container1:~#
  • /etc/netplan/10-lxc.yaml है इसलिए इसे संपादित करें
root@container1:~# cat << _EOF_ > /etc/netplan/10-lxc.yaml
network:
  version: 2
  ethernets:
    eth0:
      addresses: [ "27.133.xx.85/28" ]
      gateway4: 27.133.xx.81
      dhcp4: false
      nameservers:
        addresses: [ "8.8.8.8", "8.8.4.4" ]
_EOF_
  • netplan को लागू करें
root@container1:~# netplan apply
  • सफलता के साथ बाहरी संचार किया जा सका है।
root@container1:~# ping sakura.ad.jp -c5
PING sakura.ad.jp (163.43.24.70) 56(84) bytes of data.
64 bytes from vip1a.www.sakura.ad.jp (163.43.24.70): icmp_seq=1 ttl=63 time=0.290 ms
64 bytes from vip1a.www.sakura.ad.jp (163.43.24.70): icmp_seq=2 ttl=63 time=0.341 ms
64 bytes from vip1a.www.sakura.ad.jp (163.43.24.70): icmp_seq=3 ttl=63 time=0.304 ms
64 bytes from vip1a.www.sakura.ad.jp (163.43.24.70): icmp_seq=4 ttl=63 time=0.347 ms
64 bytes from vip1a.www.sakura.ad.jp (163.43.24.70): icmp_seq=5 ttl=63 time=0.340 ms

--- sakura.ad.jp ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4027ms
rtt min/avg/max/mdev = 0.290/0.324/0.347/0.022 ms

सारांश

इस तरह से ipvlan का उपयोग करके, साकुरा के क्लाउड के राउटर + स्विच से LXD के कंटेनर को वैश्विक IP पता आवंटित किया जा सकता है,
जिससे यह परीक्षण आदि के लिए सहायक होता है या छोटी बाहरी सार्वजनिक सर्वर को एकत्रित करने में मदद करता है।