Dieses Dokument wurde mithilfe automatisierter maschineller Übersetzungstechnologie übersetzt. Wir bemühen uns um korrekte Übersetzungen, übernehmen jedoch keine Gewähr für die Vollständigkeit, Richtigkeit oder Zuverlässigkeit der übersetzten Inhalte. Im Falle von Abweichungen ist die englische Originalversion maßgebend und stellt den verbindlichen Text dar.

Verwendung eines externen Ceph-Treibers

Diese Anweisungen beziehen sich auf die Verwendung des externen Ceph-Treibers in einem RKE2-Cluster. Wenn Sie RKE verwenden, sind zusätzliche Schritte erforderlich. Für Details siehe diesen Abschnitt.

Anforderungen

Stellen Sie sicher, dass die Pakete ceph-common und xfsprogs auf den SLE-Worker-Knoten installiert sind.

Verwendung des Ceph-Treibers mit RKE

Die unten aufgeführten Ressourcen sind vollständig kompatibel mit RKE-basierten Clustern, jedoch ist eine zusätzliche Kubelet-Konfiguration für RKE erforderlich.

In RKE-Clustern läuft die Kubelet-Komponente in einem Docker-Container und hat standardmäßig keinen Zugriff auf die Kernel-Module des Hosts wie rbd und libceph.

Um diese Einschränkung zu beheben, können Sie entweder modprobe rbd auf den Worker-Knoten ausführen oder die Kubelet-Container so konfigurieren, dass sie automatisch das /lib/modules-Verzeichnis vom Host in den Container einbinden.

Für die Kubelet-Konfiguration fügen Sie die folgenden Zeilen in die cluster.yml-Datei ein, bevor Sie den RKE-Cluster bereitstellen. Sie können auch das cluster.yml später in der Rancher-Benutzeroberfläche ändern, indem Sie auf Cluster bearbeiten  Als YAML bearbeiten klicken und die Worker-Knoten neu starten.

services:
  kubelet:
    extra_binds:
      - '/lib/modules:/lib/modules:ro'

Für weitere Informationen zur extra_binds-Direktive siehe diesen Abschnitt.

Installation des ceph-csi-Treibers auf einem SUSE® Rancher Prime: RKE2-Cluster

Diese Schritte sind nur für die dynamische RBD-Bereitstellung erforderlich.

Für weitere Informationen zum ceph-csi-rbd-Chart siehe diese Seite.

Um Details zu Ihrem SES-Cluster zu erhalten, führen Sie aus:

ceph mon dump

Lesen Sie die Ausgabe:

dumped monmap epoch 3
epoch 3
fsid 79179d9d-98d8-4976-ab2e-58635caa7235
last_changed 2021-02-11T10:56:42.110184+0000
created 2021-02-11T10:56:22.913321+0000
min_mon_release 15 (octopus)
0: [v2:10.85.8.118:3300/0,v1:10.85.8.118:6789/0] mon.a
1: [v2:10.85.8.123:3300/0,v1:10.85.8.123:6789/0] mon.b
2: [v2:10.85.8.124:3300/0,v1:10.85.8.124:6789/0] mon.c

Später benötigen Sie die Werte für fsid und mon-Adressen.

Installieren Sie den ceph-csi-Treiber mit Helm

Führen Sie diese Befehle aus:

helm repo add ceph-csi https://ceph.github.io/csi-charts
helm repo update
helm search repo ceph-csi -l
helm inspect values ceph-csi/ceph-csi-rbd > ceph-csi-rbd-values.yaml

Ändern Sie die ceph-csi-rbd-values.yaml-Datei und behalten Sie nur die erforderlichen Änderungen bei:

# ceph-csi-rbd-values.yaml
csiConfig:
  - clusterID: "79179d9d-98d8-4976-ab2e-58635caa7235"
    monitors:
      - "10.85.8.118:6789"
      - "10.85.8.123:6789"
      - "10.85.8.124:6789"
provisioner:
  name: provisioner
  replicaCount: 2

Stellen Sie sicher, dass die Ceph-Monitore vom RKE2-Cluster erreichbar sind, zum Beispiel durch Ping.

