LXD 2.0 系列(十):LXD 和 Juju
這是 LXD 2.0 系列介紹文章的第十篇。
介紹
Juju 是 Canonical 的服務建模和部署工具。 它支持非常廣泛的云服務提供商,使您能夠輕松地在任何云上部署任何您想要的服務。
此外,Juju 2.0 還支持 LXD,既適用于本地部署,也適合開發(fā),并且可以在云實例或物理機上共同協(xié)作。
本篇文章將關注本地使用,通過一個沒有任何Juju經驗的LXD用戶來體驗。
要求
本篇文章假設你已經安裝了 LXD 2.0 并且配置完畢(看前面的文章),并且是在 Ubuntu 16.04 LTS 上運行的。
設置 Juju
第一件事是在 Ubuntu 16.04 上安裝 Juju 2.0。這個很簡單:
- stgraber@dakara:~$ sudo apt install juju
- Reading package lists... Done
- Building dependency tree
- Reading state information... Done
- The following additional packages will be installed:
- juju-2.0
- Suggested packages:
- juju-core
- The following NEW packages will be installed:
- juju juju-2.0
- 0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded.
- Need to get 39.7 MB of archives.
- After this operation, 269 MB of additional disk space will be used.
- Do you want to continue? [Y/n]
- Get:1 http://us.archive.ubuntu.com/ubuntu xenial-updates/main amd64 juju-2.0 amd64 2.0~beta7-0ubuntu1.16.04.1 [39.6 MB]
- Get:2 http://us.archive.ubuntu.com/ubuntu xenial-updates/main amd64 juju all 2.0~beta7-0ubuntu1.16.04.1 [9,556 B]
- Fetched 39.7 MB in 0s (53.4 MB/s)
- Selecting previously unselected package juju-2.0.
- (Reading database ... 255132 files and directories currently installed.)
- Preparing to unpack .../juju-2.0_2.0~beta7-0ubuntu1.16.04.1_amd64.deb ...
- Unpacking juju-2.0 (2.0~beta7-0ubuntu1.16.04.1) ...
- Selecting previously unselected package juju.
- Preparing to unpack .../juju_2.0~beta7-0ubuntu1.16.04.1_all.deb ...
- Unpacking juju (2.0~beta7-0ubuntu1.16.04.1) ...
- Processing triggers for man-db (2.7.5-1) ...
- Setting up juju-2.0 (2.0~beta7-0ubuntu1.16.04.1) ...
- Setting up juju (2.0~beta7-0ubuntu1.16.04.1) ...
安裝完成后,我們可以使用 LXD 啟動一個新的“控制器”。這意味著 Juju 不會修改你主機上的任何東西,它會在 LXD 容器中安裝它的管理服務。
現(xiàn)在我們創(chuàng)建一個“test”控制器:
- stgraber@dakara:~$ juju bootstrap localhost test
- Creating Juju controller "local.test" on localhost/localhost
- Bootstrapping model "admin"
- Starting new instance for initial controller
- Launching instance
- - juju-745d1be3-e93d-41a2-80d4-fbe8714230dd-machine-0
- Installing Juju agent on bootstrap instance
- Preparing for Juju GUI 2.1.2 release installation
- Waiting for address
- Attempting to connect to 10.178.150.72:22
- Logging to /var/log/cloud-init-output.log on remote host
- Running apt-get update
- Running apt-get upgrade
- Installing package: curl
- Installing package: cpu-checker
- Installing package: bridge-utils
- Installing package: cloud-utils
- Installing package: cloud-image-utils
- Installing package: tmux
- Fetching tools: curl -sSfw 'tools from %{url_effective} downloaded: HTTP %{http_code}; time %{time_total}s; size %{size_download} bytes; speed %{speed_download} bytes/s ' --retry 10 -o $bin/tools.tar.gz <[https://streams.canonical.com/juju/tools/agent/2.0-beta7/juju-2.0-beta7-xenial-amd64.tgz]>
- Bootstrapping Juju machine agent
- Starting Juju machine agent (jujud-machine-0)
- Bootstrap agent installed
- Waiting for API to become available: upgrade in progress (upgrade in progress)
- Waiting for API to become available: upgrade in progress (upgrade in progress)
- Waiting for API to become available: upgrade in progress (upgrade in progress)
- Bootstrap complete, local.test now available.
這會花費一點時間,這時你可以看到一個正在運行的一個新的 LXD 容器:
- stgraber@dakara:~$ lxc list juju-
- +-----------------------------------------------------+---------+----------------------+------+------------+-----------+
- | NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS |
- +-----------------------------------------------------+---------+----------------------+------+------------+-----------+
- | juju-745d1be3-e93d-41a2-80d4-fbe8714230dd-machine-0 | RUNNING | 10.178.150.72 (eth0) | | PERSISTENT | 0 |
- +-----------------------------------------------------+---------+----------------------+------+------------+-----------+
在 Juju 這邊,你可以確認它是有響應的,并且還沒有服務運行:
- stgraber@dakara:~$ juju status
- [Services]
- NAME STATUS EXPOSED CHARM
- [Units]
- ID WORKLOAD-STATUS JUJU-STATUS VERSION MACHINE PORTS PUBLIC-ADDRESS MESSAGE
- [Machines]
- ID STATE DNS INS-ID SERIES AZ
你也可以在瀏覽器中訪問 Juju 的 GUI 界面:
- stgraber@dakara:~$ juju gui
- Opening the Juju GUI in your browser.
- If it does not open, open this URL:
- https://10.178.150.72:17070/gui/97fa390d-96ad-44df-8b59-e15fdcfc636b/
Juju web UI
不過我更傾向使用命令行,因此我會在接下來使用。
部署一個 minecraft 服務
讓我們先來一個簡單的,部署在一個容器中使用一個 Juju 單元的服務。
- stgraber@dakara:~$ juju deploy cs:trusty/minecraft
- Added charm "cs:trusty/minecraft-3" to the model.
- Deploying charm "cs:trusty/minecraft-3" with the charm series "trusty".
命令返回會很快,然而這不意味著服務已經啟動并運行了。你應該使用 juju status 來查看:
- stgraber@dakara:~$ juju status
- [Services]
- NAME STATUS EXPOSED CHARM
- minecraft maintenance false cs:trusty/minecraft-3
- [Units]
- ID WORKLOAD-STATUS JUJU-STATUS VERSION MACHINE PORTS PUBLIC-ADDRESS MESSAGE
- minecraft/1 maintenance executing 2.0-beta7 1 10.178.150.74 (install) Installing java
- [Machines]
- ID STATE DNS INS-ID SERIES AZ
- 1 started 10.178.150.74 juju-97fa390d-96ad-44df-8b59-e15fdcfc636b-machine-1 trusty
我們可以看到它正在忙于在剛剛創(chuàng)建的 LXD 容器中安裝 java。
- stgraber@dakara:~$ lxc list juju-
- +-----------------------------------------------------+---------+----------------------+------+------------+-----------+
- | NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS |
- +-----------------------------------------------------+---------+----------------------+------+------------+-----------+
- | juju-745d1be3-e93d-41a2-80d4-fbe8714230dd-machine-0 | RUNNING | 10.178.150.72 (eth0) | | PERSISTENT | 0 |
- +-----------------------------------------------------+---------+----------------------+------+------------+-----------+
- | juju-97fa390d-96ad-44df-8b59-e15fdcfc636b-machine-1 | RUNNING | 10.178.150.74 (eth0) | | PERSISTENT | 0 |
- +-----------------------------------------------------+---------+----------------------+------+------------+-----------+
過一會之后,如我們所見服務就部署完畢了:
- stgraber@dakara:~$ juju status
- [Services]
- NAME STATUS EXPOSED CHARM
- minecraft active false cs:trusty/minecraft-3
- [Units]
- ID WORKLOAD-STATUS JUJU-STATUS VERSION MACHINE PORTS PUBLIC-ADDRESS MESSAGE
- minecraft/1 active idle 2.0-beta7 1 25565/tcp 10.178.150.74 Ready
- [Machines]
- ID STATE DNS INS-ID SERIES AZ
- 1 started 10.178.150.74 juju-97fa390d-96ad-44df-8b59-e15fdcfc636b-machine-1 trusty
這時你就可以啟動你的 Minecraft 客戶端了,將其指向 10.178.150.74,端口是 25565?,F(xiàn)在可以在新的 minecraft 服務器上玩了!
當你不再需要它,只需運行:
- stgraber@dakara:~$ juju destroy-service minecraft
只要等待幾秒就好了。
部署一個更復雜的 web 應用
Juju 的主要工作是建模復雜的服務,并以可擴展的方式部署它們。
為了更好地展示,讓我們部署一個 Juju “組合”。 這個組合是由網站,API,數據庫,靜態(tài) Web 服務器和反向代理組成的基本 Web 服務。
所以這將擴展到 4 個互聯(lián)的 LXD 容器。
- stgraber@dakara:~$ juju deploy cs:~charmers/bundle/web-infrastructure-in-a-box
- added charm cs:~hp-discover/trusty/node-app-1
- service api deployed (charm cs:~hp-discover/trusty/node-app-1 with the series "trusty" defined by the bundle)
- annotations set for service api
- added charm cs:trusty/mongodb-3
- service mongodb deployed (charm cs:trusty/mongodb-3 with the series "trusty" defined by the bundle)
- annotations set for service mongodb
- added charm cs:~hp-discover/trusty/nginx-4
- service nginx deployed (charm cs:~hp-discover/trusty/nginx-4 with the series "trusty" defined by the bundle)
- annotations set for service nginx
- added charm cs:~hp-discover/trusty/nginx-proxy-3
- service nginx-proxy deployed (charm cs:~hp-discover/trusty/nginx-proxy-3 with the series "trusty" defined by the bundle)
- annotations set for service nginx-proxy
- added charm cs:~hp-discover/trusty/website-3
- service website deployed (charm cs:~hp-discover/trusty/website-3 with the series "trusty" defined by the bundle)
- annotations set for service website
- related mongodb:database and api:mongodb
- related website:nginx-engine and nginx:web-engine
- related api:website and nginx-proxy:website
- related nginx-proxy:website and website:website
- added api/0 unit to new machine
- added mongodb/0 unit to new machine
- added nginx/0 unit to new machine
- added nginx-proxy/0 unit to new machine
- deployment of bundle "cs:~charmers/bundle/web-infrastructure-in-a-box-10" completed
幾秒后,你會看到 LXD 容器在運行了:
- stgraber@dakara:~$ lxc list juju-
- +-----------------------------------------------------+---------+-----------------------+------+------------+-----------+
- | NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS |
- +-----------------------------------------------------+---------+-----------------------+------+------------+-----------+
- | juju-745d1be3-e93d-41a2-80d4-fbe8714230dd-machine-0 | RUNNING | 10.178.150.72 (eth0) | | PERSISTENT | 0 |
- +-----------------------------------------------------+---------+-----------------------+------+------------+-----------+
- | juju-97fa390d-96ad-44df-8b59-e15fdcfc636b-machine-2 | RUNNING | 10.178.150.98 (eth0) | | PERSISTENT | 0 |
- +-----------------------------------------------------+---------+-----------------------+------+------------+-----------+
- | juju-97fa390d-96ad-44df-8b59-e15fdcfc636b-machine-3 | RUNNING | 10.178.150.29 (eth0) | | PERSISTENT | 0 |
- +-----------------------------------------------------+---------+-----------------------+------+------------+-----------+
- | juju-97fa390d-96ad-44df-8b59-e15fdcfc636b-machine-4 | RUNNING | 10.178.150.202 (eth0) | | PERSISTENT | 0 |
- +-----------------------------------------------------+---------+-----------------------+------+------------+-----------+
- | juju-97fa390d-96ad-44df-8b59-e15fdcfc636b-machine-5 | RUNNING | 10.178.150.214 (eth0) | | PERSISTENT | 0 |
- +-----------------------------------------------------+---------+-----------------------+------+------------+-----------+
幾分鐘后,所有的服務應該部署完畢并運行了:
- stgraber@dakara:~$ juju status
- [Services]
- NAME STATUS EXPOSED CHARM
- api unknown false cs:~hp-discover/trusty/node-app-1
- mongodb unknown false cs:trusty/mongodb-3
- nginx unknown false cs:~hp-discover/trusty/nginx-4
- nginx-proxy unknown false cs:~hp-discover/trusty/nginx-proxy-3
- website false cs:~hp-discover/trusty/website-3
- [Relations]
- SERVICE1 SERVICE2 RELATION TYPE
- api mongodb database regular
- api nginx-proxy website regular
- mongodb mongodb replica-set peer
- nginx website nginx-engine subordinate
- nginx-proxy website website regular
- [Units]
- ID WORKLOAD-STATUS JUJU-STATUS VERSION MACHINE PORTS PUBLIC-ADDRESS MESSAGE
- api/0 unknown idle 2.0-beta7 2 8000/tcp 10.178.150.98
- mongodb/0 unknown idle 2.0-beta7 3 27017/tcp,27019/tcp,27021/tcp,28017/tcp 10.178.150.29
- nginx-proxy/0 unknown idle 2.0-beta7 5 80/tcp 10.178.150.214
- nginx/0 unknown idle 2.0-beta7 4 10.178.150.202
- website/0 unknown idle 2.0-beta7 10.178.150.202
- [Machines]
- ID STATE DNS INS-ID SERIES AZ
- 2 started 10.178.150.98 juju-97fa390d-96ad-44df-8b59-e15fdcfc636b-machine-2 trusty
- 3 started 10.178.150.29 juju-97fa390d-96ad-44df-8b59-e15fdcfc636b-machine-3 trusty
- 4 started 10.178.150.202 juju-97fa390d-96ad-44df-8b59-e15fdcfc636b-machine-4 trusty
- 5 started 10.178.150.214 juju-97fa390d-96ad-44df-8b59-e15fdcfc636b-machine-5 trusty
這時你就可以在 80 端口訪問 http://10.178.150.214,并且會看到一個 Juju 學院頁面。
Juju Academy web service
清理所有東西
如果你不需要 Juju 創(chuàng)建的容器并且不在乎下次需要再次啟動,最簡單的方法是:
- stgraber@dakara:~$ juju destroy-controller test --destroy-all-models
- WARNING! This command will destroy the "local.test" controller.
- This includes all machines, services, data and other resources.
- Continue [y/N]? y
- Destroying controller
- Waiting for hosted model resources to be reclaimed
- Waiting on 1 model, 4 machines, 5 services
- Waiting on 1 model, 4 machines, 5 services
- Waiting on 1 model, 4 machines, 5 services
- Waiting on 1 model, 4 machines, 5 services
- Waiting on 1 model, 4 machines, 5 services
- Waiting on 1 model, 4 machines, 5 services
- Waiting on 1 model, 4 machines
- Waiting on 1 model, 4 machines
- Waiting on 1 model, 4 machines
- Waiting on 1 model, 4 machines
- Waiting on 1 model, 4 machines
- Waiting on 1 model, 4 machines
- Waiting on 1 model, 2 machines
- Waiting on 1 model
- Waiting on 1 model
- All hosted models reclaimed, cleaning up controller machines
我們用下面的方式確認:
- stgraber@dakara:~$ lxc list juju-
- +------+-------+------+------+------+-----------+
- | NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS |
- +------+-------+------+------+------+-----------+
總結
Juju 2.0 內置的 LXD 支持使得可以用一種非常干凈的方式來測試各種服務。
在 Juju charm store 中有很多預制的“組合”可以用來部署,甚至可以用多個“charm”來組合你想要的架構。
Juju 與 LXD 是一個完美的解決方案,從一個小的 Web 服務到大規(guī)模的基礎設施都可以簡單開發(fā),這些都在你自己的機器上,并且不會在你的系統(tǒng)上造成混亂!
額外信息
Juju 網站: http://www.ubuntu.com/cloud/juju
Juju charm store : https://jujucharms.com
LXD 的主站在: https://linuxcontainers.org/lxd
LXD 的 GitHub 倉庫: https://github.com/lxc/lxd
LXD 的郵件列表: https://lists.linuxcontainers.org
LXD 的 IRC 頻道: #lxcontainers on irc.freenode.net
如果你不想或者不能在你的機器上安裝 LXD ,你可以在 web 上試試在線版的 LXD。
作者簡介:
我是 Stéphane Graber。我是 LXC 和 LXD 項目的領導者,目前在加拿大魁北克蒙特利爾的家所在的Canonical 有限公司擔任 LXD 的技術主管。