[LINUX] Einführung von Ceph mit Kubernetes auf Raspberry Pi 4B (ARM64)

Einführung

Ich wollte den dauerhaften Speicher meines Raspeye-Kubernetes-Clusters zu Hause loswerden, also habe ich Ceph durcheinander gebracht. Es war ziemlich viel Arbeit, also werde ich es aufschreiben.

Voraussetzung Umgebung

Es ist eine einfache Figur. Es gibt einen Kubernetes-Cluster über WLAN mit schlechter Leitungsqualität, der auch als IoT-Experiment dient. スクリーンショット 2020-09-21 16.25.25.png


# kubectl get nodes -o wide
NAME    STATUS   ROLES    AGE    VERSION   INTERNAL-IP   EXTERNAL-IP   OS-IMAGE                       KERNEL-VERSION   CONTAINER-RUNTIME
chino   Ready    master   8d     v1.19.2   10.0.0.1      <none>        Debian GNU/Linux 10 (buster)   5.4.51-v8+       docker://19.3.13
chiya   Ready    worker   8d     v1.19.2   10.0.0.5      <none>        Debian GNU/Linux 10 (buster)   5.4.51-v8+       docker://19.3.13
cocoa   Ready    worker   46h    v1.19.2   10.0.0.2      <none>        Debian GNU/Linux 10 (buster)   5.4.51-v8+       docker://19.3.13
rize    Ready    worker   2d2h   v1.19.2   10.0.0.3      <none>        Debian GNU/Linux 10 (buster)   5.4.51-v8+       docker://19.3.13
syaro   Ready    worker   42h    v1.19.2   10.0.0.4      <none>        Debian GNU/Linux 10 (buster)   5.4.51-v8+       docker://19.3.13
# uname -a
Linux chino 5.4.51-v8+ #1333 SMP PREEMPT Mon Aug 10 16:58:35 BST 2020 aarch64 GNU/Linux

Erstellen Sie eine Partition für Ceph

Erstellen Sie eine neue Partition auf der SSD des Worker-Knotens. In meiner Konfiguration werden alle Knoten nur über eine SSD (250 GB) betrieben, die über einen USB-Start verbunden ist. Diesmal habe ich das Raspberry Pi-Betriebssystem von microSD gestartet und gearbeitet.


# e2fsck -f /dev/sda2
# resize2fs /dev/sda2 100G
# fdisk /dev/sda
Device     Boot     Start       End   Sectors   Size Id Type
/dev/sda1            8192    532479    524288   256M  c W95 FAT32 (LBA)
/dev/sda2          532480 488397167 487864688   233G 83 Linux
* Drücken Sie "p", um Partitionsinformationen anzuzeigen. ""/"Partition(/dev/sda2)Überprüfen Sie die Startposition von.
* Verwenden Sie "d", um die zweite Partition zu löschen.
* Erstellen Sie erneut eine zweite Partition von derselben Startposition. Die Endposition ist "+Spezifiziert durch "100G".
* Speichern Sie die Partitionsänderung mit "w".
# partprobe
# e2fsck -f /dev/sda2
* Wenn hier ein Fehler auftritt, drücken Sie "Strg", ohne zu reparieren.+Beenden Sie mit "c", diesmal mit getrennt/dev/Das Nachschneiden von sda2 kann funktionieren.
# fdisk /dev/sda
* Mit "n" den Rest/dev/Erstellen Sie sda3. Der Partitionstyp ist 8e "Linux LVM".
# partprobe
# fdisk -l /dev/sda
Device     Boot     Start       End   Sectors   Size Id Type
/dev/sda1            8192    532479    524288   256M  c W95 FAT32 (LBA)
/dev/sda2          532480 210247679 209715200   100G 83 Linux
/dev/sda3       210247680 488397167 278149488 132.6G 8e Linux LVM

Dies erfolgt mit 3 Worker-Knoten. Ich wollte den Dienst nicht beenden, also habe ich die Kubernetes einzeln abgelassen und sie wieder beitreten lassen. Der Worker-Knoten (Chiya) wird nicht in einem anderen Raum verwendet, der über den Ethernet-Konverter dem Kubernetes-Cluster beitritt.