kubectl create namespace ceph-csi-rbd
helm install --namespace ceph-csi-rbd ceph-csi-rbd ceph-csi/ceph-csi-rbd --values ceph-csi-rbd-values.yaml
kubectl rollout status deployment ceph-csi-rbd-provisioner -n ceph-csi-rbd
helm status ceph-csi-rbd -n ceph-csi-rbd

Falls Sie die Konfiguration direkt über Helm ändern möchten, können Sie die ceph-csi-rbd-values.yaml-Datei anpassen und aufrufen:

helm upgrade \
  --namespace ceph-csi-rbd ceph-csi-rbd ceph-csi/ceph-csi-rbd --values ceph-csi-rbd-values.yaml

Erstellen von RBD Ceph-Ressourcen

# Erstellen Sie einen Ceph-Pool:
ceph osd pool create myPool 64 64

# Erstellen Sie einen Blockgerätepool:
rbd pool init myPool

# Erstellen Sie ein Blockgeräte-Image:
rbd create -s 2G myPool/image

# Erstellen Sie einen Blockgerätebenutzer und notieren Sie den Schlüssel:
ceph auth get-or-create-key client.myPoolUser mon "allow r" osd "allow class-read object_prefix rbd_children, allow rwx pool=myPool" | tr -d '\n' | base64
QVFDZ0R5VmdyRk9KREJBQTJ5b2s5R1E2NUdSWExRQndhVVBwWXc9PQ==

# Kodieren Sie den Ceph-Benutzer myPoolUser in einen base64-Hash:
echo "myPoolUser" | tr -d '\n' | base64
bXlQb29sVXNlcg==

# Erstellen Sie einen Blockgeräte-Admin-Benutzer und notieren Sie den Schlüssel:
ceph auth get-or-create-key client.myPoolAdmin mds 'allow *' mgr 'allow *' mon 'allow *' osd 'allow * pool=myPool' | tr -d '\n' | base64
QVFCK0hDVmdXSjQ1T0JBQXBrc0VtcVhlZFpjc0JwaStIcmU5M3c9PQ==

# Kodieren Sie den Ceph-Benutzer myPoolAdmin in einen base64-Hash:
echo "myPoolAdmin" | tr -d '\n' | base64
bXlQb29sQWRtaW4=

Konfigurieren Sie die RBD Ceph-Zugriffsgeheimnisse

Benutzerkonto

Für die statische RBD-Bereitstellung (das Image im Ceph-Pool muss vorhanden sein), führen Sie diese Befehle aus:

cat > ceph-user-secret.yaml << EOF
apiVersion: v1
kind: Secret
metadata:
  name: ceph-user
  namespace: default
type: kubernetes.io/rbd
data:
  userID: bXlQb29sVXNlcg==
  userKey: QVFDZ0R5VmdyRk9KREJBQTJ5b2s5R1E2NUdSWExRQndhVVBwWXc9PQ==
EOF

kubectl apply -f ceph-user-secret.yaml

Admin-Konto

Für die dynamische RBD-Bereitstellung (verwendet für die automatische Erstellung von Images in einem bestimmten Ceph-Pool), führen Sie diese Befehle aus:

cat > ceph-admin-secret.yaml << EOF
apiVersion: v1
kind: Secret
metadata:
  name: ceph-admin
  namespace: default
type: kubernetes.io/rbd
data:
  userID: bXlQb29sQWRtaW4=
  userKey: QVFCK0hDVmdXSjQ1T0JBQXBrc0VtcVhlZFpjc0JwaStIcmU5M3c9PQ==
EOF

kubectl apply -f ceph-admin-secret.yaml

RBD-Testressourcen erstellen

RBD in Pods verwenden

# pod
cat > ceph-rbd-pod-inline.yaml << EOF
apiVersion: v1
kind: Pod
metadata:
  name: ceph-rbd-pod-inline
