CLOVER🍀

That was when it all began.

Canonicalが開発したパッケージ管理システムSnappy(Snap)を使う

これは、なにをしたくて書いたもの?

以前MicroK8sを試す時に、よくわからないままsnapコマンドでMicroK8sをインストールしたのですが、またsnapを見る機会が
できたので、1度ちゃんと調べてみようかなと思いまして。

Snappy?

Snappyとは、Ubuntu Linuxの開発元であるCanonicalが開発したパッケージ管理システムです。

Snappy - Wikipedia

Snappyで管理されるパッケージのことをSnapと呼ばれ、操作には「snap」というコマンドを使用します。

Linuxのパッケージ管理システムといえば、特にUbuntu Linuxであればaptやdebパッケージを思い浮かべますが、こちらは様々な
Linuxディストリビューションで使えることと、パッケージが自己完結型であることが特徴です。

サポートされているLinuxディストリビューションは、こちら。

Installing snapd | Snapcraft documentation

Ubuntu Linuxではプリインストールされていますが、他のLinuxディストリビューションにインストールすることも可能です。
例えば、CentOSではyumでインストールすることができます。

オフィシャルサイトは、こちら。

Snapcraft - Snaps are universal Linux packages

ドキュメント。

Snap documentation | Snapcraft documentation

利用できるパッケージは、ストアから探します。

Install Linux apps using the Snap Store | Snapcraft

f:id:Kazuhira:20200103025115p:plain

たとえば、Visual Studio Codeを探してみます。

f:id:Kazuhira:20200103025315p:plain

snapコマンドで探すこともできます。このあたりは、後で。

では、ちょっと試していってみましょう。

環境

今回の環境は、こちら。

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 18.04.3 LTS
Release:    18.04
Codename:   bionic

snapはすでにインストールされています。

$ snap version
snap    2.42.1+18.04
snapd   2.42.1+18.04
series  16
ubuntu  18.04
kernel  4.15.0-72-generic

もしもsnapが入っていない場合は、インストールするにはaptを使います。

$ sudo apt install snapd

ここからは、MicroK8sを例に試していってみましょう。

ヘルプを見る

まずは、ヘルプ。

「snap」または「snap help」コマンドで、ざっくりとは見れます。

$ snap
# または
$ snap help
The snap command lets you install, configure, refresh and remove snaps.
Snaps are packages that work across many different Linux distributions,
enabling secure delivery and operation of the latest apps and utilities.

Usage: snap <command> [<options>...]

Commands can be classified as follows:

         Basics: find, info, install, list, remove
        ...more: refresh, revert, switch, disable, enable
        History: changes, tasks, abort, watch
        Daemons: services, start, stop, restart, logs
       Commands: alias, aliases, unalias, prefer
  Configuration: get, set, unset, wait
        Account: login, logout, whoami
    Permissions: connections, interface, connect, disconnect
      Snapshots: saved, save, check-snapshot, restore, forget
          Other: version, warnings, okay, ack, known, model, create-cohort
    Development: run, pack, try, download, prepare-image

For more information about a command, run 'snap help <command>'.
For a short summary of all commands, run 'snap help --all'.

詳細に見たい場合は、「snap help --all」と実行します。

$ snap help --all

snapはコマンドを指定して実行するのですが、コマンドごとに「--help」オプションを付けることでコマンドのヘルプも見ることが
できます。

$ snap install --help

パッケージをインストールする

「snap install」で行います。

$ sudo snap install microk8s
error: This revision of snap "microk8s" was published using classic confinement and thus may
       perform arbitrary system changes outside of the security sandbox that snaps are usually
       confined to, which may put your system at risk.

       If you understand and want to proceed repeat the command including --classic.

怒られました。

パッケージによっては、「--classic」オプションが必要です。

$ sudo snap install microk8s --classic

今度はインストールできます。

この「--classic」オプションの意味ですが、Snapの持つセキュリティ機能を無効にするものになります。

$ snap install --help | grep classic
      --classic                       Put snap in classic mode and disable security confinement