Wenn es kein Problem mit der Stromversorgung gibt, besteht beim Hinzufügen einer weiteren SSD zu USB nicht das Risiko, mit resize2fs zu brechen, und die Arbeit ist schneller. ... Dieses Mal ist resize2fs fehlgeschlagen und zwei Worker-Knoten werden neu erstellt.

Gebäude Ceph

Ich habe wie im Artikel "Ich habe Ceph in Kubernetes auf Raspeye gesetzt" beschrieben. Da sich die Dokument-URL von Ceph geändert hat, gibt es viele tote Links in Ceph-bezogenen Informationen, aber es wäre sehr hilfreich, solche Informationen auf Japanisch zu haben.

Das Folgende ist die Arbeit am Masterknoten. Ich habe gerade das Passwort eingegeben, während ich den Befehl ausgeführt habe.


# mkdir ceph-deploy
# cd ceph-deploy
# pip install ceph-deploy
# ceph-deploy --username pi new cocoa rize syaro
# ceph-deploy --username pi install cocoa rize syaro
# ceph-deploy install chino
# ceph-deploy --username pi mon create-initial
# ceph-deploy --username pi admin cocoa rize syaro
# ceph-deploy admin chino
# ceph-deploy --username pi osd create cocoa --data /dev/sda3
# ceph-deploy --username pi osd create rize --data /dev/sda3
# ceph-deploy --username pi osd create syaro --data /dev/sda3
# ceph-deploy --username pi mds create cocoa

Pool erstellen.


# ceph osd pool create kubernetes 128

Erstellen einer ConfigMap.


# ceph mon dump
dumped monmap epoch 2
epoch 2
fsid 56b03534-e602-4856-8734-8bcdf5cc8670
last_changed 2020-09-20 01:24:55.648189
created 2020-09-20 01:24:08.811926
0: 10.0.0.2:6789/0 mon.cocoa
1: 10.0.0.3:6789/0 mon.rize
2: 10.0.0.4:6789/0 mon.syaro

* Das erstellte Yaml ist wie folgt.
# cat csi-config-map.yaml 
apiVersion: v1

kind: ConfigMap
data:
  config.json: |-
    [
      {
        "clusterID": "56b03534-e602-4856-8734-8bcdf5cc8670",
        "monitors": [
          "10.0.0.2:6789",
          "10.0.0.3:6789",
          "10.0.0.4:6789"
        ]
      }
    ]
metadata:
  name: ceph-csi-config
# kubectl apply -f csi-config-map.yaml

Geheime Schöpfung.


# ceph auth get-or-create client.kubernetes mon 'profile rbd' osd 'profile rbd pool=kubernetes' mgr 'profile rbd pool=kubernetes'
[client.kubernetes]
	key = AQBrNmZfVCowLBAAeN3EYjhOPBG9442g4NF/bQ==

* Das erstellte Yaml ist wie folgt.
# cat csi-rbd-secret.yaml 
apiVersion: v1

kind: Secret
metadata:
  name: csi-rbd-secret
  namespace: default
stringData:
  userID: kubernetes
  userKey: AQBrNmZfVCowLBAAeN3EYjhOPBG9442g4NF/bQ==
# kubectl apply -f csi-rbd-secret.yaml

Erstellen einer ConfigMap (leer).


# cat kms-config.yaml 
apiVersion: v1
kind: ConfigMap
data:
  config.json: |-
    {
    }
metadata:
  name: ceph-csi-encryption-kms-config
# kubectl apply -f kms-config.yaml 

Vielleicht ist "# kubectl create configmap ceph-csi-encryption-kms-config" in Ordnung.


# wget https://raw.githubusercontent.com/ceph/ceph-csi/master/deploy/rbd/kubernetes/csi-provisioner-rbac.yaml
# kubectl apply -f csi-provisioner-rbac.yaml
# wget https://raw.githubusercontent.com/ceph/ceph-csi/master/deploy/rbd/kubernetes/csi-nodeplugin-rbac.yaml
# kubectl apply -f csi-nodeplugin-rbac.yaml

Ich werde schreiben, indem ich das Verfahren von der Seite, auf die ich mich hier beziehe, leicht ändere. Es ist besser, nicht am Masterknoten zu arbeiten, aber ich habe es am Masterknoten gemacht. Holen Sie sich zuerst Yaml von CSI und ändern Sie Cephcsi in Arm64.


