Ubuntu Weekly Recipe

第560回microk8sでお手軽Kubernetes環境構築

コンテナオーケストレーションシステムである「Kubernetes」は、プロダクション用途としてコンテナを使う上で重要な地位を得るに至りました。そこで今回は、そのKubernetesをローカルマシンでかんたんにお試しできるmicrok8sを紹介します。

シングルノードにのみ対応したKubernetes環境

Kubernetesと言えば、Dockerの運用に疲れた人をさらに地獄の谷に突き落とすツールとして、現在もっとも人気のあるソフトウェアのひとつです。単なるDockerを便利に使えるようにするもの、なんて安易な考えで手を出すと、まずはPod/ReplicaSet/Deployment/Serviceなどの一般的な意味はわかるものの、Kubernetes上の概念がよくわからない単語が襲ってきて、最終的にサーバーより先に脳が死にます。本気で運用する気があるなら、まずはGoogleで働けるぐらいの優秀な人材を用意してもらいましょう。もちろん、きちんと理解して使えばとても便利なツールです。

microk8sはそんなコンテナ被害者をよりカジュアルに増やすためのソフトウェアです。Ubuntu Weekly Topicsの2018年12月14日号でも「1分以内に作れるKubernetes環境」として紹介されているように、microk8sを使うとKubernetes学習用のシングルノードの環境をすぐに構築できます。現時点ではシングルノードしか対応していないように、あくまで学習用・プロトタイピング用と割り切ったほうが良いでしょう。

同じくローカルにKubernetes環境を構築できるMinikubeとの違いのひとつが「snapパッケージ」として提供されている点です。KubernetesはもとよりそのベースとなるDockerツールも含めて、ワンステップでインストールできます。パッケージ化されているため、アップグレードはもちろんのこと、削除も簡単です。さらにsnapということでシステム上の他のコンポーネントからはできるだけ分離した状態で利用できます。

snapパッケージとしては、arm64/ppc64elバイナリも提供されているので、64bitに対応したRaspberry Piにインストールすることも可能です。もちろんストレージ性能やメモリの大きさといったスペックに絡む問題からRaspberry Piでの利用は実用的とは言い難いですが、チュートリアルを試してみる程度なら十分でしょう。

microk8sのインストール

microk8sのインストール自体はとても簡単です。今回はUbuntu 18.04 LTSのサーバー版をベースに説明しますが、snapパッケージなのでデスクトップ版はもちろんのことUbuntu 16.04 LTSでも動作するはずです。

まずはパッケージの情報を表示してみましょう。

$ snap info microk8s
name:      microk8s
summary:   Kubernetes for workstations and appliances
publisher: Canonical✓
contact:   https://github.com/ubuntu/microk8s
license:   Apache-2.0
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.
snap-id: EaXqgt1lyCaxKaQCU349mlodBkDCXRcg
channels:
  stable:         v1.13.3        2019-02-25 (412) 229MB classic
  candidate:      v1.13.4        2019-03-01 (437) 229MB classic
  beta:           v1.13.4        2019-03-01 (437) 229MB classic
  edge:           v1.13.4        2019-03-06 (455) 229MB classic
  1.14/stable:    –
  1.14/candidate: –
  1.14/beta:      v1.14.0-beta.1 2019-03-01 (442) 207MB classic
  1.14/edge:      v1.14.0-beta.1 2019-03-01 (442) 207MB classic
  1.13/stable:    v1.13.3        2019-02-28 (413) 229MB classic
  1.13/candidate: v1.13.4        2019-03-02 (438) 229MB classic
  1.13/beta:      v1.13.4        2019-03-02 (438) 229MB classic
  1.13/edge:      v1.13.4        2019-03-06 (456) 229MB classic
  1.12/stable:    v1.12.5        2019-02-03 (387) 251MB classic
  1.12/candidate: v1.12.6        2019-02-27 (435) 251MB classic
  1.12/beta:      v1.12.6        2019-02-27 (435) 251MB classic
  1.12/edge:      v1.12.6        2019-02-26 (435) 251MB classic
  1.11/stable:    v1.11.7        2019-02-02 (389) 245MB classic

3月10日時点で、1.11から1.13までのリリース版と、1.14のベータ版をサポートしています。3月頭にリリースされた1.13.4は、3月10日時点ではまだcandidateチャンネルです。いずれstableチャンネルに落ちてくるものと思います。今回は1.13系のstableチャンネルをインストールしましょう。microk8sは上記の情報にも掲載されているように、classicモードでインストールする必要があります。これはKubernetesが、ホストの主にネットワーク設定などを変更する必要があるためです。

$ sudo snap install microk8s --channel 1.13/stable --classic
$ microk8s.status --wait-ready
microk8s is running
addons:
jaeger: disabled
fluentd: disabled
gpu: disabled
storage: disabled
registry: disabled
ingress: disabled
dns: disabled
metrics-server: disabled
prometheus: disabled
istio: disabled
dashboard: disabled

インストールしたら、microk8s.statusコマンドで環境の準備が整うまで待ってください。⁠1分以内に作れる」との触れ込みではあるものの、ホストマシンのスペックやネットワーク環境によってはさらに時間がかかります。