Snapでは環境の分離レベルが定義されており、「--classic」は従来のaptなどのパッケージと同じものになります。

Snap confinement | Snapcraft documentation

通常の「Strict」では、ファイル、ネットワーク、プロセスなど、特別なインターフェースを経由しない限り、他のリソースへは
アクセスできない分離レベルとなります。

どういうパッケージが「--classic」オプションを必要とするかは、検索やパッケージの情報を見た時にわかりますが、そもそも付けない
場合はパッケージのインストールに失敗するので、そこで気づきます。

バージョンを指定したり、開発中のものをインストールしたりする場合は、「--channel」で指定します。

$ sudo snap install microk8s --classic --channel=1.17/stable

どんなchannelがあるかは、パッケージの情報で確認することができます。

インストールされているパッケージを確認する

「snap list」を使います。

$ snap list
Name      Version    Rev   Tracking  Publisher   Notes
core      16-2.42.5  8268  stable    canonical✓  core
microk8s  v1.17.0    1107  stable    canonical✓  classic

「--all」を付与すると、無効になっているパッケージも表示することができます。

$ snap list --all

パッケージを検索する

「snap find」または「snap search」で行います。

$ snap find kubernetes
Name                     Version                Publisher              Notes    Summary
microk8s                 v1.17.0                canonical✓             classic  Kubernetes for workstations and appliances
kata-containers          1.9.3                  katacontainers✓        classic  Lightweight virtual machines that seamlessly plug into the containers ecosystem
kubectl                  1.17.0                 canonical✓             classic  Command line client for controlling a Kubernetes cluster.
conjure-up               2.6.10-20191109.1611   canonical✓             classic  Package runtime for conjure-up spells
juju                     2.7.0                  canonical✓             classic  Simple, secure and stable devops. Juju keeps complexity low and productivity high. Manage applications wherever they are run.
helm                     3.0.2                  snapcrafters           classic  The Kubernetes package manager
kubelet                  1.17.0                 canonical✓             classic  Kubernetes “node agent” that runs on each node in Kubernetes.
kube-proxy               1.17.0                 canonical✓             classic  Kubernetes network proxy that runs on each node.
kube-scheduler           1.17.0                 canonical✓             -        Kubernetes master component that assigns each newly created pod to a node.
kube-controller-manager  1.17.0                 canonical✓             -        Kubernetes master component that runs controllers.
cdk-addons               1.17.0                 canonical✓             -        Addons for Canonical Kubernetes
kube-apiserver           1.17.0                 canonical✓             -        Kubernetes master component that exposes the Kubernetes API.
kubernetes-worker        0.0.1                  canonical✓             -        A complete Kubernetes worker
kubeadm                  1.17.0                 canonical✓             classic  Tool for bootstrapping Kubernetes clusters.

〜省略〜

Notesに「classic」と書かれているものは、インストール時に「--classic」オプションが必要になります。

パッケージの情報を見る

「snap info」を使います。channelの情報は、ここで確認できます。

$ snap info microk8s 
name:      microk8s
summary:   Kubernetes for workstations and appliances
publisher: Canonical✓
contact:   https://github.com/ubuntu/microk8s
license:   unset
description: |
  MicroK8s is a small, fast, secure, single node Kubernetes that installs on just about any Linux
  box. Use it for offline development, prototyping, testing, or use it on a VM as a small, cheap,
  reliable k8s for CI/CD. It's also a great k8s for appliances - develop your IoT apps for k8s and
  deploy them to MicroK8s on your boxes.
commands:
  - microk8s.add-node
  - microk8s.cilium
  - microk8s.config
  - microk8s.ctr
  - microk8s.disable
  - microk8s.enable
  - microk8s.helm
  - microk8s.inspect
  - microk8s.istioctl
  - microk8s.join
  - microk8s.juju
  - microk8s.kubectl
  - microk8s.leave
  - microk8s.linkerd
  - microk8s.remove-node
  - microk8s.reset
  - microk8s.start
  - microk8s.status
  - microk8s.stop
