「しくみがわかるkubernetes」を読んだ

Kubernetesとはそもそも何者なのか、何のためにどういう設計思想で作られたのか、どうやって使えばいいのか、どういうしくみになっているのか、などなどについて書かれた本です。一言でいうと非常によい本でした。Kubernetesに関する良い本はたくさんありますが、私が読んだ中で下記対象読者(本文より引用)にとってこの本が最適だと思います。

Kubernetesをはじめて使う業務アプリケーション開発者 Dockerの基礎知識がある方

とにかく上記の対象読者の気持ちに寄り添って、Kubernetesの「最低限ここだけは理解しないと話にならない」という部分にだけ的を絞って最短経路で理解してもらいたい、という気持ちがにじみ出ていました*1。他のKubernetes本を見たものの難しすぎて挫折したというかたでも、この本を読んだ上でもとの本に戻ると驚くほど理解しやすくなると思います。Kubernetesを直近で使うことは無くても流行っているからちょっと調べておきたい、というかたにもよいと思います。

本書はKubernetesおよびそれを構成する個々のコンポーネントを説明するにあたって、単に機能説明をするだけにとどまらず、なぜそれが必要なのか、どういう場面でどうやって使うのか、どういうしくみになっているのか、が必ず書かれているため、非常に読みやすい、かつ、腑に落ちやすい作りになっています。初心者が抱きがちな疑問についてもちょうどいいタイミングで回答されていたりと、至れり尽くせりです。

しくみの部分については初心者用の書籍であることやページ数の都合もあり、書いてあることはあくまで概略なのですが、今後他の文書やソースコードを読むときに強い味方になってくれるでしょう*2Kubernetesの複雑なしくみをよくぞここまで簡略化して説明できるものだと、思わず唸ってしまいました。

Kubernetesを使う上で必要な、重要な設計上の判断が必要になったときの対処方法についても本書は書いてくれています。たとえば本書においては物理的なクラスタ構成をどうするか、どのように計算リソース(CPUやメモリなど)を制御するか、などについて触れられています。これらについても決して「こうでなくてはならない」と筆者の意見を押し付けることなく、判断するための基準、および複数の選択肢を提示したうえで「自分ならこうする」という書き方をしています。こういう書き方を「はっきり書いてよ」と嫌うかたもいるとは思いますが、私はこれがよいと思います。なぜかというと、個々人によって置かれた状況は違うので、安易にその状況を知らない人(この場合は著者)がこうすべき、などと言ってもしょうがないからです。

副題に「Azureで動かしながら学ぶ」と書いてある通り、本書は演習においてMicrosoftのAzure、とくにKubernetesクラスタを容易に作成、管理できるマネージドサービス、Azure Kubernetes Engine(AKS)を使っています。この手の書籍は特定の製品に依存しないほうが好ましいのですが、本書についてはこれでよいと思います。というのもKubernetesは巨大なせいもあってフルスクラッチクラスタを作るのは死ぬほどめんどくさくて*3苦行だからです。初心者にそこからやらせるとそれだけで嫌になってしまうことうけあいです。それよりはクラスタ構築の詳細については全く触れないと割り切ってマネージドサービスを使うほうがよいでしょう。クラスタを構築した後の演習内容はおおよそAKSに依存していない内容なので、Azureが気に入らなければGCPAWSなどの他の業者のサービスを使うなり、自前でクラスタを用意するなりすればいいと思います。

Azureを使っていることについてもう一点。著者のおふたりはAzureを提供しているMicrosoft社所属です。このような場合、わたしは「もしや"Azure売らんかな"の精神で書かれたAzure礼賛本ではなかろうか」と身構えてしまうのですが、本書はまったくそんなことはなく、安心して読めました。前節において述べたように一旦クラスタを用意してしまえば後はAzure依存部分はほとんど無いですし、かつ、Azureのサービスについても、あくまで複数ある選択肢の一つとして提示されているに留まっていました。よくある技術書の名を借りた営業パンフレットのような本にありがちな臭みは感じませんでした。

最後に余談。本書は「kubernetesについての入門書を私が書くとしたらこうなる」というつくりになっていたので非常に驚きました。私は普段から何かを学ぶときには関連書籍や記事をたくさん読み込んで咀嚼した上で自分なりの教科書にまとめてアウトプットするのですが、今回はこの本にだいたいそのアウトプットに近いものがまとまっているので、書く手間が省けたと思いました。

*1:テクニカルライターとしては、「ここは書きたかったけども断腸の思いで削ったのだろうなあ」というのが透けて見えて面白かったです

*2:Kubernetesは変化が速いのであまり詳細に書いてもしょうがないという面もあると思います