microk8s.statusの結果からもわかるように、各種アドオンはインストール直後は無効化されています。

さて、snapでインストールしたコマンドはmicrok8s.のプレフィックスが付きます。つまり「microk8s.kubectl」などのコマンド名になるのです。

$ microk8s.kubectl get nodes
NAME     STATUS   ROLES    AGE     VERSION
ubuntu   Ready    <none>   6m54s   v1.13.3
$ microk8s.kubectl get services
NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.152.183.1   <none>        443/TCP   7m1s

もし普通のKubernetesと同じようにプレフィックス無しでkubectlコマンドを実行したいなら、次のようにエイリアスを設定してください。

$ sudo snap alias microk8s.kubectl kubectl

次のようにkubectlコマンドを使えるようになります。

$ kubectl config view
apiVersion: v1
clusters:
- cluster:
    server: http://127.0.0.1:8080
  name: microk8s-cluster
contexts:
- context:
    cluster: microk8s-cluster
    user: admin
  name: microk8s
current-context: microk8s
kind: Config
preferences: {}
users:
- name: admin
  user:
    username: admin

ちなみにsnapパッケージ版のmicrok8sはDockerも同梱しています。つまりmicrok8s.dockerでDockerコマンドを直接実行できるのです。

$ microk8s.docker info
Containers: 0
 Running: 0
 Paused: 0
 Stopped: 0
Images: 0
Server Version: 18.06.1-ce
Storage Driver: overlay2
 Backing Filesystem: extfs
 Supports d_type: true
 Native Overlay Diff: true
Logging Driver: json-file
(以下略)

Deploymentをrunする

ためしにnginxコンテナイメージを、レプリカ数3でデプロイしてみましょう。

$ kubectl run nginx --image nginx --replicas 3

各種ステータスを表示すると、無事にNginxが3インスタンス立ち上がっていることがわかります。

$ kubectl get deployments
NAME    READY   UP-TO-DATE   AVAILABLE   AGE
nginx   3/3     3            0           40s
$ kubectl get replicasets
NAME               DESIRED   CURRENT   READY   AGE
nginx-7cdbd8cdc9   3         3         3       49s
$ kubectl get pods
NAME                     READY   STATUS    RESTARTS   AGE
nginx-7cdbd8cdc9-br6ck   1/1     Running   0          22s
nginx-7cdbd8cdc9-c74tf   1/1     Running   0          22s
nginx-7cdbd8cdc9-x4n5r   1/1     Running   0          22s

dockerコマンドで見ても、結果は同じです。

$ microk8s.docker ps
CONTAINER ID        IMAGE                  COMMAND                  CREATED              STATUS              PORTS               NAMES
42533b39f8ee        nginx                  "nginx -g 'daemon of…"   57 seconds ago       Up 56 seconds                           k8s_nginx_nginx-7cdbd8cdc9-c74tf_default_53cf2b93-42f3-11e9-9fa6-525400123456_0
f541a2a89911        nginx                  "nginx -g 'daemon of…"   About a minute ago   Up 59 seconds                           k8s_nginx_nginx-7cdbd8cdc9-x4n5r_default_53d001fa-42f3-11e9-9fa6-525400123456_0
6cd45194c525        nginx                  "nginx -g 'daemon of…"   About a minute ago   Up About a minute                       k8s_nginx_nginx-7cdbd8cdc9-br6ck_default_53cfef99-42f3-11e9-9fa6-525400123456_0

Deploymentsの情報を表示すると、次のような結果になっています。

$ kubectl describe deployments.apps nginx
Name:                   nginx
Namespace:              default
CreationTimestamp:      Sun, 10 Mar 2019 05:14:06 +0000
Labels:                 run=nginx
Annotations:            deployment.kubernetes.io/revision: 1
Selector:               run=nginx
Replicas:               3 desired | 3 updated | 3 total | 3 available | 0 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  25% max unavailable, 25% max surge
Pod Template:
  Labels:  run=nginx
  Containers:
   nginx:
    Image:        nginx
    Port:         <none>
    Host Port:    <none>
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Conditions:
  Type           Status  Reason
  ----           ------  ------
  Available      True    MinimumReplicasAvailable
  Progressing    True    NewReplicaSetAvailable
OldReplicaSets:  <none>
NewReplicaSet:   nginx-7cdbd8cdc9 (3/3 replicas created)
Events:
  Type    Reason             Age   From                   Message
  ----    ------             ----  ----                   -------
  Normal  ScalingReplicaSet  5m8s  deployment-controller  Scaled up replica set nginx-7cdbd8cdc9 to 3

要するに普通のKubernetesと同じ使い方になっているというわけですね。

たとえばNodePortで80番ポートをexposeすると、microk8sをインストールしたアドレスに対してHTTPアクセスできるようになります。

$ kubectl expose deployment nginx --port 80 --type NodePort --name nginxex
service/nginxex exposed
$ kubectl get services
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.152.183.1     <none>        443/TCP        39h
nginxex      NodePort    10.152.183.239   <none>        80:30890/TCP   10s