# wget https://raw.githubusercontent.com/ceph/ceph-csi/master/deploy/rbd/kubernetes/csi-rbdplugin-provisioner.yaml  
# sed -i -e 's/quay.io\/cephcsi\/cephcsi:canary/quay.io\/cephcsi\/cephcsi:canary-arm64/g' csi-rbdplugin-provisioner.yaml  

# wget https://raw.githubusercontent.com/ceph/ceph-csi/master/deploy/rbd/kubernetes/csi-rbdplugin.yaml  
# sed -i -e 's/quay.io\/cephcsi\/cephcsi:canary/quay.io\/cephcsi\/cephcsi:canary-arm64/g' csi-rbdplugin.yaml  

Überprüfen Sie die Version des im Bild verwendeten Container-Images.


# grep image: csi-rbdplugin-provisioner.yaml csi-rbdplugin.yaml
csi-rbdplugin-provisioner.yaml:          image: quay.io/k8scsi/csi-provisioner:v1.6.0
csi-rbdplugin-provisioner.yaml:          image: quay.io/k8scsi/csi-snapshotter:v2.1.0
csi-rbdplugin-provisioner.yaml:          image: quay.io/k8scsi/csi-attacher:v2.1.1
csi-rbdplugin-provisioner.yaml:          image: quay.io/k8scsi/csi-resizer:v0.5.0
csi-rbdplugin-provisioner.yaml:          image: quay.io/cephcsi/cephcsi:canary-arm64
csi-rbdplugin-provisioner.yaml:          image: quay.io/cephcsi/cephcsi:canary-arm64
csi-rbdplugin.yaml:          image: quay.io/k8scsi/csi-node-driver-registrar:v1.3.0
csi-rbdplugin.yaml:          image: quay.io/cephcsi/cephcsi:canary-arm64
csi-rbdplugin.yaml:          image: quay.io/cephcsi/cephcsi:canary-arm64

# git clone --single-branch --branch release-1.6 https://github.com/kubernetes-csi/external-provisioner
# git clone --single-branch --branch release-2.1 https://github.com/kubernetes-csi/external-snapshotter
# git clone --single-branch --branch release-2.1 https://github.com/kubernetes-csi/external-attacher
# git clone --single-branch --branch release-0.5 https://github.com/kubernetes-csi/external-resizer
# git clone --single-branch --branch release-1.3 https://github.com/kubernetes-csi/node-driver-registrar

Download go. https://golang.org/dl/ Wie ich bereits erwähnt habe, scheint "go-1.13" in der Marke des Container-Images der oben erhaltenen Version angenommen zu werden.


# wget https://dl.google.com/go/go1.15.1.linux-arm64.tar.gz
# tar xzvf go1.15.1.linux-arm64.tar.gz
# rm go1.15.1.linux-arm64.tar.gz 
# echo 'export GOPATH=$HOME/go' >> ~/.bashrc
# echo 'export PATH=$GOPATH/bin:$PATH' >> ~/.bashrc
# source ~/.bashrc
# go version
go version go1.15.1 linux/arm64

Ich denke, es hängt von der Generation ab, aber go wird in meinem Herzen als "Ngo" gelesen.


# cd external-provisioner
# make
# docker build -t csi-provisioner:v1.6.0 .
# cd ../external-snapshotter
# make
# cp cmd/csi-snapshotter/Dockerfile .
# docker build -t csi-snapshotter:v2.1.0 .
# cd ../external-attacher
# make
# docker build -t csi-attacher:v2.1.0 .
# cd ../external-resizer
# make
# docker build -t csi-resizer:v0.5.0 .
# cd ../node-driver-registrar
# make
# docker build -t csi-node-driver-registrar:v1.3.0 .

Nur Snapshotter war verwirrt über Dockerfile. ... Wahrscheinlich ist die Arbeitsweise anders, aber ich habe gewaltsam ein Bild gemacht. Das Image befindet sich im Docker. Speichern Sie es also und laden Sie es in das Docker des Worker-Knotens.


# docker images
REPOSITORY                           TAG                 IMAGE ID            CREATED             SIZE
csi-node-driver-registrar            v1.3.0              a6e114649cf9        33 hours ago        14.2MB
csi-resizer                          v0.5.0              d6b561c2aa0a        34 hours ago        41.6MB
csi-attacher                         v2.1.0              807c3900bf76        34 hours ago        41.7MB
csi-snapshotter                      v2.1.0              653dbf034d1d        34 hours ago        41.8MB
csi-provisioner                      v1.6.0              4b18fda1685c        34 hours ago        43.4MB
(Folgendes wird weggelassen)
# docker save csi-node-driver-registrar:v1.3.0 -o csi-node-driver-registrar.tar
# docker save csi-resizer:v0.5.0 -o csi-resizer.tar
# docker save csi-attacher:v2.1.0 -o csi-attacher.tar
# docker save csi-snapshotter:v2.1.0 -o csi-snapshotter.tar
# docker save csi-provisioner:v1.6.0 -o csi-provisioner.tar

Kopieren Sie scp oder sftp auf den Worker-Knoten. Führen Sie nach dem Kopieren den folgenden Befehl auf jedem Arbeitsknoten aus. Zur Zeit lege ich es in einen Worker-Knoten, den ich nicht benutze.


# docker load -i csi-node-driver-registrar.tar
# docker load -i csi-resizer.tar
# docker load -i csi-attacher.tar
# docker load -i csi-snapshotter.tar
# docker load -i csi-provisioner.tar

Kommen wir nun wieder zur Arbeit mit ceph-deploy. Der Teil "image:" von "csi-rbdplugin-provisor.yaml" und "csi-rbdplugin.yaml" wurde wie folgt in das Repository-Tag des erstellten Images geändert.


# grep -n image: csi-rbdplugin-provisioner.yaml csi-rbdplugin.yaml 
csi-rbdplugin-provisioner.yaml:35:          image: csi-provisioner:v1.6.0
csi-rbdplugin-provisioner.yaml:52:          image: csi-snapshotter:v2.1.0
csi-rbdplugin-provisioner.yaml:68:          image: csi-attacher:v2.1.0
csi-rbdplugin-provisioner.yaml:82:          image: csi-resizer:v0.5.0
csi-rbdplugin-provisioner.yaml:102:          image: quay.io/cephcsi/cephcsi:canary-arm64
csi-rbdplugin-provisioner.yaml:142:          image: quay.io/cephcsi/cephcsi:canary-arm64
csi-rbdplugin.yaml:28:          image: csi-node-driver-registrar:v1.3.0
csi-rbdplugin.yaml:50:          image: quay.io/cephcsi/cephcsi:canary-arm64
csi-rbdplugin.yaml:102:          image: quay.io/cephcsi/cephcsi:canary-arm64

Lassen Sie uns jetzt bereitstellen. Es gibt nur erfolgreiche Beispiele, aber ...


# kubectl apply -f csi-rbdplugin-provisioner.yaml
# kubectl apply -f csi-rbdplugin.yaml
# kubectl get pod -o wide
NAME                                         READY   STATUS    RESTARTS   AGE    IP            NODE    NOMINATED NODE   READINESS GATES
csi-rbdplugin-hm9bm                          3/3     Running   3          24h    10.0.0.4      syaro   <none>           <none>
csi-rbdplugin-provisioner-54dd99dd97-f9x2s   6/6     Running   6          24h    172.16.4.40   syaro   <none>           <none>
csi-rbdplugin-provisioner-54dd99dd97-flbh9   6/6     Running   0          24h    172.16.2.28   cocoa   <none>           <none>
csi-rbdplugin-provisioner-54dd99dd97-s9qf4   6/6     Running   0          24h    172.16.3.54   rize    <none>           <none>
csi-rbdplugin-t7569                          3/3     Running   0          24h    10.0.0.3      rize    <none>           <none>
csi-rbdplugin-x4fzk                          3/3     Running   3          24h    10.0.0.5      chiya   <none>           <none>
csi-rbdplugin-xwrnx                          3/3     Running   0          24h    10.0.0.2      cocoa   <none>           <none>

Es wird empfohlen, bei der Bereitstellung "# kubectl get events -w" festzulegen. Erstellen Sie eine Speicherklasse. So wie es jetzt ist, ist es möglicherweise besser, dass der Namespace nicht der Standard ist.


# cat csi-rbd-sc.yaml 
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
   name: csi-rbd-sc
