blog.monophile.net

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

山本 一彰 | Takaaki Yamamoto

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

技術

Configuration Management Ansible, Terraform, Cloud-Init
Cloud Platform GCP, AWS, Azure, OpenStack
Virtualization, Container QEMU+KVM, Xen, LXD/LXC, Docker
OS Ubuntu, Debian GNU/Linux, CentOS, FreeBSD, ...
Storage Ceph, GlusterFS, ZFS, btrfs, ...
Router Linux+Netfilter, Quagga, VyOS, Cisco IOS, YAMAHA RTX, ...
Switch Dell FTOS, AlaxalA, NETGEAR, ...
DB MySQL, MariaDB(Galera Cluster), MongoDB
Mail postfix, dovecot, RainLoop
WebApps WordPress, GitLab, MatterMost, Redmine, ...
Monitoring Nagios, Munin, Zabbix, Prometheus, Grafana
Misc Kubernetes/Istio, certbot, dnsmasq, ...

習得中

OS CoreOS(Container Linux), Windows on QEMU, ...
SQL PostgreSQL, BigQuery, ...
NoSQL CouchDB, ArangoDB, Neo4J, ...
Misc Proxmox, oVirt, MAAS, NFV, ...

投稿

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を理解する必要はあるな、と思った。

参考