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
この記事が気に入ったらサポートをしてみませんか?