provisioner: rbd.csi.ceph.com
parameters:
   clusterID: "56b03534-e602-4856-8734-8bcdf5cc8670"
   pool: kubernetes
   csi.storage.k8s.io/provisioner-secret-name: csi-rbd-secret
   csi.storage.k8s.io/provisioner-secret-namespace: default
   csi.storage.k8s.io/node-stage-secret-name: csi-rbd-secret
   csi.storage.k8s.io/node-stage-secret-namespace: default
reclaimPolicy: Delete
mountOptions:
   - discard
# kubectl apply -f csi-rbd-sc.yaml

Geben Sie danach "storageClassName" als "csi-rbd-sc" an, wenn Sie PVC auf der Anwendungsseite erstellen. Kann nicht mit dynamischer Bereitstellung verwendet werden .... Ich konnte es nicht mit der PVC-Definition der Site bestätigen, auf die ich mich beziehe, aber als ich "Volume Mode: Block" im Raw-Modus löschte, wurde das folgende Ereignis ausgegeben.

default   0s     Warning    FailedMount        pod/es-cluster-0       MountVolume.MountDevice failed for volume "pvc- ...
...... rbd error output: modinfo: ERROR: Module rbd not found.
modprobe: FATAL: Module rbd not found in directory /lib/modules/5.4.51-v8+
rbd: failed to load rbd kernel module (1)
rbd: sysfs write failed
rbd: map failed: (2) No such file or directory
deault    0s     Warning    FailedMount        pod/es-cluster-0       Unable to attach or mount volumes: unmounted.....

Zurück zur Annahme, wir brauchen ein Kernelmodul namens "rbd". Und in Raspberry Pi OS 64bit (Beta) wird das "rbd" -Modul überhaupt nicht kompiliert. Das heißt, Sie müssen den Kernel kompilieren.

Der Grund, warum das Kernelmodul erforderlich ist, obwohl der Befehl von jedem Client verwendet werden kann, ist "Deep Dive Into Cephs Kernel Client. edea75787528) ”Ich habe verstanden. (Ungefähr die Hälfte) Der Befehl kann in der Bibliothek verwendet werden, und es scheint, dass das Kernelmodul in der Containerumgebung erforderlich ist.

Kernel Build

Kompilieren des Linux-Kernels, was früher eine tägliche Aufgabe war. Als es noch kein Konzept für ein Kernelmodul gab, gab es eine Begrenzung für die Größe des Kernels, der geladen werden konnte, und jeder kompilierte in letzter Minute einen Kernel, der zu seinem Computer passt. Sie haben jedes Mal, wenn Sie ein neues Gerät hinzugefügt haben, eine Kernel-Kompilierung durchgeführt.

