在 LXD 2.3 及以上版本中管理網路
介紹
當 LXD 2.0 隨著 Ubuntu 16.04 一起發布時,LXD 聯網就簡單了。要麼你可以使用 lxd init
來配置,為你的容器自己提供一個 「lxdbr0」 網橋,要麼使用一個已存在的物理介面。
雖然這確實有效,但是有點混亂,因為大部分的橋接配置發生在 Ubuntu 打包的 LXD 之外。那些腳本只能支持一個橋接,並且沒有通過 API 暴露,這使得遠程配置有點痛苦。
直到 LXD 2.3,LXD 終於發展了自己的網路管理 API ,並有相應的命令行工具。這篇文章試圖來簡述這些新的功能。
基礎聯網
在初始情況下,LXD 2.3 沒有定義任何網路。lxd init
會為你設置一個,並且默認情況下將所有新的容器連接到它,但是讓我們親手嘗試看下究竟發生了些什麼。
要創建一個新的帶有隨機 IPv4 和 IP6 子網,並啟用 NAT 的網路,只需要運行:
stgraber@castiana:~$ lxc network create testbr0
Network testbr0 created
你可以如下查看它的配置:
stgraber@castiana:~$ lxc network show testbr0
name: testbr0
config:
ipv4.address: 10.150.19.1/24
ipv4.nat: "true"
ipv6.address: fd42:474b:622d:259d::1/64
ipv6.nat: "true"
managed: true
type: bridge
usedby: []
如果你不想要那些自動配置的子網,你可以這麼做:
stgraber@castiana:~$ lxc network create testbr0 ipv6.address=none ipv4.address=10.0.3.1/24 ipv4.nat=true
Network testbr0 created
那就會這樣:
stgraber@castiana:~$ lxc network show testbr0
name: testbr0
config:
ipv4.address: 10.0.3.1/24
ipv4.nat: "true"
ipv6.address: none
managed: true
type: bridge
usedby: []
如果你的容器沒有使用它,那麼創建的網路對你也沒什麼用。要將你新創建的網路連接到所有容器,你可以這麼做:
stgraber@castiana:~$ lxc network attach-profile testbr0 default eth0
要將一個網路連接到一個已存在的容器中,你可以這麼做:
stgraber@castiana:~$ lxc network attach my-container default eth0
現在,假設你已經在機器中安裝了 openvswitch,並且要將這個網橋轉換成 OVS 網橋,只需更改為正確的驅動:
stgraber@castiana:~$ lxc network set testbr0 bridge.driver openvswitch
如果你想要一次性做一系列修改。lxc network edit
可以讓你在編輯器中交互編輯網路配置。
靜態租約及埠安全
使用 LXD 管理 DHCP 伺服器的一個好處是可以使得管理 DHCP 租約很簡單。你所需要的是一個容器特定的網卡設備以及正確的屬性設置。
root@yak:~# lxc init ubuntu:16.04 c1
Creating c1
root@yak:~# lxc network attach testbr0 c1 eth0
root@yak:~# lxc config device set c1 eth0 ipv4.address 10.0.3.123
root@yak:~# lxc start c1
root@yak:~# lxc list c1
+------+---------+-------------------+------+------------+-----------+
| NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS |
+------+---------+-------------------+------+------------+-----------+
| c1 | RUNNING | 10.0.3.123 (eth0) | | PERSISTENT | 0 |
+------+---------+-------------------+------+------------+-----------+
IPv6 也是相同的方法,但是換成 ipv6.address
屬性。
相似地,如果你想要阻止你的容器更改它的 MAC 地址或者為其他 MAC 地址轉發流量(比如嵌套),你可以用下面的命令啟用埠安全:
root@yak:~# lxc config device set c1 eth0 security.mac_filtering true
DNS
LXD 在網橋上運行 DNS 伺服器。除了設置網橋的 DNS 域( dns.domain
網路屬性)之外,還支持 3 種不同的操作模式(dns.mode
):
managed
:每個容器都會有一條 DNS 記錄,匹配它的名字以及已知的 IP 地址。容器無法通過 DHCP 改變這條記錄。dynamic
:允許容器通過 DHCP 在 DNS 中自行註冊。因此,在 DHCP 協商期間容器發送的任何主機名最終都出現在 DNS 中。none
: 針對那些沒有任何本地 DNS 記錄的遞歸 DNS 伺服器。
默認的模式是 managed
,並且典型的是最安全以及最方便的,因為它為容器提供了 DNS 記錄,但是不允許它們通過 DHCP 發送虛假主機名嗅探其他的記錄。
使用隧道
除了這些,LXD 還支持使用 GRE 或者 VXLAN 隧道連接到其他主機。
LXD 網路可以連接任何數量的隧道,從而輕鬆地創建跨多個主機的網路。這對於開發、測試和演示非常有用,生產環境通常更喜歡使用 VLAN 進行分割。
所以說,你想在主機 「edfu」 上有一個運行 IPv4 和 IPv6 的基礎 「testbr0」 網路,並希望在主機 「djanet」 上使用它來生成容器。最簡單的方法是使用組播 VXLAN 隧道。這種類型的隧道僅在兩個主機位於同一物理段上時才起作用。
root@edfu:~# lxc network create testbr0 tunnel.lan.protocol=vxlan
Network testbr0 created
root@edfu:~# lxc network attach-profile testbr0 default eth0
它在主機 「edfu」 上定義了一個 「testbr0」 橋接,並為其他主機能加入它設置了一個組播 VXLAN。在這個設置中,「edfu」 為這個網路扮演了一個路由器角色,提供 DHCP、DNS 等等,其他主機只是通過隧道轉發流量。
root@djanet:~# lxc network create testbr0 ipv4.address=none ipv6.address=none tunnel.lan.protocol=vxlan
Network testbr0 created
root@djanet:~# lxc network attach-profile testbr0 default eth0
現在你可以在任何一台主機上啟動容器,並看到它們從同一個地址池中獲取 IP,通過隧道直接互相通訊。
如先前所述,這個使用了組播,它通常在跨越路由器時無法很好工作。在這些情況下,你可以用單播模式使用 VXLAN 或者 GRE 隧道。
要使用 GRE 加入另一台主機,首先配置服務主機:
root@edfu:~# lxc network set testbr0 tunnel.nuturo.protocol gre
root@edfu:~# lxc network set testbr0 tunnel.nuturo.local 172.17.16.2
root@edfu:~# lxc network set testbr0 tunnel.nuturo.remote 172.17.16.9
接著是「客戶端」主機:
root@nuturo:~# lxc network create testbr0 ipv4.address=none ipv6.address=none tunnel.edfu.protocol=gre tunnel.edfu.local=172.17.16.9 tunnel.edfu.remote=172.17.16.2
Network testbr0 created
root@nuturo:~# lxc network attach-profile testbr0 default eth0
如果你像使用 VXLAN,只要這麼做:
root@edfu:~# lxc network set testbr0 tunnel.edfu.id 10
root@edfu:~# lxc network set testbr0 tunnel.edfu.protocol vxlan
還有:
root@nuturo:~# lxc network set testbr0 tunnel.edfu.id 10
root@nuturo:~# lxc network set testbr0 tunnel.edfu.protocol vxlan
這裡需要隧道 id 以防與已經配置的多播 VXLAN 隧道衝突。
這就是如何使用最近的 LXD 簡化跨主機聯網了!
總結
LXD 使得從簡單的單主機網路到數千個容器的非常複雜的跨主機網路的定義變得更加容易。它也使為一些容器定義一個新網路或者給容器添加第二個設備,並連接到隔離的私有網路變得很簡單。
雖然這篇文章介紹了支持的大部分功能,但仍有一些可以微調 LXD 網路體驗的竅門。可以在這裡找到完整的列表:https://github.com/lxc/lxd/blob/master/doc/configuration.md 。
額外信息
- LXD 主站:https://linuxcontainers.org/lxd
- Github 地址: https://github.com/lxc/lxd
- 郵件列表支持:https://lists.linuxcontainers.org
- IRC 頻道:#lxcontainers on irc.freenode.net
- 在線嘗試 LXD:https://linuxcontainers.org/lxd/try-it
via: https://www.stgraber.org/2016/10/27/network-management-with-lxd-2-3/
作者:Stéphane Graber 譯者:geekpi 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive