blog.monophile.net

コンピュータのこととかのメモ。

Takaaki Yamamoto

東京工業大学において計算機科学と応用数学を学び、 情報科学芸術大学院大学[IAMAS] においてメディア表現を専攻し修了。 2015年にコンビネータ論理を基に計算完備な計算手法 論理珠算を開発し、 それを含む体系である算道を構成した。 その成果により、 第19回 文化庁メディア芸術祭 アート部門 新人賞 (文部科学大臣賞) を2016年に受賞。 現在は digitiminimi において、インフラエンジニアとして生計をたててている。

work

各種システム構築と管理を承ります。

Cloud PlatformOpenstack, GCP, AWS, Azure, ...
Openstackkeystone, glance, cinder, swift, neutron, nova, ...
VirtualizationQEMU+KVM, LXD/LXC, Docker, ...
OSDebian GNU/Linux, Ubuntu, CentOS, ...
NetworksIPSec, L2TP, VXLAN, WirelessAP, ...
WebAppsWordPress, GitLab, Redmine, ...
Configuration ManagementAnsible, Terraform, ...
MonitoringNagios, Munin, ...

posts

snapでインストールしたLXDを使ってみる

概要

LXDがsnapパッケージに対応したようなので、使ってみた。 snapは “Installable across Linux distributions” らしいので、 各ディストリビューションのパッケージ管理システムに依存しない方法でLXDを使えるはず。 各ディストリでのLXDテスト状況は↓で確認できる。

今回はUbuntu16.04で行った。 snap自体はデフォルトでインストールされている。

$ lsb_release -d
Description:	Ubuntu 16.04.3 LTS

LXDをsnapでインストールする

今回はsnapに入っているLXDを使うので、aptの方は削除しておく。

$ sudo apt purge lxd lxd-client

そして、snapでLXDをインストールする。

$ sudo snap install lxd

インストールされたLXDの情報は↓で確認できる。

snap info lxd
name:      lxd
summary:   System container manager and API
publisher: canonical
contact:   https://github.com/lxc/lxd/issues
description: |
  LXD is a container manager for system containers.

  It offers a REST API to remotely manage containers over the network, using an
  image based workflow and with support for live migration.

  Images are available for all Ubuntu releases and architectures as well as for
  a wide number of other Linux distributions.

  LXD containers are lightweight, secure by default and a great alternative to
  virtual machines.
snap-id: J60k4JY0HppjwOjW8dZdYc8obXKxujRu
commands:
  - lxd.benchmark
  - lxd.check-kernel
  - lxd.lxc
  - lxd
  - lxd.migrate
services:
  lxd.daemon:    simple, enabled, active
tracking:        stable
installed:       2.20 (5235) 44MB -
refreshed:       2017-12-07 10:46:48 +0900 JST
channels:
  stable:        2.20        (5235) 44MB -
  candidate:     2.20        (5249) 44MB -
  beta:          ↑
  edge:          git-2d9eb5d (5285) 44MB -
  2.0/stable:    2.0.11      (4689) 20MB -
  2.0/candidate: 2.0.11      (4770) 20MB -
  2.0/beta:      ↑
  2.0/edge:      git-fec4021 (5291) 19MB -

LXDの状態を確認する

LXDの状態は↓で確認できる。 初期の状態でserviceは立ち上がっているようす。

$ snap services
Snap  Service  Startup  Current
lxd   daemon   enabled  active

LXDの開始と停止

LXDを開始する場合は↓。

$ sudo snap start lxd

LXDを停止する場合は↓。

$ sudo snap stop lxd

PATHに /snap/bin を追加する

snapパッケージでインストールされたコマンドは /snap/bin にシンボリックリンクが張られるため、PATHを設定しておく。

$ export PATH=/snap/bin:$PATH

ちなみにaptにはなかったlxc, lxd以外のコマンドも置かれていた。

$ ls -l /snap/bin/
total 24
lrwxrwxrwx 1 root root  7 Dec 14 12:45 lxc -> lxd.lxc
lrwxrwxrwx 1 root root 13 Dec 14 12:45 lxd -> /usr/bin/snap
lrwxrwxrwx 1 root root 13 Dec 14 12:45 lxd.benchmark -> /usr/bin/snap
lrwxrwxrwx 1 root root 13 Dec 14 12:45 lxd.check-kernel -> /usr/bin/snap
lrwxrwxrwx 1 root root 13 Dec 14 12:45 lxd.lxc -> /usr/bin/snap
lrwxrwxrwx 1 root root 13 Dec 14 12:45 lxd.migrate -> /usr/bin/snap

LXDを初期化する

  • ストレージバックエンド: zfs (ループバックマウント)
  • ネットワーク: 10.0.1.0/24
  • ブリッジのアドレス: 10.0.1.254/24
  • LXDのAPI: ブリッジのアドレス 10.0.1.254:8443 でListenできるように設定する

今回は↑を満たすLXDを設定したいので↓のlxd.ymlを用意した。

config:
  core.https_address: 0.0.0.0:8443
  core.trust_password: secretsecret
  images.auto_update_interval: 6

# Storage pools
storage_pools:
- name: default
  driver: zfs
  config:
    zfs.pool_name: default

# Network devices
networks:
- name: lxdbr
  type: bridge
  config:
    ipv4.firewall: true
    ipv4.nat:      true
    ipv4.dhcp:     true
    ipv4.address:  10.0.1.254/24
    ipv6.address:  none

# Profiles
profiles:
- name: default
  devices:
    root:
      path: /
      pool: default
      type: disk
    eth0:
      name:     eth0
      nictype:  bridged
      parent:   lxdbr
      type:     nic

設定を変更したい場合は↓を参考にするとよい。

lxd.ymlを用意したら↓で初期化する。

$ cat lxd.yml | sudo /snap/bin/lxd init --preseed
LXD has been successfully configured.

すると↓のようにlxdbrが作成されて、アドレス10.0.1/254が振られていることがわかる。

$ ip link show lxdbr
36: lxdbr: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/ether 66:88:d0:c4:24:82 brd ff:ff:ff:ff:ff:ff
$ ip address show lxdbr
36: lxdbr: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1000
   link/ether 66:88:d0:c4:24:82 brd ff:ff:ff:ff:ff:ff
   inet 10.0.1.254/24 scope global lxdbr
      valid_lft forever preferred_lft forever

またzfsにはdefaultプールが作成されていた。 通常のLXDでは /var/lib/lxd/disks/default.img にファイルが作られるが、 snapで入れたLXDの場合は /var/snap/lxd/common/lxd/disks/default.img に作られる様子。

$ zpool status default
  pool: default
 state: ONLINE
  scan: none requested
config:

	NAME                                          STATE     READ WRITE CKSUM
	default                                       ONLINE       0     0     0
	  /var/snap/lxd/common/lxd/disks/default.img  ONLINE       0     0     0

errors: No known data errors

初期化は終わったので↓のようにしてコンテナを立ち上げられる。

$ lxc launch ubuntu:16.04 xenial00
Creating xenial00
Starting xenial00
$ lxc list
+----------+---------+------------------+------+------------+-----------+
|   NAME   |  STATE  |       IPV4       | IPV6 |    TYPE    | SNAPSHOTS |
+----------+---------+------------------+------+------------+-----------+
| xenial00 | RUNNING | 10.0.1.66 (eth0) |      | PERSISTENT | 0         |
+----------+---------+------------------+------+------------+-----------+

LXDをsnapから削除する

↓を打てば良い。

$ sudo snap remove lxd

↑を行うとコンテナが保管されていたzfsのループバックファイルごと削除されるので注意する。

参考

QEMU+KVMと仮想ブリッジ+tapでFreeBSDの環境を用意してみる

概要

実験用のFreeBSDの環境が欲しかったため、QEMU+KVMの仮想環境で用意したときのメモ。 FreeBSDを立ち上げるためのメモだが、起動イメージを変えるだけでLinuxも起動できるはず。 (最近、LXDのコンテナでLinuxの環境は事足りてしまうからQEMUをあんまり必要にならなくなってしまった。)

仮想ホスト環境

  • OS: Ubuntu 16.04
  • CPU: Intel Core i5-4300M
  • 仮想環境: QEMU+KVM
  • 仮想ブリッジqbr: 10.0.0.254/24

仮装ゲスト環境

  • OS: FreeBSD11.1
  • CPU: 1コア
  • Mem: 1GB
  • NIC: 1つ (DHCPでアドレス(10.0.0.1-10.0.0.250)を配布1)

ツールののインストール

↓でQEMUとudhcpdをインストールしておく。

$ sudo apt install qemu-kvm udhcpd

ホストネットワークの準備

まずsysctlでパケットを転送できるように設定しておく。

$ sudo sysctl -w net.ipv4.ip_forward=1  

次に仮想ブリッジインターフェースqbrを作成する。

$ sudo ip link add name qbr type bridge
$ sudo ip address add 10.0.0.254/24 dev qbr
$ sudo ip link set dev qbr up

↑の結果↓のようにqbrが設定されていることを確認できる。

$ ip link show dev qbr
7: qbr: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000
    link/ether b2:d5:df:1c:53:ec brd ff:ff:ff:ff:ff:ff
$ ip address show dev qbr
7: qbr: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether b2:d5:df:1c:53:ec brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.254/24 scope global qbr
       valid_lft forever preferred_lft forever

iptablesでマスカレードの設定をする

↓のようにiptablesで10.0.0.0/24のプライベートアドレスはマスカレードするように設定する。

$ sudo iptables -t nat -A POSTROUTING -s 10.0.0.0/24 ! -d 10.0.0.0/24 -j MASQUERADE

↑を実行した結果は↓のようになる。

iptables -t nat -L POSTROUTING
Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
MASQUERADE  all  --  10.0.0.0/24         !10.0.0.0/24

qemu-ifup

QEMUで仮想ゲストを立ち上げる際にホスト側のネットワークインターフェースを調整するためのシェルスクリプト /etc/qemu-ifup を設定しておく。

#!/bin/bash
if [ -n "$1" ]
then
  /sbin/ip tuntap add $1 mode tap user `whoami`
  /sbin/ip link set $1 up
  sleep 0.5s
  /sbin/ip link set $1 master qbr
  exit 0
else
  echo "Error: no interface specified"
  exit 1
fi

↑はQEMU側が↓のように呼び出すことを想定されている。

$ /etc/qemu-ifup tap0

DHCPサーバの設定

/etc/udhcpd.confに↓を記述し、udhcpdを設定する。

interface qbr
start 10.0.0.1
end   10.0.0.250
opt dns 8.8.8.8
opt dns 8.8.4.4
opt subnet 255.255.255.0
opt router 10.0.0.254
opt domain local

今回はudhcpdをsystemdを用いずに手動で起動する。

$ udhcpd -f

-fをつけることでフォアグラウンドでの動作になる。

仮想ゲストFreeBSD11.1の起動イメージのダウンロード

上記ページからamd64(x86_64)のqcow2形式のイメージを選び、ダウンロードしてunxzで伸長する。

$ curl -O https://download.freebsd.org/ftp/releases/VM-IMAGES/11.1-RELEASE/amd64/Latest/FreeBSD-11.1-RELEASE-amd64.qcow2.xz
$ ls -l FreeBSD-11.1-RELEASE-amd64.qcow2.xz
-rw-r--r-- 1 root root 279978716 Dec 12 19:35 FreeBSD-11.1-RELEASE-amd64.qcow2.xz
$ unxz FreeBSD-11.1-RELEASE-amd64.qcow2.xz
$ ls -l FreeBSD-11.1-RELEASE-amd64.qcow2
-rw-r--r-- 1 root root 1533345792 Dec 12 19:35 FreeBSD-11.1-RELEASE-amd64.qcow2

仮想ゲストFreeBSD11.1の起動

tapデバイスのMACアドレスをランダムに生成して、仮想マシンを起動する。

$ sudo kvm -smp 1 -m 1024 -drive if=virtio,file=FreeBSD-11.1-RELEASE-amd64.qcow2 -netdev tap,id=net0 -device e1000,netdev=net0,mac="$(printf 'DE:AD:BE:EF:%02X:%02X\n' $((RANDOM%256)) $((RANDOM%256)))" -curses

↑を実行すると↓のように起動画面が拝めた。

時間が経つとudhcpdがアドレスを配布したことがわかり、ログイン画面になる。 ちなみに、初期状態ではrootユーザのパスワードは空の状態だった。

qemu-ifupで設定したとおり、起動時にQEMUによって作成されたtap0がqbrに接続されていた。

$ ip link show tap0
13: tap0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master qbr state UNKNOWN mode DEFAULT group default qlen 1000
   link/ether b2:d5:df:1c:53:ec brd ff:ff:ff:ff:ff:ff

また、cursesではなく、↓のようにしてVNC経由でコンソール画面を見ることも可能。

$ sudo kvm -smp 1 -m 1024 -drive if=virtio,file=FreeBSD-11.1-RELEASE-amd64.qcow2 -netdev tap,id=net0 -device e1000,netdev=net0,mac="$(printf 'DE:AD:BE:EF:%02X:%02X\n' $((RANDOM%256)) $((RANDOM%256)))" -vga std -nographic -vnc :0

↑を実行すると5900+起動したVNCの数だけポートがバインドされる。

$ sudo lsof -ni :5900
COMMAND     PID USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
qemu-syst 21363 root   15u  IPv4 1891730      0t0  TCP *:5900 (LISTEN)

5900番ポートがバインドされたので、↓のようにして仮想マシンの画面に接続することができる。

$ gvncview ${host-machine-ip}:0

参考

systemdで簡単なサービスを定義してみる

概要

いろいろなLinuxディストリビューションで採用されてきているsystemdを理解するために、 “hello world”を一秒ごとに標準出力へ吐き出す簡単なサービスを定義し、 journalctlでログを確認してみた。

内容は↑の記事とほぼ同様になっているが、 下記では標準出力へそのまま“hello world”を出力しているので、 jounarlctlでログを確認できる点で異なる。

systemd

使ったディストリビューションはUbuntuで、systemdのバージョンは229。

$ lsb_release -d
Description:	Ubuntu 16.04.3 LTS
$ systemd --version
systemd 229
+PAM +AUDIT +SELINUX +IMA +APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ -LZ4 +SECCOMP +BLKID +ELFUTILS +KMOD -IDN

/usr/local/bin/hello-daemon.sh

1秒ごとに標準出力に“hello world”を出力するプログラム /usr/local/bin/hello-daemon.sh を用意する。

#!/bin/bash
while true
do
   echo hello world
   sleep 1
done

↓で実行権限をつける。

$ sudo chmod 0755 /usr/local/bin/hello-daemon.sh

/etc/systemd/system/hello.service

hello.service の定義ファイルである /etc/systemd/system/hello.service を用意する。

[Unit]
Description = hello daemon

[Service]
ExecStart = /etc/systemd/system/hello.service
Restart = always
Type = simple

[Install]
WantedBy = multi-user.target

hello.serviceの自動起動を有効にする

↓でhello.serviceの自動起動を有効化できる。

$ sudo systemctl enable hello.service
Created symlink from /etc/systemd/system/multi-user.target.wants/hello.service to /etc/systemd/system/hello.service.

↓で状態の確認。

$ sudo systemctl status hello.service
● hello.service - hello daemon
   Loaded: loaded (/etc/systemd/system/hello.service; enabled; vendor preset: enabled)
   Active: inactive (dead)

hello.serviceを開始する

↓でhello.serviceを開始できる。

$ sudo systemctl start hello.service

↓状態の確認。

$ sudo systemctl status hello.service
● hello.service - hello daemon
   Loaded: loaded (/etc/systemd/system/hello.service; enabled; vendor preset: enabled)
   Active: active (running) since Fri 2017-12-08 12:28:32 UTC; 4s ago
 Main PID: 21220 (hello-daemon.sh)
   CGroup: /system.slice/hello.service
           ├─21220 /bin/bash /usr/local/bin/hello-daemon.sh
           └─21235 sleep 1

Dec 08 12:28:32 hostname systemd[1]: Started hello daemon.
Dec 08 12:28:32 hostname hello-daemon.sh[21220]: hello world
Dec 08 12:28:33 hostname hello-daemon.sh[21220]: hello world
Dec 08 12:28:34 hostname hello-daemon.sh[21220]: hello world
Dec 08 12:28:35 hostname hello-daemon.sh[21220]: hello world

hello.serviceのプロセスをkillしてみる

hello-daemon.shのPIDが21220だったので、↓でkillしてみる。

$ sudo kill 21220

systemctl statusで確認すると新しいプロセスがPID 21442で立ち上がったことがわかる。

$ sudo systemctl status hello.service
● hello.service - hello daemon
   Loaded: loaded (/etc/systemd/system/hello.service; enabled; vendor preset: enabled)
   Active: active (running) since Fri 2017-12-08 12:31:33 UTC; 3s ago
 Main PID: 21442 (hello-daemon.sh)
   CGroup: /system.slice/hello.service
           ├─21442 /bin/bash /usr/local/bin/hello-daemon.sh
           └─21446 sleep 1

Dec 08 12:31:33 hostname systemd[1]: Started hello daemon.
Dec 08 12:31:33 hostname hello-daemon.sh[21442]: hello world
Dec 08 12:31:34 hostname hello-daemon.sh[21442]: hello world
Dec 08 12:31:35 hostname hello-daemon.sh[21442]: hello world
Dec 08 12:31:36 hostname hello-daemon.sh[21442]: hello world

journalctl でログの確認

hello.serviceのログはjournalctlを使って↓で確認できる。 (-nオプションで5行に制限している。)

$ sudo journalctl -u hello.service -n 5
-- Logs begin at Wed 2017-12-06 05:21:38 UTC, end at Fri 2017-12-08 12:34:45 UTC. --
Dec 08 12:34:41 hostname hello-daemon.sh[21442]: hello world
Dec 08 12:34:42 hostname hello-daemon.sh[21442]: hello world
Dec 08 12:34:43 hostname hello-daemon.sh[21442]: hello world
Dec 08 12:34:44 hostname hello-daemon.sh[21442]: hello world
Dec 08 12:34:45 hostname hello-daemon.sh[21442]: hello world

hello.serviceの停止

↓でhello.servceを停止できる。

$ sudo systemctl stop hello.service

↓プロセスが止まったことを確認できた。

$ sudo systemctl status hello.service
● hello.service - hello daemon
   Loaded: loaded (/etc/systemd/system/hello.service; enabled; vendor preset: enabled)
   Active: inactive (dead) since Fri 2017-12-08 12:39:17 UTC; 6s ago
  Process: 21442 ExecStart=/usr/local/bin/hello-daemon.sh (code=killed, signal=TERM)
 Main PID: 21442 (code=killed, signal=TERM)

Dec 08 12:39:09 hostname hello-daemon.sh[21442]: hello world
Dec 08 12:39:10 hostname hello-daemon.sh[21442]: hello world
Dec 08 12:39:11 hostname hello-daemon.sh[21442]: hello world
Dec 08 12:39:12 hostname hello-daemon.sh[21442]: hello world
Dec 08 12:39:13 hostname hello-daemon.sh[21442]: hello world
Dec 08 12:39:14 hostname hello-daemon.sh[21442]: hello world
Dec 08 12:39:15 hostname hello-daemon.sh[21442]: hello world
Dec 08 12:39:16 hostname hello-daemon.sh[21442]: hello world
Dec 08 12:39:17 hostname systemd[1]: Stopping hello daemon...
Dec 08 12:39:17 hostname systemd[1]: Stopped hello daemon.

あとがき

ログの処理は journald で一括して設定できるので楽になった? かも。 (journald の設定ファイルは /etc/systemd/journald.conf にある。)

参考

conjure-upを使ってkubernetes環境を作ってみた

概要

kubernetesの実験環境を用意したかったので、 下記のkubernetesの公式ドキュメントを参考にしてUbuntu16.04でconjure-upを用いた方法で構築してみた。 kubernetes(Docker)を動かすためにLXDを用いているのが特徴的。

LXDをインストールする

まずLXDの環境を用意する。 LXDは現時点で最新のものを使った。

$ apt policy lxd
lxd:
  Installed: 2.20-0ubuntu4~16.04.1
  Candidate: 2.20-0ubuntu4~16.04.1
  Version table:
 *** 2.20-0ubuntu4~16.04.1 100
        100 http://jp.archive.ubuntu.com/ubuntu xenial-backports/main amd64 Packages
        100 /var/lib/dpkg/status
     2.0.10-0ubuntu1~16.04.2 500
        500 http://jp.archive.ubuntu.com/ubuntu xenial-updates/main amd64 Packages
     2.0.2-0ubuntu1~16.04.1 500
        500 http://security.ubuntu.com/ubuntu xenial-security/main amd64 Packages
     2.0.0-0ubuntu4 500
        500 http://jp.archive.ubuntu.com/ubuntu xenial/main amd64 Packages

インストールは↓のようにすればよい。

$ sudo apt install lxd-client=2.20-0ubuntu4~16.04.1
$ sudo apt install lxd-=2.20-0ubuntu4~16.04.1

LXDのデータと設定の削除

イチからLXDを設定するために、LXDのデータと設定を削除し初期化する。 下記のサービスを停止する。

$ sudo systemctl lxd.service
$ sudo systemctl lxd.socket

/var/lib/lxd 以下を削除する。 LXDに関連するデータはすべて消えるはず。 (ストレージのバックエンドの設定によってはコンテナのイメージなどが残るかもしれない。)

$ sudo rm -rf /var/lib/lxd

LXDの初期化

上記を参考にし、設定をYAMLで記述する。 今回は環境に依存しないために、以下を想定し、設定を書いた。

  • ストレージバックエンド: zfs (/var/lib/lxd/disks/default.imgのループバックマウント)
  • ネットワーク: 10.0.0.0/24
  • ブリッジのアドレス: 10.0.0.254/24
  • LXDのAPI: ブリッジのアドレス 10.0.0.254:8443 でListenできるように設定する

↑の意味を含む↓のinit.ymlを保存する。

config:
  core.https_address: 0.0.0.0:8443
  core.trust_password: secretsecret
  images.auto_update_interval: 6

# Storage pools
storage_pools:
- name: default
  driver: zfs
  config:
    zfs.pool_name: default

# Network devices
networks:
- name: lxdbr
  type: bridge
  config:
    ipv4.firewall: true
    ipv4.nat:      true
    ipv4.dhcp:     true
    ipv4.address:  10.0.0.254/24
    ipv6.address:  none

# Profiles
profiles:
- name: default
  devices:
    root:
      path: /
      pool: default
      type: disk
    eth0:
      name:     eth0
      nictype:  bridged
      parent:   lxdbr
      type:     nic

↓でLXDの初期化を行う。

$ sudo systemctl start lxd.socket
$ cat init.yml | sudo lxd init --preseed
LXD has been successfully configured.

↓でブリッジが自動で作成されていることが確認できる。

$ ip address show dev lxdbr
7: lxdbr: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1000
    link/ether ce:68:e4:c1:84:02 brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.254/24 scope global lxdbr
       valid_lft forever preferred_lft forever

また、zfsのファイルシステムができていることも確認できる。

$ zfs list
NAME                 USED  AVAIL  REFER  MOUNTPOINT
default              246K  43.7G    19K  none
default/containers    19K  43.7G    19K  none
default/custom        19K  43.7G    19K  none
default/deleted       19K  43.7G    19K  none
default/images        19K  43.7G    19K  none
default/snapshots     19K  43.7G    19K  none

ZFSの領域を拡張する

ZFSの領域の拡張は必須ではないが、メモとして残しておく。

$ zpool list
NAME      SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
default  43.8G   267K  43.7G         -     0%     0%  1.00x  ONLINE  -

poolの名前がdefaultであることを確認し、↓でループバックファイルの場所を確認する。

$ sudo zpool status default
  pool: default
 state: ONLINE
  scan: none requested
config:

	NAME                              STATE     READ WRITE CKSUM
	default                           ONLINE       0     0     0
	  /var/lib/lxd/disks/default.img  ONLINE       0     0     0

errors: No known data errors

ファイルの場所 /var/lib/lxd/disks/default.img を確認したら、↓でファイルの拡張を行う。

$ sudo truncate -s 80G /var/lib/lxd/disks/default.img

これだけだとファイルシステムは拡張されない。

$ zfs list default
NAME      USED  AVAIL  REFER  MOUNTPOINT
default   240K  42.4G    19K  none

↓でファイルシステムの拡張を行う。

$ sudo zpool set autoexpand=on default
$ sudo zpool online -e default /var/lib/lxd/disks/default.img
$ sudo zpool set autoexpand=off default

↓で拡張されたことが確認できる。

$ zfs list default
NAME      USED  AVAIL  REFER  MOUNTPOINT
default   246K  77.3G    19K  none

snapでcounjure-upをインストール

↓のコマンドでconjure-upをインストールする。

$ sudo snap install conjure-up --classic

↓にインストールされた。

$ ls -l /snap/bin/conjure-up
lrwxrwxrwx 1 root root 13 Nov 27 17:47 /snap/bin/conjure-up -> /usr/bin/snap

conjure-upを使うには一旦再ログインが必要かもしれない。

conjure-upでkubernetesを設定する

snapでインストールしたconjure-upでkubernetesを設定する。

$ /snap/bin/conjure-up kubernetes

↑のコマンドを打つとインタラクティブな設定画面になるので↓の手順で選択していく。

  1. “Canonical Distribution of Kubernetes” を選択
  2. “Helm” を選択
  3. Network Bridge “(X)lxdbr”, Storage Pool “(X)default” を選択
  4. Network Plugin “(X)flannel” を選択
  5. “Deploy all 6 Remaining Applications” を選択

結構時間がかかるので気長にまつ。

インストールが終わった時点でコンテナが↓のように作られていた。 多い。

$ lxc list
+----------------+---------+--------------------------------+------+------------+-----------+
|      NAME      |  STATE  |              IPV4              | IPV6 |    TYPE    | SNAPSHOTS |
+----------------+---------+--------------------------------+------+------------+-----------+
| juju-025dd1-0  | RUNNING | 10.0.0.180 (eth0)              |      | PERSISTENT | 0         |
+----------------+---------+--------------------------------+------+------------+-----------+
| juju-e60319-0  | RUNNING | 10.0.0.177 (eth0)              |      | PERSISTENT | 0         |
+----------------+---------+--------------------------------+------+------------+-----------+
| juju-e60319-1  | RUNNING | 10.0.0.186 (eth0)              |      | PERSISTENT | 0         |
+----------------+---------+--------------------------------+------+------------+-----------+
| juju-e60319-10 | RUNNING | 172.17.0.1 (docker0)           |      | PERSISTENT | 0         |
|                |         | 10.1.56.1 (cni0)               |      |            |           |
|                |         | 10.1.56.0 (flannel.1)          |      |            |           |
|                |         | 10.0.0.162 (eth0)              |      |            |           |
+----------------+---------+--------------------------------+------+------------+-----------+
| juju-e60319-11 | RUNNING | 172.17.0.1 (docker0)           |      | PERSISTENT | 0         |
|                |         | 10.1.23.1 (cni0)               |      |            |           |
|                |         | 10.1.23.0 (flannel.1)          |      |            |           |
|                |         | 10.0.0.67 (eth0)               |      |            |           |
+----------------+---------+--------------------------------+------+------------+-----------+
| juju-e60319-2  | RUNNING | 10.0.0.29 (eth0)               |      | PERSISTENT | 0         |
+----------------+---------+--------------------------------+------+------------+-----------+
| juju-e60319-3  | RUNNING | 10.0.0.7 (eth0)                |      | PERSISTENT | 0         |
+----------------+---------+--------------------------------+------+------------+-----------+
| juju-e60319-4  | RUNNING | 10.0.0.188 (eth0)              |      | PERSISTENT | 0         |
+----------------+---------+--------------------------------+------+------------+-----------+
| juju-e60319-5  | RUNNING | 10.1.60.0 (flannel.1)          |      | PERSISTENT | 0         |
|                |         | 10.0.0.4 (eth0)                |      |            |           |
+----------------+---------+--------------------------------+------+------------+-----------+
| juju-e60319-6  | RUNNING | 10.0.0.96 (eth0)               |      | PERSISTENT | 0         |
+----------------+---------+--------------------------------+------+------------+-----------+
| juju-e60319-7  | RUNNING | 10.0.0.174 (eth0)              |      | PERSISTENT | 0         |
+----------------+---------+--------------------------------+------+------------+-----------+
| juju-e60319-8  | RUNNING | 10.0.0.187 (eth0)              |      | PERSISTENT | 0         |
+----------------+---------+--------------------------------+------+------------+-----------+
| juju-e60319-9  | RUNNING | 172.17.0.1 (docker0)           |      | PERSISTENT | 0         |
|                |         | 10.1.78.1 (cni0)               |      |            |           |
|                |         | 10.1.78.0 (flannel.1)          |      |            |           |
|                |         | 10.0.0.47 (eth0)               |      |            |           |
+----------------+---------+--------------------------------+------+------------+-----------+

また ~/.kube に設定ファイルが生成されていることがわかる。

$ ls -l ~/.kube/
total 4
drwxr-xr-x 1 ty ty   18 Nov 27 21:05 cache
drwxrwxr-x 1 ty ty 1494 Nov 27 21:05 http-cache
-rw------- 1 ty ty 1942 Nov 27 21:05 config.conjure-canonical-kubern-c45

kubectlをsnapでインストール

kubectlをホストマシンにインストールする。

$ sudo snap install kubectl --classic

生成された設定ファイルを用いて↓のようにkubernetesにアクセスすることができる。

$ /snap/bin/kubectl --kubeconfig .kube/config.conjure-canonical-kubern-c45 get nodes
NAME             STATUS    ROLES     AGE       VERSION
juju-e60319-10   Ready     <none>    1h        v1.8.3
juju-e60319-11   Ready     <none>    1h        v1.8.3
juju-e60319-9    Ready     <none>    1h        v1.8.3
$ /snap/bin/kubectl --kubeconfig .kube/config.conjure-canonical-kubern-c45 get pods
NAME                             READY     STATUS    RESTARTS   AGE
default-http-backend-spktx       1/1       Running   0          6m
nginx-ingress-controller-7tpbx   1/1       Running   0          2m
nginx-ingress-controller-fdd5s   1/1       Running   0          6m
nginx-ingress-controller-mzrpr   1/1       Running   0          2m
$ /snap/bin/kubectl --kubeconfig .kube/config.conjure-canonical-kubern-c45 get services
NAME                   TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE
default-http-backend   ClusterIP   10.152.183.247   <none>        80/TCP    1h
kubernetes             ClusterIP   10.152.183.1     <none>        443/TCP   1h

また、Dashboardにアクセスするには↓のようにしてproxyをたてる。

$ /snap/bin/kubectl --kubeconfig .kube/config.conjure-canonical-kubern-c45 proxy
Starting to serve on 127.0.0.1:8001

構築したホストへsshなどで8001をポートフォワードした状態で↓へアクセスすると管理画面を拝める。

kubernetesを構築したホストをk8s-hostとしたとき、 8001番のポートフォワードは↓のようにすればよい。

$ ssh -NL 8001:localhost:8001 k8s-host

あとがき

とりあえず管理画面は拝めたけど、 やっぱりちゃんとetcdとflannelから構築してkubernetesを理解する必要はあるな、と思った。

参考

PythonでYAMLを読み込んでJinja2で整形する

概要

さまざまなツールでYAMLが設定ファイルの形式として採用されるようになってきたので、 PythonでYAMLを読み込んでみた。 YAMLを読み込んでJinja2のテンプレートに適用してみる。

ライブラリをインストール

$ sudo pip3 install yaml jinja2

yaml_jinja2.py

以下を yaml_jinja2.py として保存する。

import sys, yaml, jinja2

_loader         = jinja2.FileSystemLoader("./", encoding='utf-8')
_environment    = jinja2.Environment(loader=_loader)
_template       = _environment.get_template(sys.argv[1])
sys.stdout.write(_template.render(yaml.load(sys.stdin)))

test.yml, test.j2

以下を test.yml として保存する。

---
hoge: HOGE
piyo: PIYO

以下を test.j2 として保存する。

hoge: {{ hoge }}
piyo: {{ piyo }}

実行

↓のようにして、標準入力からyamlを読み込んで、結果を吐き出せた。

$ cat test.yml | python yaml_jinja2.py test.j2
hoge: HOGE
piyo: PIYO