k3sで構築したk8sクラスタにOpenEBSを導入する

目的

Raspberry Pi OS(64bit版)上に構築した3台構成のk8sクラスタにOpenEBSを導入します。

なお、ARM対応はアルファ版機能なので注意指定ください。現時点ではまだ本番利用には不適です。

OpenEBSとは

OpenEBSはステートフルなアプリケーションが容易に動的な永続化ボリュームを利用できるようにKuberenetes上に構築されたコンテナ接続ストレージです。開発は主にMayaDataを中心にコミュニティベースで進められています。

CNCFのSandboxプロジェクトとしても採択されています。

手順概要

・open-iscsiの導入
・OpenEBSの導入
・動作確認

手順詳細

・open-iscsiの導入

それぞれのホストでopen-iscsiを導入します。

$ sudo apt-get update
$ sudo apt-get install -y open-iscsi 

・OpenEBSの導入

ARM版対応はアルファ版機能なので注意してください。現時点ではまだ本番利用には不適です。

$ k3s kubectl apply -f https://openebs.github.io/charts/openebs-operator-arm-dev.yaml

openebs名前空間ができていることを確認します。

$ k3s kubectl get ns
NAME              STATUS   AGE
default           Active   3d23h
kube-system       Active   3d23h
kube-public       Active   3d23h
kube-node-lease   Active   3d23h
openebs           Active   8s  --> 追加されている

podなどで異常がないかを確認します。

$ k3s kubectl get all --namespace openebs
NAME                                               READY   STATUS    RESTARTS   AGE
pod/openebs-provisioner-6c8999474b-ff5pn           1/1     Running   0          3m4s
pod/openebs-ndm-lhkzv                              1/1     Running   0          3m3s
pod/openebs-ndm-zpds5                              1/1     Running   0          3m3s
pod/openebs-localpv-provisioner-747cf99585-mqntw   1/1     Running   0          3m2s
pod/openebs-snapshot-operator-7db87b69f6-45m9q     2/2     Running   0          3m4s
pod/openebs-ndm-fg29b                              1/1     Running   0          3m3s
pod/openebs-admission-server-5c487685b6-fwmkg      1/1     Running   0          3m3s
pod/openebs-ndm-operator-556b5b54f9-qfffh          1/1     Running   0          3m3s
pod/maya-apiserver-5b9f57bbcd-ljqdd                1/1     Running   2          3m4s
NAME                             TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
service/maya-apiserver-service   ClusterIP   10.43.147.125   <none>        5656/TCP   3m4s
service/admission-server-svc     ClusterIP   10.43.112.50    <none>        443/TCP    94s
NAME                         DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
daemonset.apps/openebs-ndm   3         3         3       3            3           <none>          3m3s
NAME                                          READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/openebs-provisioner           1/1     1            1           3m4s
deployment.apps/openebs-localpv-provisioner   1/1     1            1           3m3s
deployment.apps/openebs-snapshot-operator     1/1     1            1           3m4s
deployment.apps/openebs-admission-server      1/1     1            1           3m3s
deployment.apps/openebs-ndm-operator          1/1     1            1           3m3s
deployment.apps/maya-apiserver                1/1     1            1           3m4s
NAME                                                     DESIRED   CURRENT   READY   AGE
replicaset.apps/openebs-provisioner-6c8999474b           1         1         1       3m5s
replicaset.apps/openebs-localpv-provisioner-747cf99585   1         1         1       3m4s
replicaset.apps/openebs-snapshot-operator-7db87b69f6     1         1         1       3m5s
replicaset.apps/openebs-admission-server-5c487685b6      1         1         1       3m4s
replicaset.apps/openebs-ndm-operator-556b5b54f9          1         1         1       3m4s
replicaset.apps/maya-apiserver-5b9f57bbcd                1         1         1       3m5s

ストレージクラスが追加されているかを確認します。

$ k3s kubectl get sc
NAME                        PROVISIONER                                                RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
local-path (default)        rancher.io/local-path                                      Delete          WaitForFirstConsumer   false                  3d23h
openebs-jiva-default        openebs.io/provisioner-iscsi                               Delete          Immediate              false                  7m13s
openebs-snapshot-promoter   volumesnapshot.external-storage.k8s.io/snapshot-promoter   Delete          Immediate              false                  7m11s
openebs-hostpath            openebs.io/local                                           Delete          WaitForFirstConsumer   false                  7m11s
openebs-device              openebs.io/local                                           Delete          WaitForFirstConsumer   false                  7m11

ついでにデフォルトのストレージクラスを変更しておきましょう。
現時点のデフォルトのlocal-pathをデフォルトから外します。

$ k3s kubectl patch storageclass local-path -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"false"}}}'

local-pathがデフォルトでなくなっていることを確認します。

$ k3s kubectl get sc
NAME                        PROVISIONER                                                RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
openebs-jiva-default        openebs.io/provisioner-iscsi                               Delete          Immediate              false                  27m
openebs-snapshot-promoter   volumesnapshot.external-storage.k8s.io/snapshot-promoter   Delete          Immediate              false                  27m
openebs-hostpath            openebs.io/local                                           Delete          WaitForFirstConsumer   false                  27m
openebs-device              openebs.io/local                                           Delete          WaitForFirstConsumer   false                  27m
local-path                  rancher.io/local-path                                      Delete          WaitForFirstConsumer   false                  3d23h

openebs-jiva-defaultをデフォルトのストレージクラスに設定します。

$ k3s kubectl patch storageclass openebs-jiva-default -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'

openebs-jiva-defaultがデフォルトのストレージクラスに設定されていることが確認します。