*3:少なくとも私にとっては

microk8sアンインストール時に発生する不具合と解決方法

1ノードのk8sクラスタを簡単に作るmicrok8sという便利アプリがsnapで公開されています。それを使っているときにちょっとした不具合を見つけたのでメモ

  • 1/29 更新: PR投げた

問題要旨

microk8sのアンインストールに失敗する

発生条件

/var/snapのファイルシステムがBtrfs

問題が発生したソフトウェアのバージョン

  • Ubuntu 18.04
  • snap: 2.36.3
  • microk8s: v1.13.2
  • kernel: 4.15.0-43-generic

再現方法

インストール後にpodを一回でも立ち上げた後で(一つでもimageを作った後で)アンインストールする。

$ sudo snap remove microk8s

期待される結果

アンインストールが成功する。

実際の結果

以下のようなメッセージと共にアンインストールが失敗する。

$ sudo snap remove microk8s
error: cannot perform the following tasks:
- Remove data for snap "microk8s" (383) (remove /var/snap/microk8s/common/var/lib/docker/btrfs/subvolumes/<id>: operation not permitted)

原因

microk8sのアンインストール時には.../subvolumes/以下に配置されたコンテナイメージをsnapがrmコマンドによって削除しようとしているが、これらのイメージはbtrfsのサブボリュームであり、かつ、kernel 4.15系ではサブボリュームはrmコマンドでは削除できない。

解決方法

アンインストール時にsubvolumeを削除する

回避方法

2つの方法がある。

microk8sのコンテナ用snapshotを自力で削除する

アンインストールの前に次のようなコマンドを発行すればよい。

for i in $(sudo ls /var/snap/microk8s/common/var/lib/docker/btrfs/subvolumes/) ; do sudo btrfs sub del /var/snap/microk8s/common/var/lib/docker/btrfs/subvolumes/$i ; done

この後アンインストールすれば削除すべきイメージは既にないのでアンインストールは成功する。

$ sudo snap remove microk8s
microk8s removed

kernelを4.18以上にアップデートする

$ uname -r
4.18.0-13-generic
$ sudo ls /var/snap/microk8s/common/var/lib/docker/btrfs/subvolumes/
<id 0>
<id 1>
$ sudo snap remove microk8s
microk8s removed
$ 

なぜカーネルのバージョンアップで問題が解決するかというとkernel 4.18においてrmdir() syscallによって空のサブボリュームを削除できるようになったからです。

btrfs.wiki.kernel.org

on user demand, rmdir() is able to delete an empty subvolume, export the capability in sysfs

ちなみにこの修正をしてくれたのはFujitsuのTomohiro Misonoさんというかたです。すごいぞMisonoさん。

github.com

今後の予定

microk8sのアンインストール時に動作するスクリプトを修正するpull requestをupstream communityに出したので、待ち状態。

github.com

「時間とはなんだろう」を読んだ

数学や物理があまりわからない人向けにややこしい話抜きで時間とは何かについて書いた本です。わたしは数学や物理がわからないしこの本に書いてあることをほとんど知らなかったのでなかなかおもしろかったです。ただし、とくに前半、例えがわたしにとって身近ではないものが多くてピンと来なかったです。このへんは好みでしょう。

ノイズキャンセリングヘッドホンを買ったらよいものだった

ノイズキャンセリングヘッドホンのWH-1000XM3を買ったらとてもよかったという話です。

聴覚過敏で雑音が嫌いなので前々からこの手の製品は気になっていたのですが、人に勧められたこれを買ってみました。主目的は音楽をかけることではなく雑音を減らして生きやすくすることです。

主な感想は次の通り。

  • とにかく雑音が無くなって集中できる、かつ、精神的ストレスが減る。昔ド田舎の駅に行ったときに無音の世界を体感したことがあるのだが、つけた瞬間にそのときのことを思い出した
  • 実は家の中でも音楽をかけていないときにも細かい雑音は発生している
  • 爆音で音楽を鳴らして雑音を消しているときよりも疲れない
  • イヤーマフだけでほとんどの操作できるので楽(細かい設定はスマホアプリを使う)

私にとっては副次的なものですが、音も良いと感じました。

ノイズキャンセリングイヤホンを一つ持っていたのですが、それを手放す原因となっていた問題がすべて解決されていたのもよかったです。

  • 電池が4時間しか持たない => 30時間持つ
  • 音楽を鳴らさずに数分経つと電源が切れる => 音楽をかけていなくてもノイキャンだけ有効な状態でいられるように設定変更できる(デフォルトは数分で切れる)
  • (ノイズキャンセルどうのでなくイヤホンとヘッドホンの違いだが)取り外しが面倒 => 使わないときは外して首にかけていればよいので楽

