仮想化通信

日本仮想化技術株式会社の公式エンジニアブログ

マルチノードでmicrok8sを触ってみた

前回次のような記事を書きました。

tech.virtualtech.jp

今回はマルチノードを試してみます。というのも、公式サイトの一覧に「Clustering (BETA)」という記述があるのに気がついたからです。

microk8s.io

microk8sはいろいろな環境で小さなK8sを動かすために使っていましたが、これで複数台構成ができるなら、あまりOSを汚さないでも済むSnapパッケージを使ってちょっとしたKubernetes環境をかんたんにセットアップできると色々と楽ですから。

マルチノードでmicrok8sを使う方法の概要

やることをざっと書くと次のとおりです。

  • microk8sを全ノードにインストールする
  • 必要に応じてadd-onを追加する
  • 「microk8s.add-node」コマンドを1台目のノードで実行してコマンドとエンドポイントを確認
  • 2台目以降のノードで「microk8s.join」から始まるコマンドを実行

次で手順を示します。

マルチノードでmicrok8sを使う手順

microk8sをインストール(microk8s 1.16.2時点)

全ノードにmicrok8sをインストールします。

$ sudo apt update && sudo apt upgrade
$ sudo snap install microk8s --classic --channel=1.16/stable

microk8s.*コマンドをユーザー権限でアクセスしたい場合は任意のユーザーをmicrok8sグループに追加します。 コマンド実行後、ログインし直します。

$ sudo usermod -a -G microk8s ubuntu

必要なアドオンを有効にする

microk8sのアドオンのうち、必要なものを有効にします。

$ microk8s.enable dashboard dns storage

エンドポイントを確認

1台目のノードでエンドポイント&クレデンシャルを確認します。

$ microk8s.add-node
Join node with: microk8s.join 172.17.28.12:25000/xzRkaTLdSTrVHfGgAuFzKZeKxWXbMmKw

If the node you are adding is not reachable through the default interface you can use one of the following:
 microk8s.join 172.17.28.12:25000/xzRkaTLdSTrVHfGgAuFzKZeKxWXbMmKw
 microk8s.join 10.1.56.0:25000/xzRkaTLdSTrVHfGgAuFzKZeKxWXbMmKw
 microk8s.join 10.1.56.1:25000/xzRkaTLdSTrVHfGgAuFzKZeKxWXbMmKw

追加ノードでmicrok8s.joinを実行

追加する方のノードでmicrok8s.joinから始まるコマンドを実行します。

$ microk8s.join 172.17.28.12:25000/xzRkaTLdSTrVHfGgAuFzKZeKxWXbMmKw

1台目の方で見ると、ノードが追加されたのが確認できます。

$ microk8s.kubectl get no
NAME        STATUS   ROLES    AGE     VERSION
node1   Ready    <none>   4m32s   v1.16.2
node2   Ready    <none>   33s     v1.16.2

つかってみる

次のような内容のnginx.yamlを作成します。

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: myclaim
  labels:
    app: myclaim
spec:
  storageClassName: microk8s-hostpath
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginxapp1
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginxapp1
  template:
    metadata:
      labels:
        app: nginxapp1
    spec:
      containers:
      - name: nginxapp1
        image: nginx:alpine
        ports:
        - containerPort: 80
        volumeMounts:
        - mountPath: "/usr/share/nginx/html/"
          name: nginxapp1
      volumes:
      - name: nginxapp1
        persistentVolumeClaim:
          claimName: myclaim
---
apiVersion: v1
kind: Service
metadata:
  name: nginxapp1-nodeport
  labels:
    app: nginxapp1
spec:
  type: NodePort
  ports:
  - port: 80
    targetPort: 80
    nodePort: 30080
  selector:
    app: nginxapp1

Podを作成してみます。

$ microk8s.kubectl apply -f nginx.yaml
$ microk8s.kubectl get -f nginx.yaml
NAME                            STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS        AGE
persistentvolumeclaim/myclaim   Bound    pvc-dea119fe-693c-4ff5-932b-2dd9f131981e   1Gi        RWO            microk8s-hostpath   23m

NAME                        READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nginxapp1   1/1     1            1           41s

NAME                         TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
service/nginxapp1-nodeport   NodePort   10.152.183.213   <none>        80:30080/TCP   23m

追加したノードでmicrok8s.statusを実行すると次のような結果になります。クラスターに加えたことで、加えたノード上からはkubectlコマンドによる操作は受け付けません。

$ microk8s.status 
This MicroK8s deployment is acting as a node in a cluster. Please use the 
microk8s.status on the master.

$ microk8s.kubectl get no
This MicroK8s deployment is acting as a node in a cluster. Please use the microk8s.kubectl on the master.