Also habe ich es geschafft, aber was ist jetzt los? Ich habe so gearbeitet. Das Handbuch lautet "Kernel-Erstellung", aber da es sich immer noch um eine 64-Bit-Version der Beta handelt, [Gepostet von der Person, die es tatsächlich tut]( Ich habe auf https://www.raspberrypi.org/forums/viewtopic.php?t=280341 verwiesen. Die Arbeit dauerte ungefähr eine Stunde.


# git clone --depth=1 -b rpi-5.4.y https://github.com/raspberrypi/linux.git
# cd linux/
# make bcm2711_defconfig
# vi .config

(「CONFIG_BLK_DEV_RBD=Fügen Sie "m" entsprechend hinzu.)

# grep RBD .config
CONFIG_BLK_DEV_DRBD=m
# CONFIG_DRBD_FAULT_INJECTION is not set
CONFIG_BLK_DEV_RBD=m

# make -j4

(Ich denke, dass die Frage nach Cephfs im Zusammenhang mit der Aktivierung von RBD auftauchen wird, aber ich habe es nicht gut verstanden, also habe ich es auf "N" gesetzt.)

# make modules_install
# make dtbs_install
# cp /boot/kernel8.img /boot/kernel8_old.img
# cp arch/arm64/boot/Image /boot/kernel8.img
# vi /boot/config.txt

(Im Forumsbeitrag "#"Es ist angehängt...Erstens, wenn es sich um einen Kommentar handelt, sollte es nicht notwendig sein, ihn zu schreiben, also werde ich ihn entfernen.)

# head -n 10 /boot/config.txt 
# For more options and information see
# http://rpf.io/configtxt
# Some settings may impact device functionality. See link above for details

device_tree=dtbs/5.4.65-v8+/broadcom/bcm2711-rpi-4-b.dtb
overlay_prefix=dtbs/5.4.65-v8+/overlays/
kernel=kernel8.img

# uncomment if you get no picture on HDMI for a default "safe" mode
#hdmi_safe=1

Früher habe ich neu gestartet, während ich "Hahhh" gesagt habe, aber ich werde es schnell tun. Ich bin zuversichtlich, dass ich mich erholen kann ... (Aber ich habe die ganze Zeit von einer anderen Maschine aus gepingt.)


# reboot

Ich werde alles überprüfen. Da es sich um einen benutzerdefinierten Kernel handelt, können Sie keinen bezahlten Support mehr erhalten. (Es gibt keine solche Sache)


# uname -a
Linux syaro 5.4.65-v8+ #1 SMP PREEMPT Mon Sep 21 01:04:01 JST 2020 aarch64 GNU/Linux
# modprobe rbd
# lsmod | grep rbd
rbd                    98304  0
libceph               278528  1 rbd
# modinfo rbd
filename:       /lib/modules/5.4.65-v8+/kernel/drivers/block/rbd.ko
license:        GPL
description:    RADOS Block Device (RBD) driver
author:         Jeff Garzik <[email protected]>
author:         Yehuda Sadeh <[email protected]>
author:         Sage Weil <[email protected]>
author:         Alex Elder <[email protected]>
srcversion:     BC90D52477A5CE4593C5AC3
depends:        libceph
intree:         Y
name:           rbd
vermagic:       5.4.65-v8+ SMP preempt mod_unload modversions aarch64
parm:           single_major:Use a single major number for all rbd devices (default: true) (bool)

Bereitstellen von Apps mit Ceph CSI StorageClass

Versuchen wir nun die Bereitstellung erneut, die einmal fehlgeschlagen ist, weil das rbd-Kernelmodul fehlte.


# cat es_master_sts.yaml 
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: es-cluster
spec:
  selector:
    matchLabels:
      app: es
  serviceName: "es-cluster"
  replicas: 1
  template:
    metadata:
      labels:
        app: es
    spec:
      containers:
      - name: es
        image: elasticsearch:7.9.1
        env:
        - name: discovery.type
          value: single-node
        ports:
        - containerPort: 9200
          name: api
        - containerPort: 9300
          name: gossip
        volumeMounts:
        - name: data
          mountPath: /usr/share/elasticsearch/data
  volumeClaimTemplates:
  - metadata:
      name: data
    spec:
      accessModes: 
        - ReadWriteOnce
      resources:
        requests:
          storage: 1Gi
      storageClassName: csi-rbd-sc
# kubectl apply -f es_master_sts.yaml

Überprüfen Sie den Status des Pods.


# kubectl get pods -w
NAME                                         READY   STATUS    RESTARTS   AGE
csi-rbdplugin-hm9bm                          3/3     Running   3          25h
csi-rbdplugin-provisioner-54dd99dd97-f9x2s   6/6     Running   6          25h
csi-rbdplugin-provisioner-54dd99dd97-flbh9   6/6     Running   0          25h
csi-rbdplugin-provisioner-54dd99dd97-s9qf4   6/6     Running   0          25h
csi-rbdplugin-t7569                          3/3     Running   0          25h
csi-rbdplugin-x4fzk                          3/3     Running   3          25h
csi-rbdplugin-xwrnx                          3/3     Running   0          25h
es-cluster-0                                 0/1     Pending   0          0s
es-cluster-0                                 0/1     Pending   0          0s
es-cluster-0                                 0/1     Pending   0          2s
es-cluster-0                                 0/1     ContainerCreating   0          2s
es-cluster-0                                 1/1     Running             0          8s

Ereignisüberwachung.


# kubectl get events -w
LAST SEEN   TYPE     REASON             OBJECT                   MESSAGE
0s          Normal   SuccessfulCreate   statefulset/es-cluster   create Claim data-es-cluster-0 Pod es-cluster-0 in StatefulSet es-cluster success
0s          Normal   ExternalProvisioning   persistentvolumeclaim/data-es-cluster-0   waiting for a volume to be created, either by external provisioner "rbd.csi.ceph.com" or manually created by system administrator
0s          Normal   Provisioning           persistentvolumeclaim/data-es-cluster-0   External provisioner is provisioning volume for claim "default/data-es-cluster-0"
0s          Normal   SuccessfulCreate       statefulset/es-cluster                    create Pod es-cluster-0 in StatefulSet es-cluster successful
0s          Warning   FailedScheduling       pod/es-cluster-0                          0/5 nodes are available: 5 pod has unbound immediate PersistentVolumeClaims.
0s          Warning   FailedScheduling       pod/es-cluster-0                          0/5 nodes are available: 5 pod has unbound immediate PersistentVolumeClaims.
0s          Normal    ProvisioningSucceeded   persistentvolumeclaim/data-es-cluster-0   Successfully provisioned volume pvc-1c1abfad-87fa-4882-a840-8449c6d50326
0s          Normal    Scheduled               pod/es-cluster-0                          Successfully assigned default/es-cluster-0 to syaro
0s          Normal    SuccessfulAttachVolume   pod/es-cluster-0                          AttachVolume.Attach succeeded for volume "pvc-1c1abfad-87fa-4882-a840-8449c6d50326"
0s          Normal    Pulled                   pod/es-cluster-0                          Container image "elasticsearch:7.9.1" already present on machine
0s          Normal    Created                  pod/es-cluster-0                          Created container es
0s          Normal    Started                  pod/es-cluster-0                          Started container es

Speicherbezogene Bestätigung.


# kubectl get sc,pv,pvc
NAME                                     PROVISIONER        RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
storageclass.storage.k8s.io/csi-rbd-sc   rbd.csi.ceph.com   Delete          Immediate           false                  25h

NAME                                                        CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                       STORAGECLASS   REASON   AGE
persistentvolume/pvc-1c1abfad-87fa-4882-a840-8449c6d50326   1Gi        RWO            Delete           Bound    default/data-es-cluster-0   csi-rbd-sc              78s

NAME                                      STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
persistentvolumeclaim/data-es-cluster-0   Bound    pvc-1c1abfad-87fa-4882-a840-8449c6d50326   1Gi        RWO            csi-rbd-sc     78s

Insbesondere blieb die erstellte Datei auch nach dem Löschen und erneuten Bereitstellen des Pods erhalten. (Natürlich) Es reicht nicht aus, ein separates Element zu erstellen, aber es ist ein Leistungsaspekt. Ursprünglich bin ich nicht gut in Hardware und ich habe hier nicht viel Know-how, aber ich werde das mit dd geschriebene Ergebnis schreiben.


# dd if=/dev/zero of=aaa bs=4096 count=100000
Erstes Mal Zweites Mal Drittes Mal 4 .. 5. Mal
Dd auf die Diskette des Workers im Betriebssystem des Workers 186 MB/s 133 MB/s 141 MB/s 140 MB/s 133 MB/s
dd aus dem Container im Hostpfadverzeichnis 120 MB/s 121 MB/s 134 MB/s 131 MB/s 131 MB/s
ceph-csi 186 MB/s 185 MB/s 174 MB/s 178 MB/s 180 MB/s

ceph-csi kam zum Zeitpunkt der Messung nicht heraus, aber manchmal sind es 50 MB / s, und die Rückgabe des Befehls ist langsam, sodass es sich spitz anfühlt. Was beeinflusst ...

abschließend

Wenn möglich, denke ich, dass der mit ROOK (Operator) erstellte Typ durch Ändern des Container-Images irgendwie verschoben werden kann. Das wäre eine gute Möglichkeit, OpenShift Container Storage zu studieren ... (aber es wird schwerer ...) Dieses Mal bezog ich mich auf die Materialien verschiedener Leute, aber ich war überrascht, dass es auch ein Material von Mr. Yuryu aus der Red Hat-Ära gab: "Ich frage mich, ob ich vor so langer Zeit Ceph gemacht habe." Einer der Menschen, die ich persönlich bewundere, ist mir seit "Linux Kernel Updates" zu Dank verpflichtet.

Es gibt einen Teil, in dem das endgültige Leistungsergebnis "?" Ist ... Nun, angesichts der Leistung verwende ich Raspeye nicht und wollte ursprünglich CSI als Funktion verwenden, daher bin ich mit dem Ergebnis zufrieden. Auf diese Weise können Pods, die persistenten Speicher verwenden, redundant gemacht werden, indem hostPath verlassen wird.

Recommended Posts

Einführung von Ceph mit Kubernetes auf Raspberry Pi 4B (ARM64)
Pyenv auf Raspberry Pi eingeführt
[Hinweis] Installieren von VMware ESXi auf Arm Fling auf Raspeye 4B
USB-Boot auf Raspberry Pi 4 Model B.
Erstellen Sie eine OpenCV-Python-Umgebung auf Raspberry Pi B +
Warum DetectMultiScale () auf Raspberry Pi B + langsam ist
Pigpio auf Himbeer-Pi
Cython auf Raspberry Pi
Führen Sie die LED-Matrix interaktiv mit Raspberry Pi 3B + auf Slackbot aus
Himbeere pi 1 Modell b, Python
Verwenden Sie NeoPixel mit Himbeerkuchen
Installieren Sie OpenCV4 auf Raspberry Pi 3
Installieren Sie TensorFlow 1.15.0 auf Raspberry Pi
Da IBM MAX ARM unterstützt, läuft es auf Raspberry Pi.
Port FreeRTOS auf Raspberry Pi 4B
Testen der Kommunikation mit Raspberry Pi
Himbeer pi 1 Modell b, knotenroter Teil 17
Himbeer Pi 4 Centos7 auf Docker installieren
Installieren Sie ghoto2 auf Raspberry Pi (Hinweis)
OpenCV-Installationsverfahren auf Raspberry Pi
Ein- / Ausschalten von Raspberry Pi mit Arduino
Erkennen Sie den Schalterstatus mit Raspberry Pi 3
Installieren Sie OpenMedia Vault 5 auf Raspberry Pi 4
L Chika mit Himbeer-Pi C #
Erstellen Sie wxPython unter Ubuntu 20.04 auf Himbeer-Pi 4
Raspberry Pi "Honwaka Benachrichtigungslampe" Teil 2
Erkennen Sie "Helligkeit" mit Python auf Raspberry Pi 3!
Raspberry Pi "Honwaka Benachrichtigungslampe" Teil 1
Aktivieren Sie die serielle UART + -Kommunikation mit Raspberry Pi
Adafruit Python BluefruitLE arbeitet mit Raspeye.
Beschleunigen Sie Deep Learning mit der Rasperry Pi 4-CPU
Stellen Sie den Swap Space unter Ubuntu auf Raspberry Pi ein
Normal programmieren mit Node-RED-Programmierung mit Raspberry Pi 3
Verwenden Sie den Grove-Sensor mit Raspberry Pi
Installieren Sie das 64-Bit-Betriebssystem (Bate) auf Raspberry Pi
Installieren Sie Docker-Compose unter 64-Bit-Raspberry-Pi-Betriebssystem
Lassen Sie einen Servomotor mit Python auf Raspberry Pi 3 laufen
Raspberry Pi "Honwaka Benachrichtigungslampe" Teil 3
Ermitteln Sie die Temperatur mit Python auf Raspberry Pi 3!
Matrixmultiplikation auf Raspberry Pi GPU (Teil 2)
So installieren Sie NumPy auf Raspeye
Arbeiten mit GPS in Python für Raspberry Pi 3
Ich habe versucht, Flask auf Raspberry Pi 3 Model B + mit Nginx und uWSGI auszuführen
Erstellen Sie eine Django-Umgebung auf Raspai (MySQL)
Versuchen Sie, QR-Code mit Raspberry Pi zu verwenden
Erkennen Sie Magnetschalter mit Python auf Raspberry Pi 3!
Genießen Sie die elektronische Arbeit mit GPIO von Raspberry Pi
Schalten Sie Ihren PC mit Himbeer-Pi ein / aus
Stellen Sie DHT11 mit Raspeye + Python zur Verfügung (Hinweis)
Cross-Compilierung für Raspberry Pi Zero unter Ubuntu gestartet
Lassen Sie den Summer mit Python auf Raspberry Pi 3 erklingen!
Zeigen Sie die CPU-Temperatur alle 5 Sekunden auf dem Raspberry Pi 4 an
Stellen Sie mit Python auf Raspberry Pi eine Verbindung zu MySQL her
Erstellen Sie eine Python-Entwicklungsumgebung auf Raspberry Pi
Erstellen Sie eine Arch Linux-Umgebung auf Raspai
GPS-Tracking mit Raspeye 4B + BU-353S4 (Python)