などなどわたしにとっての良さを色々と列挙しました。雑音大嫌いな私のような人は持っていて損はないかと思いましたが、どこにいても雑音が気にならないというかたにはどれだけ効果的かはわかりません。

余談。古い機種を持っていたらそれを下取りに出して新しいのを買えるというしくみが用意されているようで「なるほど上手い」と思ってしまいました。

新しいPCを初めて起動した話

去年の末にLinuxデスクトップ用にと買ったものの一度も起動していなかった下記PCをようやく起動しました。

www.lenovo.com

いろいろカスタマイズできた中でわたしは次のような構成にしました。一番いいやつではないけど、これだけあったら十分かな、といった程度。

AMD Ryzen 5 PRO 2400GE (3.20GHz, 4MB) ● 16GB PC4-21300 DDR4 SODIMM (8GBx2) ● 内蔵グラフィックスカード ● 256GB ソリッドステートドライブ M.2 2280 NVMe ● 内蔵ギガビットイーサネットIEEE 802.11 ac/a/b/g/n ワイヤレスLAN (WiFi準拠)1x1, Bluetooth 4.2 ● 内部モノラルスピーカー ● HDMIポート

もともとこれを買った理由が先代のマシンはハイスペックだったもののデカくて持て余していたため、小さいのに変えようと思ったことです。今後マシンパワーが必要になったら都度GCEの高性能なインスタンスでも借りればよいかなと。

サイズは売り文句通り余裕で手のひらに乗せられるし場所をとらないので非常にいいです。実のところこいつが届いたときに「サイズが小さい!すごい!」で完璧に満足してしまったのが使用開始をさぼっていた理由の一つだったりします。

Linuxのインストールは何度か起動中に次のエラーメッセージを吐いて動かなくなったものの、再起動をすると治りました。別にこだわるところではないしカーネルも問題が出ないバージョンに上げたので、これでよし。

patchwork.kernel.org

その後カーネルビルド(v4,.19のdefconfig)してみると226秒かかりました。先代のマシン(Ryzen 1800X)はバージョンが若干古いカーネルで75秒ほどで終わっていました。おおよそ3倍強かかっています。スペックではなく省サイズと静穏性で選んだのでまあ、こんなものかなと。

それにしても小さくてよい。

去年の個人事業の振り返り

去年個人事業主として何をやったのかの一覧と、やってみての感想。

やったことはおおよそ次の通り。

  • 現在働いている会社における技術顧問業(4月までで終わり)
  • 拙著「Linuxのしくみ」の印税
  • Software Designでの連載「Linuxのしくみ」の原稿料(5月から)
  • セキュリティキャンプ全国大会2018の講師
  • 技術同人誌販売(春秋の技術書典とオンライン販売)

gihyo.jp

windhole.booth.pm

このような組み合わせになったのには次のような事情があります。

  • IT技術、物を書くこと、人に伝えることが好き
  • 好きなことだけしたい
  • 売れなければキャッシュアウトになるようなリスクはなるべく負いたくない。たとえば在庫を抱えるとか
  • なるべく好きな時に好きなだけ好きなところで働きたいので、空間的、時間的な制約を強く受けることはしたくない

稼いだ金額については具体的な数値は書きませんが、幸いにもこれだけでなんとか家族が生活できるかなあというくらいにはなりました。ただ、来年以降どうなるかはあんまり読めません。とくに本の印税については去年出したものが今年同じくらい売れるとは到底思えないので、次のを出さなければ収入激減です。

一年を振り返って思ったことは次の通り。

  • お金が流れるしくみがある程度見えてくるので面白い
  • 仕事してからキャッシュインまでの時間が数か月というケースもあるので、手元にある程度運転資金が無いと辛そう
  • 「会社員って(毎月一定の給料が入るという意味では)気楽なんだな」ということを強く感じた
  • 厚生年金すばらしい。よく聞く「個人事業主は会社員の倍は稼いでおきたい」というがよくわかるようになった
  • IT系の物書きだけで生計を立てるのは無理ゲー

今年も無理しない程度に去年と似たようなことをしてお金を稼いでいきたいなあと思います。

「砂糖の世界史」を読んだ

砂糖を通じて世界史を見るというお話。砂糖はもとよりコーヒーや紅茶、チョコレートなどにまつわる小噺がたくさん載っているのがよいです。歴史で習ったプランテーション奴隷貿易三角貿易なんかについて背景からきっちり説明してくれるので、あのときもこうやって教えてくれればよかったなあなどと思いました。