Storage-Lösung: Xelon CSI

In diesem Artikel erhalten Sie einen Überblick über die Storage-Lösung Xelon CSI.

Intro

Der Xelon Container Storage Interface (CSI) ist eine von uns entwickelte Lösung, die es Cloud-Anbietern ermöglicht, sich nahtlos in den Kubernetes-Storage zu integrieren. Es bietet eine einfach zu bedienende Storage-Lösung für zustandsbehaftete Workloads in Kubernetes. Sie können den Quellcode und die neuesten Versionen auf GitHub finden: GitHub - Xelon

Dieser Dienst befindet sich derzeit im Early Access. Kontaktieren Sie uns, um Zugang zu beantragen.

Voraussetzungen

Alle notwendigen Konfigurationen sind auf Ihrem Xelon Kubernetes-Cluster vorinstalliert. Wenn Sie es jedoch vorziehen, Ihre eigene Kubernetes-Distribution in unserer Cloud auszuführen, können Sie den CSI für eine unkomplizierte Speicherlösung einrichten.

Bestandteile

Der Xelon CSI hat zwei Hauptkomponenten, die nachfolgend beschrieben werden. Darüber hinaus muss sich der Xelon CSI beim Xelon HQ mit Anmeldedaten authentifizieren, die im Secret: «xelon-api-credentials» im kube-System Namespace gespeichert sind.

Statefulset: xelon-csi-controller

Der Xelon CSI-Controller reagiert auf Ereignisse vom kube-apiserver, die sich auf Volumes beziehen. Er verwendet diese Metadaten, um Anweisungen an die HQ-Management-Plattform oder die xelon-csi-node-Komponente zu senden. Diese Anweisungen können Aktionen wie das Verschieben eines Datenträgers von einem Knoten zu einem anderen, das Ändern der Grösse eines Datenträgers, das Erstellen eines neuen Datenträgers und vieles mehr umfassen.

Daemonset: xelon-csi-node

Die Xelon CSI Node Komponente ist ein Container, der auf allen Worker-Knoten läuft und für das Einhängen von Volumes und andere wichtige Aufgaben zuständig ist. Er bindet nicht nur Volumes an die Knoten an, sondern verwaltet auch Vorgänge wie Grössenänderung, Erstellung und Löschung von Volumes. Ausserdem kommuniziert er mit der Xelon HQ-Plattform, um Befehle auszuführen und den Zustand der Volumes zu überwachen, um einen reibungslosen und zuverlässigen Speicherbetrieb innerhalb des Kubernetes-Clusters zu gewährleisten.

Wie wird die Xelon CSI verwendet?

1. Um sicherzustellen, dass «xelon-persistent-storage» in Ihrem Cluster verfügbar ist, führen Sie den folgenden Befehl aus: kubectl get storageclasses

2. Stellen Sie das folgende Manifest bereit:

kubectl apply -f <filename>

Hier ist das komplette Manifest: 

apiVersion: apps/v1
kind: Deployment
metadata:
  name: code-server
spec:
  replicas: 1
  strategy:
    type: Recreate
  selector:
    matchLabels:
      app: code-server
  template:
    metadata:
      labels:
        app: code-server
    spec:
      containers:
      - name: code-server
        image: lscr.io/linuxserver/code-server:latest
        env:
        - name: PUID
          value: "1000"
        - name: PGID
          value: "1000"
        - name: TZ
          value: "Europe/Zurich"
        - name: PASSWORD
          value: "password" #optional
        - name: SUDO_PASSWORD
          value: "sudopassword" #optional
        - name: DEFAULT_WORKSPACE
          value: "/config/workspace" #optional
        ports:
        - containerPort: 8443
          name: https
        volumeMounts:
        - mountPath: /config
          name: code-server-config
      restartPolicy: Always
      volumes:
      - name: code-server-config
        persistentVolumeClaim:
          claimName: code-server-pvc

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: code-server-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi
  storageClassName: "xelon-persistent-storage"

---
apiVersion: v1
kind: Service
metadata:
  name: code-server-service
spec:
  type: ClusterIP
  ports:
  - port: 8443
    targetPort: 8443
    protocol: TCP
    name: https
  selector:
    app: code-server

Dieses Manifest erstellt drei Ressourcen:

a. Deployment führt den Visual Studio Code-Server aus (über einen Webbrowser zugänglich) und ist ein Volume unter /config

b. PersistentVolumeClaim fordert ein 5Gi-Volume an, das von dem Xelon CSI erstellt wird, wenn es noch nicht vorhanden ist.

c. Der Service a ermöglicht den Zugriff auf den VS Code-Server. Leiten Sie den Service-Port an Ihren Rechner weiter mit:

kubectl port-forward svc/code-server-service 8443:8443

Sie können nun mit dem in den Umgebungsvariablen festgelegten Passwort auf die VS Code-Instanz unter http://localhost:8443 zugreifen.

So testen Sie die Datenträger-Migration

Hier finden Sie eine Schritt-für-Schritt-Anleitung, um sicherzustellen, dass Ihre Volumenmigration erfolgreich verläuft:

1. Erstellen Sie eine Datei in VS-Code:
  • Öffnen Sie die VS-Code-Instanz in Ihrem Browser unter http://localhost:8443.
  • Erstellen Sie eine neue Datei und fügen Sie einen Inhalt hinzu.

  • Speichern Sie die Datei, um sicherzustellen, dass sie auf dem dauerhaften Datenträger gespeichert wird.

2. Knoten entleeren:

  • Listen Sie die Pods und Ihre Knoten auf, um zu sehen, wo die VS-Code-Instanz ausgeführt wird:
    kubectl get pods -o wide
  • Entleeren Sie die Knoten, auf dem die VS Code-Instanz läuft:
    kubectl drain <node name> --delete-emptydir-data --ignore-daemonsets

3. Port-Forward erneut öffnen:

  • Da der Endpunkt migriert wird, müssen Sie das Port-Forwarding erneut einrichten:
    kubectl port-forward svc/code-server-service 8443:8443

4. Überprüfen Sie das Vorhandensein der Datei:

  • Greifen Sie erneut auf die VS-Code-Instanz zu unter http://localhost:8443 und überprüfen Sie, ob die zuvor erstellte Datei noch vorhanden ist. Dies zeigt an, dass das Volume erfolgreich migriert wurde.
5. Überprüfen Sie den Standort des Pods:
  • Überprüfen Sie, auf welchem Knoten der VS Code-Pod jetzt ausgeführt wird:
    kubectl uncordon <node name>

6. Heben Sie die Abgrenzung des zuvor entleerten Knotens auf:

  • Sobald die Migration bestätigt ist, können Sie den zuvor entleerten Knoten abkoppeln, um ihn wieder planbar zu machen:
    kubectl uncordon <node name>

Beschränkungen: Derzeit unterstützen Xelon CSI-Volumes nur den Zugriffsmodus «ReadWriteOnce». Das bedeutet, dass jedes Volume jeweils nur an einen Pod angeschlossen werden kann.