services:
  microk8s.daemon-apiserver:          simple, enabled, active
  microk8s.daemon-apiserver-kicker:   simple, enabled, active
  microk8s.daemon-cluster-agent:      simple, enabled, active
  microk8s.daemon-containerd:         simple, enabled, active
  microk8s.daemon-controller-manager: simple, enabled, active
  microk8s.daemon-etcd:               simple, enabled, active
  microk8s.daemon-flanneld:           simple, enabled, active
  microk8s.daemon-kubelet:            simple, enabled, active
  microk8s.daemon-proxy:              simple, enabled, active
  microk8s.daemon-scheduler:          simple, enabled, active
snap-id:      EaXqgt1lyCaxKaQCU349mlodBkDCXRcg
tracking:     stable
refresh-date: today at 17:59 UTC
channels:
  stable:           v1.17.0  2019-12-13 (1107) 179MB classic
  candidate:        v1.17.0  2019-12-10 (1107) 179MB classic
  beta:             v1.17.0  2019-12-10 (1107) 179MB classic
  edge:             v1.17.0  2019-12-14 (1130) 179MB classic
  dqlite/stable:    –                                
  dqlite/candidate: –                                
  dqlite/beta:      –                                
  dqlite/edge:      v1.16.2  2019-11-07 (1038) 189MB classic
  1.17/stable:      v1.17.0  2019-12-10 (1109) 179MB classic

〜省略〜

Channels | Snapcraft documentation

パッケージをアップデートする

「snap refresh」を使います。

パッケージ単位にアップデートする場合。

$ sudo snap refresh microk8s

インストールされているすべてのパッケージをアップデートする場合。

$ sudo snap refresh

なお、自動アップデートも行われており、デフォルトでは4時間おきに行われます。

$ sudo snap refresh --time
timer: 00:00~24:00/4
last: today at 17:57 UTC
next: today at 19:03 UTC

設定を変える場合は、こちらを参照。

Managing updates | Snapcraft documentation

サービスの管理

Snapでインストールされるものには、Daemonとなるものもあります。MicroK8sもDaemonになりますね。

Service management | Snapcraft documentation

現在稼働しているサービスを確認するには、「snap services」を使います。

$ snap services
Service                             Startup  Current  Notes
microk8s.daemon-apiserver           enabled  active   -
microk8s.daemon-apiserver-kicker    enabled  active   -
microk8s.daemon-cluster-agent       enabled  active   -
microk8s.daemon-containerd          enabled  active   -
microk8s.daemon-controller-manager  enabled  active   -
microk8s.daemon-etcd                enabled  active   -
microk8s.daemon-flanneld            enabled  active   -
microk8s.daemon-kubelet             enabled  active   -
microk8s.daemon-proxy               enabled  active   -
microk8s.daemon-scheduler           enabled  active   -

特定のパッケージに絞って見ることもできます。

$ snap services microk8s
Service                             Startup  Current  Notes
microk8s.daemon-apiserver           enabled  active   -
microk8s.daemon-apiserver-kicker    enabled  active   -
microk8s.daemon-cluster-agent       enabled  active   -
microk8s.daemon-containerd          enabled  active   -
microk8s.daemon-controller-manager  enabled  active   -
microk8s.daemon-etcd                enabled  active   -
microk8s.daemon-flanneld            enabled  active   -
microk8s.daemon-kubelet             enabled  active   -
microk8s.daemon-proxy               enabled  active   -
microk8s.daemon-scheduler           enabled  active   -

サービスの停止。

$ sudo snap stop microk8s

サービスの起動。

$ sudo snap start microk8s

サービスの再起動。

$ sudo snap restart microk8s

ちなみに、MicroK8sに関していえば、「microk8s.start」、「microk8s.stop」でも起動、停止が行なえます。

$ microk8s.stop
$ microk8s.start

サービスの自動起動を有効化するには、「snap start」に「--enable」オプションを付けます。

$ sudo snap start --enable microk8s

自動起動を無効にするには、「snap stop」に「--disable」オプションを付与します。