spec:
  containers:
  - name: ceph-rbd-pod-inline
    image: busybox
    command: ["sleep", "infinity"]
    volumeMounts:
    - mountPath: /mnt/ceph_rbd
      name: volume
  volumes:
  - name: volume
    rbd:
      monitors:
      - 10.85.8.118:6789
      - 10.85.8.123:6789
      - 10.85.8.124:6789
      pool: myPool
      image: image
      user: myPoolUser
      secretRef:
        name: ceph-user
      fsType: ext4
      readOnly: false
EOF

kubectl apply -f ceph-rbd-pod-inline.yaml
kubectl get pod
kubectl exec pod/ceph-rbd-pod-inline -- df -k | grep rbd

RBD in persistenten Volumes verwenden

# pod-pvc-pv
cat > ceph-rbd-pod-pvc-pv-allinone.yaml << EOF
apiVersion: v1
kind: PersistentVolume
metadata:
  name: ceph-rbd-pv
spec:
  capacity:
    storage: 2Gi
  accessModes:
    - ReadWriteOnce
  rbd:
    monitors:
    - 10.85.8.118:6789
    - 10.85.8.123:6789
    - 10.85.8.124:6789
    pool: myPool
    image: image
    user: myPoolUser
    secretRef:
      name: ceph-user
    fsType: ext4
    readOnly: false
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: ceph-rbd-pvc
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 2Gi
---
apiVersion: v1
kind: Pod
metadata:
  name: ceph-rbd-pod-pvc-pv
spec:
  containers:
  - name: ceph-rbd-pod-pvc-pv
    image: busybox
    command: ["sleep", "infinity"]
    volumeMounts:
    - mountPath: /mnt/ceph_rbd
      name: volume
  volumes:
  - name: volume
    persistentVolumeClaim:
      claimName: ceph-rbd-pvc
EOF

kubectl apply -f ceph-rbd-pod-pvc-pv-allinone.yaml
kubectl get pv,pvc,pod
kubectl exec pod/ceph-rbd-pod-pvc-pv -- df -k | grep rbd

RBD in Storage-Klassen verwenden

Dieses Beispiel ist für die dynamische Bereitstellung. Der Ceph-CSI-Treiber wird benötigt.

# pod-pvc-sc
cat > ceph-rbd-pod-pvc-sc-allinone.yaml <<EOF
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: ceph-rbd-sc
  annotations:
    storageclass.kubernetes.io/is-default-class: "true"
provisioner: rbd.csi.ceph.com
parameters:
   clusterID: 79179d9d-98d8-4976-ab2e-58635caa7235
   pool: myPool
   imageFeatures: layering
   csi.storage.k8s.io/provisioner-secret-name: ceph-admin
   csi.storage.k8s.io/provisioner-secret-namespace: default
   csi.storage.k8s.io/controller-expand-secret-name: ceph-admin
   csi.storage.k8s.io/controller-expand-secret-namespace: default
   csi.storage.k8s.io/node-stage-secret-name: ceph-admin
   csi.storage.k8s.io/node-stage-secret-namespace: default
reclaimPolicy: Delete
allowVolumeExpansion: true
mountOptions:
   - discard
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: ceph-rbd-sc-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 2Gi
  storageClassName: ceph-rbd-sc
---
apiVersion: v1
kind: Pod
metadata:
  name: ceph-rbd-pod-pvc-sc
spec:
  containers:
  - name:  ceph-rbd-pod-pvc-sc
    image: busybox
    command: ["sleep", "infinity"]
    volumeMounts:
    - mountPath: /mnt/ceph_rbd
      name: volume
  volumes:
  - name: volume
    persistentVolumeClaim:
      claimName: ceph-rbd-sc-pvc
EOF

kubectl apply -f ceph-rbd-pod-pvc-sc-allinone.yaml
kubectl get pv,pvc,sc,pod
kubectl exec pod/ceph-rbd-pod-pvc-sc -- df -k | grep rbd

SUSE® Rancher Prime: RKE2 Server/Master-Bereitstellung

sudo su +
curl -sfL https://get.rke2.io | sh - +
systemctl enable -- \--now rke2-server

