前回次のような記事を書きました。
今回はマルチノードを試してみます。というのも、公式サイトの一覧に「Clustering (BETA)」という記述があるのに気がついたからです。
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.