$ sudo snap stop --disable microk8s

現在の自動起動の設定は、「snap services」で「Startup」を見ればOKみたいですね。

$ snap services microk8s
Service                             Startup   Current   Notes
microk8s.daemon-apiserver           disabled  inactive  -
microk8s.daemon-apiserver-kicker    disabled  inactive  -
microk8s.daemon-cluster-agent       disabled  inactive  -
microk8s.daemon-containerd          disabled  inactive  -
microk8s.daemon-controller-manager  disabled  inactive  -
microk8s.daemon-etcd                disabled  inactive  -
microk8s.daemon-flanneld            disabled  inactive  -
microk8s.daemon-kubelet             disabled  inactive  -
microk8s.daemon-proxy               disabled  inactive  -
microk8s.daemon-scheduler           disabled  inactive  -

ログを見るには、「snap logs」コマンドを使用します。

$ sudo snap logs microk8s

「-f」オプションを使うと、「tail -f」オプションのようにログを読み続けます。

$ sudo snap logs microk8s -f

まるで、systemdを使っているかのようです…。

エイリアスを作成する

ところで、MicroK8sを使う場合「kubectl」コマンドを実行するには以下のような感じになります。

$ microk8s.kubectl create deployment nginx --image nginx:latest

ちょっと長いですね。

こういう時は、「snap alias」でエイリアスを作成することができます。

$ sudo snap alias microk8s.kubectl kubectl
Added:
  - microk8s.kubectl as kubectl

こんな感じになります。

$ kubectl get po
NAME                     READY   STATUS    RESTARTS   AGE
nginx-75b7bfdb6b-9k8sn   1/1     Running   0          91s

エイリアスの一覧を確認。

$ snap aliases
Command           Alias    Notes
microk8s.kubectl  kubectl  manual

エイリアスの解除。

$ sudo snap unalias kubectl
Removed:
  - microk8s.kubectl as kubectl

ちなみに、元の名前がやたら長いのは、「"snap name"」または「"snap name"."application name"」というような名前空間
使うことで名前の競合を回避しようとしているからみたいです。

Commands and aliases | Snapcraft documentation

パッケージを有効/無効にする

パッケージを無効にするには、「snap disable」を使います。

$ sudo snap disable microk8s

有効にするには、「snap enable」を使います。

$ sudo snap enable microk8s

パッケージをアンインストールする

「snap remove」を使います。

$ sudo snap remove microk8s

データのスナップショットを残さずに削除する場合は、「--purge」オプションを付けます。

$ sudo snap remove microk8s --purge

Snapshots | Snapcraft documentation

Snap自体の設定

プロキシの設定などは、こちらを参照。

System options | Snapcraft documentation

パッケージのインストール先。

「/snap」ディレクトリになります。

$ ll /snap
total 24
drwxr-xr-x  5 root root 4096 Jan  2 18:33 ./
drwxr-xr-x 23 root root 4096 Jan  2 17:45 ../
drwxr-xr-x  2 root root 4096 Jan  2 18:41 bin/
drwxr-xr-x  3 root root 4096 Jan  2 17:58 core/
drwxr-xr-x  3 root root 4096 Jan  2 18:41 microk8s/
-r--r--r--  1 root root  548 Nov 21 21:45 README

The system /snap directory | Snapcraft documentation

ちょっと見てみると面白いですが、パッケージの中身がまるで隔離空間のように独立したディレクトリ構造になっているように見えます。