cat > /root/.bashrc << EOF
export PATH=$PATH:/var/lib/rancher/rke2/bin/
export KUBECONFIG=/etc/rancher/rke2/rke2.yaml
EOF

cat /var/lib/rancher/rke2/server/node-token
token: K10ca0c38d4ff90d8b80319ab34092e315a8b732622e6adf97bc9eb0536REDACTED::server:ec0308000b8a6b595da000efREDACTED

SUSE® Rancher Prime: RKE2 Agent/Worker-Bereitstellung

mkdir -p /etc/rancher/rke2/

cat > /etc/rancher/rke2/config.yaml << EOF
server: https://10.100.103.23:9345
token: K10ca0c38d4ff90d8b80319ab34092e315a8b732622e6adf97bc9eb0536REDACTED::server:ec0308000b8a6b595da000efREDACTED
EOF

curl -sfL https://get.rke2.io | INSTALL_RKE2_TYPE="agent" sh - +
systemctl enable -- \--now rke2-agent.service

Um den Cluster in Rancher zu importieren, klicken Sie auf ☰ > Clusterverwaltung. Gehen Sie dann auf die Seite Cluster und klicken Sie auf Bestehenden importieren. Führen Sie dann den bereitgestellten kubectl-Befehl auf dem Server/master-Knoten aus.

Getestete Versionen

Betriebssystem für die Ausführung von RKE2-Knoten: JeOS SLE15-SP2 mit installiertem kernel-default-5.3.18-24.49

kubectl version
Client Version: version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.4", GitCommit:"c96aede7b5205121079932896c4ad89bb93260af", GitTreeState:"clean", BuildDate:"2020-06-22T12:00:00Z", GoVersion:"go1.13.11", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"19", GitVersion:"v1.19.7+rke2r1", GitCommit:"1dd5338295409edcfff11505e7bb246f0d325d15", GitTreeState:"clean", BuildDate:"2021-01-20T01:50:52Z", GoVersion:"go1.15.5b5", Compiler:"gc", Platform:"linux/amd64"}

helm version
version.BuildInfo{Version:"3.4.1", GitCommit:"c4e74854886b2efe3321e185578e6db9be0a6e29", GitTreeState:"clean", GoVersion:"go1.14.12"}

Kubernetes-Version im RKE2-Cluster: v1.19.7+rke2r1

Fehlerbehebung

Falls Sie SUSEs ceph-rook basierend auf SES7 verwenden, kann es nützlich sein, die Monitore im hostNetwork freizugeben, indem Sie rook-1.4.5/ceph/cluster.yaml bearbeiten und spec.network.hostNetwork=true festlegen.

Auch für den Betrieb des ceph-rook-Clusters ist es nützlich, eine Toolbox auf dem Kubernetes-Cluster bereitzustellen, auf dem ceph-rook bereitgestellt wird, indem Sie kubectl apply -f rook-1.4.5/ceph/toolbox.yaml verwenden. Dann können alle ceph-bezogenen Befehle im Toolbox-Pod ausgeführt werden, zum Beispiel durch Ausführen von kubectl exec -it -n rook-ceph rook-ceph-tools-686d8b8bfb-2nvqp — bash.

Betrieb mit ceph - grundlegende Befehle:

ceph osd pool stats
ceph osd pool delete myPool myPool --yes-i-really-really-mean-it
rbd list -p myPool
> csi-vol-f5d3766c-7296-11eb-b32a-c2b045952d38
> image

Löschen Sie das Bild: rbd rm csi-vol-f5d3766c-7296-11eb-b32a-c2b045952d38 -p myPool

CephFS-Befehle in der Rook-Toolbox:

ceph -s
ceph fs ls
ceph fs fail cephfs
ceph fs rm cephfs --yes-i-really-mean-it
ceph osd pool delete cephfs_data cephfs_data --yes-i-really-really-mean-it
ceph osd pool delete cephfs_metadata cephfs_metadata --yes-i-really-really-mean-it

Um ein cephfs-Dateisystem vorzubereiten, können Sie diesen Befehl in einem Rook-Cluster ausführen:

kubectl apply -f rook-1.4.5/ceph/filesystem.yaml