$ k3s kubectl get sc
NAME                             PROVISIONER                                                RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
openebs-snapshot-promoter        volumesnapshot.external-storage.k8s.io/snapshot-promoter   Delete          Immediate              false                  28m
openebs-hostpath                 openebs.io/local                                           Delete          WaitForFirstConsumer   false                  28m
openebs-device                   openebs.io/local                                           Delete          WaitForFirstConsumer   false                  28m
local-path                       rancher.io/local-path                                      Delete          WaitForFirstConsumer   false                  3d23h
openebs-jiva-default (default)   openebs.io/provisioner-iscsi                               Delete          Immediate              false                  28m

・動作確認

MySQLのコンテナにストレージを接続してみます。
サンプルのyaml(sample.yaml)は以下のとおりです。

---
apiVersion: apps/v1
kind: Deployment
metadata:
 name: mysql
 labels:
   name: mysql
spec:
 replicas: 1
 selector: 
   matchLabels:
     name: mysql
 template: 
   metadata:
     labels: 
       name: mysql
   spec:
     containers:
       - resources:
           limits:
             cpu: 0.5
         name: mysql
         image: mysql/mysql-server:8.0-aarch64
         ports:
           - containerPort: 3306
             name: mysql
         volumeMounts:
           - mountPath: /var/lib/mysql
             name: demo-vol1
     volumes:
       - name: demo-vol1
         persistentVolumeClaim:
           claimName: demo-vol1-claim
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
 name: demo-vol1-claim
spec:
 storageClassName: openebs-jiva-default
 accessModes:
   - ReadWriteOnce
 resources:
   requests:
     storage: 5G
---
apiVersion: v1
kind: Service
metadata:
 name: mysql
 labels:
   name: mysql
spec:
 ports:
   - port: 3306
     targetPort: 3306
 selector:
     name: mysql

これをapplyします。

$ k3s kubectl apply -f sample.yaml

podが起動するまで待ちます。

$ k3s kubectl get pods
NAME                     READY   STATUS    RESTARTS   AGE
mysql-6d6dccdb47-7glb4   1/1     Running   0          8m5s

ログにrootパスワードが出力されるので確認します。(もちろんですが、このまま利用する場合はきちんと変更しておきましょう)

$ k3s kubectl logs  mysql-6d6dccdb47-7glb4 | grep PASSWORD
[Entrypoint] GENERATED ROOT PASSWORD: zAn83dikuzvigSEJ3GDAtgYdUr

コンテナのシェルに接続してMySQLに接続してみます。

$ k3s kubectl exec -it  mysql-6d6dccdb47-7glb4 -- /bin/bash
# mysql -u root -pzAn83dikuzvigSEJ3GDAtgYdUrj
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 8.0.21
Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>

無事接続できました。
Podの詳細も確認しておきましょう

$ k3s kubectl describe pod/mysql-6d6dccdb47-7glb4
Name:         mysql-6d6dccdb47-7glb4
Namespace:    default
Priority:     0
Node:         raspberrypi3/192.168.2.3
Start Time:   Sun, 04 Oct 2020 17:18:42 +0900
Labels:       name=mysql
             pod-template-hash=6d6dccdb47
Annotations:  <none>
Status:       Running
IP:           10.42.2.16
IPs:
 IP:           10.42.2.16
Controlled By:  ReplicaSet/mysql-6d6dccdb47
Containers:
 mysql:
   Container ID:   containerd://9158c5b91ef4240500874b4f89e20e956f653335e8dbe33ee18f2a31c55b0901
   Image:          mysql/mysql-server:8.0-aarch64
   Image ID:       docker.io/mysql/mysql-server@sha256:1394fcf6508c033f09a51682df22e276a888f8171fbce5ac66cec3d607cc7d62
   Port:           3306/TCP
   Host Port:      0/TCP
   State:          Running
     Started:      Sun, 04 Oct 2020 17:20:16 +0900
   Ready:          True
   Restart Count:  0
   Limits:
     cpu:  500m
   Requests:
     cpu:        500m
   Environment:  <none>
   Mounts:
     /var/lib/mysql from demo-vol1 (rw)
     /var/run/secrets/kubernetes.io/serviceaccount from default-token-5kfw9 (ro)
Conditions:
 Type              Status
 Initialized       True
 Ready             True
 ContainersReady   True
 PodScheduled      True
Volumes:
 demo-vol1:
   Type:       PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
   ClaimName:  demo-vol1-claim
   ReadOnly:   false
 default-token-5kfw9:
   Type:        Secret (a volume populated by a Secret)
   SecretName:  default-token-5kfw9
   Optional:    false
QoS Class:       Burstable
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
                node.kubernetes.io/unreachable:NoExecute for 300s
Events:          <none>

ちょっと長いので目的の部分のみ。

Volumes:
 demo-vol1:
   Type:       PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
   ClaimName:  demo-vol1-claim
   ReadOnly:   false

無事、永続化ボリュームも接続できています。
永続化ボリュームも確認してみましょう。

 k3s kubectl get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                     STORAGECLASS           REASON   AGE
pvc-15540421-d658-4891-b20f-1e3cb6607ea3   5G         RWO            Delete           Bound    default/demo-vol1-claim   openebs-jiva-default            19h

無事に、作成&接続できているようです。

参考

Alpha Features
Installing OpenEBS
Change the default StorageClass
2.5.6.1 Basic Steps for MySQL Server Deployment with Docker
mysql/mysql-server
Change the default StorageClass

この記事が気に入ったらサポートをしてみませんか?