これは、なにをしたくて書いたもの?
以前MicroK8sを試す時に、よくわからないままsnapコマンドでMicroK8sをインストールしたのですが、またsnapを見る機会が
できたので、1度ちゃんと調べてみようかなと思いまして。
Snappy?
Snappyとは、Ubuntu Linuxの開発元であるCanonicalが開発したパッケージ管理システムです。
Snappyで管理されるパッケージのことをSnapと呼ばれ、操作には「snap」というコマンドを使用します。
Linuxのパッケージ管理システムといえば、特にUbuntu Linuxであればaptやdebパッケージを思い浮かべますが、こちらは様々な
Linuxディストリビューションで使えることと、パッケージが自己完結型であることが特徴です。
サポートされているLinuxディストリビューションは、こちら。
Installing snapd | Snapcraft documentation
- Arch Linux
- CentOS
- Debian
- elementary OS
- Fedora
- GalliumOS
- KDE Neon
- Kubuntu
- Linux Mint
- Lubuntu
- Manjaro Linux
- openSUSE
- Parrot Security OS
- Pop!_OS
- Raspbian
- Red Hat Enterprise Linux (RHEL)
- Solus
- Ubuntu
- Xubuntu
- Zorin OS
Ubuntu Linuxではプリインストールされていますが、他のLinuxディストリビューションにインストールすることも可能です。
例えば、CentOSではyumでインストールすることができます。
オフィシャルサイトは、こちら。
Snapcraft - Snaps are universal Linux packages
ドキュメント。
Snap documentation | Snapcraft documentation
利用できるパッケージは、ストアから探します。
Install Linux apps using the Snap Store | Snapcraft
たとえば、Visual Studio Codeを探してみます。
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製品の事例・解説記事