$ find /snap/microk8s -type d
/snap/microk8s
/snap/microk8s/1107
/snap/microk8s/1107/actions
/snap/microk8s/1107/actions/common
/snap/microk8s/1107/actions/fluentd
/snap/microk8s/1107/actions/jaeger
/snap/microk8s/1107/actions/jaeger/crds
/snap/microk8s/1107/actions/knative
/snap/microk8s/1107/actions/prometheus
/snap/microk8s/1107/actions/prometheus/setup
/snap/microk8s/1107/bin
/snap/microk8s/1107/certs
/snap/microk8s/1107/certs-beta
/snap/microk8s/1107/configs
/snap/microk8s/1107/default-args
/snap/microk8s/1107/default-args/cni-network
/snap/microk8s/1107/etc
/snap/microk8s/1107/etc/ca-certificates
/snap/microk8s/1107/etc/ca-certificates/update.d
/snap/microk8s/1107/etc/cron.d
/snap/microk8s/1107/etc/cron.weekly
/snap/microk8s/1107/etc/default
/snap/microk8s/1107/etc/dpkg
/snap/microk8s/1107/etc/dpkg/dpkg.cfg.d
/snap/microk8s/1107/etc/gss
/snap/microk8s/1107/etc/gss/mech.d
/snap/microk8s/1107/etc/init
/snap/microk8s/1107/etc/init.d
/snap/microk8s/1107/etc/iproute2
/snap/microk8s/1107/etc/ldap
/snap/microk8s/1107/etc/nvidia-container-runtime
/snap/microk8s/1107/etc/pam.d
/snap/microk8s/1107/etc/python3.5
/snap/microk8s/1107/etc/ssl
/snap/microk8s/1107/etc/ssl/certs
/snap/microk8s/1107/etc/ssl/private
/snap/microk8s/1107/etc/sudoers.d
/snap/microk8s/1107/etc/systemd
/snap/microk8s/1107/etc/systemd/system
/snap/microk8s/1107/etc/zfs
/snap/microk8s/1107/include
/snap/microk8s/1107/include/libiptc
/snap/microk8s/1107/include/libnftnl
/snap/microk8s/1107/lib
/snap/microk8s/1107/lib/pkgconfig
/snap/microk8s/1107/lib/python3.5
/snap/microk8s/1107/lib/python3.5/site-packages

〜省略〜

/snap/microk8s/1107/usr/share/perl5
/snap/microk8s/1107/usr/share/perl5/Debian
/snap/microk8s/1107/usr/share/perl5/Debian/Debhelper
/snap/microk8s/1107/usr/share/perl5/Debian/Debhelper/Buildsystem
/snap/microk8s/1107/usr/share/perl5/Debian/Debhelper/Sequence
/snap/microk8s/1107/usr/share/pixmaps
/snap/microk8s/1107/usr/share/python3
/snap/microk8s/1107/usr/share/python3/debpython
/snap/microk8s/1107/usr/share/python3/dist
/snap/microk8s/1107/usr/share/python3/runtime.d
/snap/microk8s/1107/usr/share/zsh
/snap/microk8s/1107/usr/share/zsh/vendor-completions
/snap/microk8s/1107/var
/snap/microk8s/1107/var/lib
/snap/microk8s/1107/var/lib/systemd

「/usr/share」とか「/var/lib」とかありますからね。

つまり、環境がまるっとインストールされます。パッケージが「自己完結型」であるとか、分離度が高いとかはこのあたりからも
伺い知れます。

なお、このインストール形態な分だけ、ディスクの消費はaptなどよりも大きいようです。

aptかSnapか

さて、こうなるとaptとSnapのどちらのパッケージ管理システムを使うのか?という気になりますが…個人的にはaptでもSnapでも
インストールできるパッケージの場合はapt…というように、aptを基本に考えようかなぁと思っています。

Snapにしかないパッケージをインストールする場合にのみ、Snapを使う感じですね。
※aptとSnapの共存自体は可能です

まだまだapt(やyum/DNF)のようなものが主流な気はするので、当面はこんな感じで。

参考

Snap(Snappy) コマンドの使い方 | Linux Magazine

Ubuntu 18.04 LTS Desktopでsnapパッケージを管理 – LAB4ICT

第582回 いろいろなディストリビューションでsnapとLXDを利用する:Ubuntu Weekly Recipe|gihyo.jp … 技術評論社

【連載】にわか管理者のためのLinux運用入門 [141] パッケージ管理システム「Snap」(その3)|サーバ/ストレージ|IT製品の事例・解説記事