「CLUSTER-IP」はホストローカルとしてアクセスできるIPアドレスです。⁠PORT」のコロンの後ろが外部に見えているポート番号です。つまり、次のようなアクセス方法が可能です。

  • ホストマシンの内部から「http://10.152.183.239/」でアクセスする
  • ホストマシンの外から「http://ホストマシンのIPアドレス:30890/」でアクセスする

上記のいずれかの方法を実施すれば、NginxのWelcomeページが表示されます。

ダッシュボードアドオンを有効化する

microk8s.enableコマンドを利用すれば、各種アドオンを有効化できます。ここではダッシュボードを有効化してみましょう。

ダッシュボードはDNSアドオンも必要なので両方共有効化します。

$ microk8s.enable dns dashboard
Enabling DNS
Applying manifest
service/kube-dns created
serviceaccount/kube-dns created
configmap/kube-dns created
deployment.extensions/kube-dns created
Restarting kubelet
DNS is enabled
Enabling dashboard
secret/kubernetes-dashboard-certs created
serviceaccount/kubernetes-dashboard created
deployment.apps/kubernetes-dashboard created
service/kubernetes-dashboard created
service/monitoring-grafana created
service/monitoring-influxdb created
service/heapster created
deployment.extensions/monitoring-influxdb-grafana-v4 created
serviceaccount/heapster created
configmap/heapster-config created
configmap/eventer-config created
deployment.extensions/heapster-v1.5.2 created
dashboard enabled

kube-system側にdashboardのIPアドレスが表示されるはずです。

$ kubectl get services --namespace=kube-system
NAME                   TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)             AGE
heapster               ClusterIP   10.152.183.26   <none>        80/TCP              2m19s
kube-dns               ClusterIP   10.152.183.10   <none>        53/UDP,53/TCP       10m
kubernetes-dashboard   ClusterIP   10.152.183.23   <none>        443/TCP             2m19s
monitoring-grafana     ClusterIP   10.152.183.96   <none>        80/TCP              2m19s
monitoring-influxdb    ClusterIP   10.152.183.77   <none>        8083/TCP,8086/TCP   2m19s

上記だと「https://10.152.183.23:443」ですね。ただしClusterIPなので、このままだとローカルマシンからしかアクセスできないことに注意してください。

用済みになれば削除

アドオンはmicrok8s.disableコマンドで無効化できます。

$ microk8s.disable dashboard
Disabling dashboard
secret "kubernetes-dashboard-certs" deleted
serviceaccount "kubernetes-dashboard" deleted
deployment.apps "kubernetes-dashboard" deleted
service "kubernetes-dashboard" deleted
service "monitoring-grafana" deleted
service "monitoring-influxdb" deleted
service "heapster" deleted
deployment.extensions "monitoring-influxdb-grafana-v4" deleted
serviceaccount "heapster" deleted
configmap "heapster-config" deleted
configmap "eventer-config" deleted
deployment.extensions "heapster-v1.5.2" deleted
dashboard disabled

アドオンを含む個別のDeploymentsやServicesを削除したいなら、⁠kubectl delete」コマンドを使うことになるでしょう。

さらに、勉強がてらいろいろ試した結果にっちもさっちもいかなくなったのなら、⁠microk8s.reset」コマンドで環境をまっさらにできます。

$ microk8s.reset
Calling clean_cluster
Cleaning resources in namespace default
endpoints "kubernetes" deleted
endpoints "nginxex" deleted
event "ubuntu.158a9b403a334966" deleted
pod "nginx-7cdbd8cdc9-br6ck" deleted
pod "nginx-7cdbd8cdc9-c74tf" deleted
pod "nginx-7cdbd8cdc9-x4n5r" deleted
secret "default-token-tgfmf" deleted
serviceaccount "default" deleted
service "kubernetes" deleted
service "nginx" deleted
(中略)
event.events.k8s.io "kube-dns-6ccd496668-mknvj.158a9b43ee9c38dd" deleted
event.events.k8s.io "kube-dns-6ccd496668.158a9b43ed7dbe10" deleted
Waiting for kubernetes resources to be released

インストール直後とほぼ同じ状態になると思えば良いでしょう。

$ kubectl get all
NAME                 TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.152.183.1   <none>        443/TCP   2m
$ microk8s.docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
$ microk8s.docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

ただし取得したDockerイメージはすぐには消されませんので注意してください。

$ microk8s.docker images
REPOSITORY  TAG                 IMAGE ID            CREATED             SIZE
nginx       latest              881bd08c0b08        5 days ago          109MB
(以下略)

Kubernetes環境自体が不要になったら、snapパッケージを削除してしまいましょう。

$ snap remove microk8s

Kubernetesのインストール解説は
Software Design 2019年4月号に

繰り返しになりますが、microk8sはあくまで学習用という位置づけです。

来週18日に発売されるSoftware Design 2019年4月号のUbuntu Monthly Reportでは、水野さんが「よりまっとうな」Kubernetesのインストール方法を解説してくれています。

microk8sで基本的な使い方を学習したら、Ubuntu Montly Reportの記事を参考に、マルチノードなクラスターを作ってみてはいかがでしょうか。

おすすめ記事

記事・ニュース一覧