{"id":94739,"date":"2020-09-20T19:42:27","date_gmt":"2020-09-20T17:42:27","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/prakticheskij-primer-podklyucheniya-hranilishha-na-baze-ceph-v-klaster-kubernetes"},"modified":"2021-01-02T13:05:08","modified_gmt":"2021-01-02T11:05:08","slug":"prakticheskij-primer-podklyucheniya-hranilishha-na-baze-ceph-v-klaster-kubernetes","status":"publish","type":"post","link":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/prakticheskij-primer-podklyucheniya-hranilishha-na-baze-ceph-v-klaster-kubernetes","title":{"rendered":"Praktisches Beispiel f\u00fcr die Anbindung von Ceph-basiertem Speicher an ein Kubernetes-Cluster","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Container Storage Interface (CSI) ist eine einheitliche Schnittstelle f\u00fcr die Interaktion zwischen Kubernetes und Speichersystemen. Kurz gesagt haben wir bereits dar\u00fcber gesprochen, <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/southbridge\/blog\/519130\/\">\u00fcber<\/a><\/noindex>, und heute betrachten wir n\u00e4her die Kombination von CSI und Ceph: Wir zeigen, wie <noindex><a rel=\"nofollow\" href=\"http:\/\/to.slurm.io\/WkM2Eg\">Ceph-Speicher<\/a><\/noindex> mit dem Kubernetes-Cluster verbunden wird.<br \/>\nDer Artikel enth\u00e4lt reale, wenn auch etwas vereinfachte Beispiele zur leichteren Verst\u00e4ndlichkeit. Installation und Konfiguration von Ceph- und Kubernetes-Clustern werden nicht behandelt.<\/p>\n<p>Interessiert Sie, wie das funktioniert?<\/p>\n<p><img decoding=\"async\" alt=\"Praktisches Beispiel f\u00fcr die Anbindung von Ceph-basiertem Speicher an ein Kubernetes-Cluster\" src=\"\/wp-content\/uploads\/2020\/09\/db0a1d1e4c38c693f591057a219c141c.jpg\" style=\"display:block;margin: 0 auto;\"><\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Nun, Sie haben einen Kubernetes-Cluster bereitgestellt, zum Beispiel <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/kubernetes-sigs\/kubespray\">kubespray<\/a><\/noindex>. Daneben l\u00e4uft ein Ceph-Cluster, den Sie auch beispielsweise mit diesem <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/ceph\/ceph-ansible\">Playbook-Set<\/a><\/noindex>einrichten k\u00f6nnen. Ich hoffe, es muss nicht erw\u00e4hnt werden, dass zwischen ihnen f\u00fcr den Produktionsbetrieb ein Netzwerk mit einer Bandbreite von mindestens 10 Gbit\/s bestehen sollte.<\/p>\n<p>Wenn Sie das alles haben, legen wir los!<\/p>\n<p>Zuerst gehen wir zu einem der Knoten im Ceph-Cluster und \u00fcberpr\u00fcfen, ob alles in Ordnung ist:<\/p>\n<pre><code class=\"plaintext\">ceph health\nceph -s<\/code><\/pre>\n<p>Dann erstellen wir sofort einen Pool f\u00fcr RBD-Volumes:<\/p>\n<pre><code class=\"plaintext\">ceph osd pool create kube 32\nceph osd pool application enable kube rbd<\/code><\/pre>\n<p>Wechseln wir zum Kubernetes-Cluster. Dort installieren wir zun\u00e4chst den Ceph CSI-Treiber f\u00fcr RBD. Wir werden dies wie vorgesehen \u00fcber Helm installieren.<br \/>\nWir f\u00fcgen das Repository mit dem Chart hinzu und erhalten eine Menge von Variablen f\u00fcr das ceph-csi-rbd-Chart:<\/p>\n<pre><code class=\"plaintext\">helm repo add ceph-csi https:\/\/ceph.github.io\/csi-charts\nhelm inspect values ceph-csi\/ceph-csi-rbd &gt; cephrbd.yml<\/code><\/pre>\n<p>Jetzt m\u00fcssen wir die Datei cephrbd.yml ausf\u00fcllen. Dazu erfahren wir die ID des Clusters und die IP-Adressen der Monitore in Ceph:<\/p>\n<pre><code class=\"plaintext\">ceph fsid  # so erfahren wir den clusterID\nceph mon dump  # und hier sehen wir die IP-Adressen der Monitore<\/code><\/pre>\n<p>Die erhaltenen Werte tragen wir in die Datei cephrbd.yml ein. Nebenbei aktivieren wir die Erstellung von PSP (Pod Security Policies). Die Optionen in den Abschnitten <strong>nodeplugin<\/strong> und <strong>provisioner<\/strong> sind bereits in der Datei vorhanden und k\u00f6nnen wie unten gezeigt angepasst werden:<\/p>\n<pre><code class=\"plaintext\">csiConfig:\n  - clusterID: \"bcd0d202-fba8-4352-b25d-75c89258d5ab\"\n    monitors:\n      - \"v2:172.18.8.5:3300\/0,v1:172.18.8.5:6789\/0\"\n      - \"v2:172.18.8.6:3300\/0,v1:172.18.8.6:6789\/0\"\n      - \"v2:172.18.8.7:3300\/0,v1:172.18.8.7:6789\/0\"\n\nnodeplugin:\n  podSecurityPolicy:\n    enabled: true\n\nprovisioner:\n  podSecurityPolicy:\n    enabled: true<\/code><\/pre>\n<p>Als n\u00e4chstes bleibt uns nur noch, das Chart im Kubernetes-Cluster zu installieren.<\/p>\n<pre><code class=\"plaintext\">helm upgrade -i ceph-csi-rbd ceph-csi\/ceph-csi-rbd -f cephrbd.yml -n ceph-csi-rbd --create-namespace<\/code><\/pre>\n<p>Gro\u00dfartig, der RBD-Treiber funktioniert!<br \/>\nErstellen wir eine neue StorageClass in Kubernetes. Dazu m\u00fcssen wir wieder ein wenig mit Ceph arbeiten.<\/p>\n<p>Wir erstellen einen neuen Benutzer in Ceph und gew\u00e4hren ihm Schreibrechte im Pool <strong>kube<\/strong>:<\/p>\n<pre><code class=\"plaintext\">ceph auth get-or-create client.rbdkube mon 'profile rbd' osd 'profile rbd pool=kube'<\/code><\/pre>\n<p>Und jetzt sehen wir den Zugangsschl\u00fcssel dort ebenfalls:<\/p>\n<pre><code class=\"plaintext\">ceph auth get-key client.rbdkube<\/code><\/pre>\n<p>Der Befehl gibt etwa Folgendes aus:<\/p>\n<pre><code class=\"plaintext\">AQCO9NJbhYipKRAAMqZsnqqS\/T8OYQX20xIa9A==<\/code><\/pre>\n<p>Wir werden diesen Wert in das Secret im Kubernetes-Cluster eintragen \u2014 genau dort, wo er ben\u00f6tigt wird. <strong>userKey<\/strong>:<\/p>\n<pre><code class=\"plaintext\">---\napiVersion: v1\nkind: Secret\nmetadata:\n  name: csi-rbd-secret\n  namespace: ceph-csi-rbd\nstringData:\n  # Die Werte der Schl\u00fcssel entsprechen dem Benutzernamen und seinem Schl\u00fcssel, wie im\n  # Ceph-Cluster angegeben. Die Benutzer-ID muss Zugriff auf den Pool haben,\n  # der in der Storage Class angegeben ist.\n  userID: rbdkube\n  userKey:<\/code><\/pre>\n<p>Nun erstellen wir unser Secret:<\/p>\n<pre><code class=\"plaintext\">kubectl apply -f secret.yaml<\/code><\/pre>\n<p>Im Anschluss ben\u00f6tigen wir ein Manifest f\u00fcr die StorageClass in etwa folgender Form:<\/p>\n<pre><code class=\"plaintext\">---\napiVersion: storage.k8s.io\/v1\nkind: StorageClass\nmetadata:\n   name: csi-rbd-sc\nprovisioner: rbd.csi.ceph.com\nparameters:\n   clusterID: \n   pool: kube\n\n   imageFeatures: layering\n\n   # Diese Secrets m\u00fcssen die Anmeldedaten f\u00fcr den Zugriff\n   # auf Ihren Pool enthalten.\n   csi.storage.k8s.io\/provisioner-secret-name: csi-rbd-secret\n   csi.storage.k8s.io\/provisioner-secret-namespace: ceph-csi-rbd\n   csi.storage.k8s.io\/controller-expand-secret-name: csi-rbd-secret\n   csi.storage.k8s.io\/controller-expand-secret-namespace: ceph-csi-rbd\n   csi.storage.k8s.io\/node-stage-secret-name: csi-rbd-secret\n   csi.storage.k8s.io\/node-stage-secret-namespace: ceph-csi-rbd\n\n   csi.storage.k8s.io\/fstype: ext4\n\nreclaimPolicy: Delete\nallowVolumeExpansion: true\nmountOptions:\n  - discard<\/code><\/pre>\n<p>Muss ausgef\u00fcllt werden <strong>clusterID<\/strong>, den wir bereits mit dem Befehl <em>ceph fsid<\/em>, herausgefunden haben, und dieses Manifest im Kubernetes-Cluster anwenden:<\/p>\n<pre><code class=\"plaintext\">kubectl apply -f storageclass.yaml<\/code><\/pre>\n<p>Um die Funktionsweise der Cluster in Verbindung zu \u00fcberpr\u00fcfen, erstellen wir diesen PVC (Persistent Volume Claim):<\/p>\n<pre><code class=\"plaintext\">apiVersion: v1\nkind: PersistentVolumeClaim\nmetadata:\n  name: rbd-pvc\nspec:\n  accessModes:\n  - ReadWriteOnce\n  resources:\n    requests:\n      storage: 1Gi\n  storageClassName: csi-rbd-sc<\/code><\/pre>\n<p>Schauen wir uns gleich an, wie Kubernetes den angeforderten Volume in Ceph erstellt hat:<\/p>\n<pre><code class=\"plaintext\">kubectl get pvc\nkubectl get pv<\/code><\/pre>\n<p>Sieht gut aus! Und wie sieht es auf der Ceph-Seite aus?<br \/>\nWir holen die Liste der Volumes im Pool und sehen uns die Informationen zu unserem Volume an:<\/p>\n<pre><code class=\"plaintext\">rbd ls -p kube\nrbd -p kube info csi-vol-eb3d257d-8c6c-11ea-bff5-6235e7640653  # hier wird nat\u00fcrlich eine andere ID des Volumes angezeigt, die von der vorherigen Befehlsausgabe stammt<\/code><\/pre>\n<p>Jetzt schauen wir uns an, wie die Gr\u00f6\u00dfenanpassung des RBD-Volumes funktioniert.<br \/>\nWir \u00e4ndern die Gr\u00f6\u00dfe des Volumes in der Manifestdatei pvc.yaml auf 2Gi und wenden sie an:<\/p>\n<pre><code class=\"plaintext\">kubectl apply -f pvc.yaml<\/code><\/pre>\n<p>Warten wir, bis die \u00c4nderungen wirksam werden, und sehen uns die Gr\u00f6\u00dfe des Volumes erneut an.<\/p>\n<pre><code class=\"plaintext\">rbd -p kube info csi-vol-eb3d257d-8c6c-11ea-bff5-6235e7640653\n\nkubectl get pv\nkubectl get pvc<\/code><\/pre>\n<p>Wir sehen, dass sich die Gr\u00f6\u00dfe des PVC nicht ge\u00e4ndert hat. Um die Ursache herauszufinden, k\u00f6nnen wir Kubernetes um eine Beschreibung des PVC im YAML-Format bitten:<\/p>\n<pre><code class=\"plaintext\">kubectl get pvc rbd-pvc -o yaml<\/code><\/pre>\n<p>Und da ist das Problem:<\/p>\n<p><em>message: Warten auf den Nutzer, um einen Pod (neu) zu starten, um die Gr\u00f6\u00dfen\u00e4nderung des Dateisystems auf dem Volume auf dem Knoten abzuschlie\u00dfen. type: FileSystemResizePending<\/em><\/p>\n<p>Das bedeutet, dass das Laufwerk vergr\u00f6\u00dfert wurde, das Dateisystem darauf jedoch nicht.<br \/>\nUm das Dateisystem zu erweitern, muss das Volume eingeh\u00e4ngt werden. Unser erstelltes PVC\/PV wird derzeit jedoch nicht verwendet.<\/p>\n<p>Wir k\u00f6nnen einen Test-Pod wie folgt erstellen:<\/p>\n<pre><code class=\"plaintext\">---\napiVersion: v1\nkind: Pod\nmetadata:\n  name: csi-rbd-demo-pod\nspec:\n  containers:\n    - name: web-server\n      image: nginx:1.17.6\n      volumeMounts:\n        - name: mypvc\n          mountPath: \/data\n  volumes:\n    - name: mypvc\n      persistentVolumeClaim:\n        claimName: rbd-pvc\n        readOnly: false<\/code><\/pre>\n<p>Und jetzt schauen wir uns das PVC an:<\/p>\n<pre><code class=\"plaintext\">kubectl get pvc<\/code><\/pre>\n<p>Die Gr\u00f6\u00dfe hat sich ge\u00e4ndert, alles in Ordnung.<\/p>\n<p>Im ersten Teil haben wir mit einem RBD-Blockger\u00e4t gearbeitet (es steht f\u00fcr Rados Block Device), aber das ist nicht m\u00f6glich, wenn verschiedene Mikrodienste gleichzeitig auf diese Festplatte zugreifen m\u00fcssen. F\u00fcr die Arbeit mit Dateien, und nicht mit einem Abbild der Festplatte, ist CephFS viel besser geeignet.<br \/>\nAm Beispiel von Ceph-Clustern und Kubernetes richten wir CSI und die anderen notwendigen Entit\u00e4ten f\u00fcr die Arbeit mit CephFS ein.<\/p>\n<p>Wir holen uns die Werte aus dem ben\u00f6tigten neuen Helm-Chart:<\/p>\n<pre><code class=\"plaintext\">helm inspect values ceph-csi\/ceph-csi-cephfs &gt; cephfs.yml<\/code><\/pre>\n<p>Wieder m\u00fcssen wir die Datei cephfs.yml ausf\u00fcllen. Wie zuvor helfen die Ceph-Kommandos dabei:<\/p>\n<pre><code class=\"plaintext\">ceph fsid\nceph mon dump<\/code><\/pre>\n<p>Wir f\u00fcllen die Datei mit Werten ungef\u00e4hr so aus:<\/p>\n<pre><code class=\"plaintext\">csiConfig:\n  - clusterID: \"bcd0d202-fba8-4352-b25d-75c89258d5ab\"\n    monitors:\n      - \"172.18.8.5:6789\"\n      - \"172.18.8.6:6789\"\n      - \"172.18.8.7:6789\"\n\nnodeplugin:\n  httpMetrics:\n    enabled: true\n    containerPort: 8091\n  podSecurityPolicy:\n    enabled: true\n\nprovisioner:\n  replicaCount: 1\n  podSecurityPolicy:\n    enabled: true<\/code><\/pre>\n<p>Bitte beachten Sie, dass die Adressen der Monitore in einfacher Form address:port angegeben werden. F\u00fcr das Montieren von cephfs auf dem Knoten werden diese Adressen an das Kernelmodul \u00fcbergeben, das noch nicht mit dem Protokoll der v2-Monitore arbeiten kann.<br \/>\nWir \u00e4ndern den Port f\u00fcr httpMetrics (dorthin wird Prometheus f\u00fcr die Monitoring-Metriken gehen), damit er nicht mit dem nginx-proxy in Konflikt ger\u00e4t, der von Kubespray installiert wird. M\u00f6glicherweise ben\u00f6tigen Sie das nicht.<\/p>\n<p>Wir installieren das Helm-Chart im Kubernetes-Cluster:<\/p>\n<pre><code class=\"plaintext\">helm upgrade -i ceph-csi-cephfs ceph-csi\/ceph-csi-cephfs -f cephfs.yml -n ceph-csi-cephfs --create-namespace<\/code><\/pre>\n<p>Wir wechseln zu dem Ceph-Datenspeicher, um dort einen neuen Benutzer zu erstellen. In der Dokumentation steht, dass der Provisioner f\u00fcr CephFS Administratorrechte im Cluster ben\u00f6tigt. Aber wir werden einen separaten Benutzer mit eingeschr\u00e4nkten Rechten erstellen: <em>fs<\/em> ceph auth get-or-create client.fs mon 'allow r' mgr 'allow rw' mds 'allow rws' osd 'allow rw pool=cephfs_data, allow rw pool=cephfs_metadata'<\/p>\n<pre><code class=\"plaintext\">Und sofort sehen wir seinen Zugriffsschl\u00fcssel, der uns sp\u00e4ter n\u00fctzlich sein wird:<\/code><\/pre>\n<p>ceph auth get-key client.fs<\/p>\n<pre><code class=\"plaintext\">Wir erstellen separate Secrets und eine StorageClass.<\/code><\/pre>\n<p>Nichts Neues, das haben wir bereits am Beispiel von RBD gesehen:<br \/>\nNichts Neues, das haben wir bereits am Beispiel RBD gesehen:<\/p>\n<pre><code class=\"plaintext\">---\napiVersion: v1\nkind: Secret\nmetadata:\n  name: csi-cephfs-secret\n  namespace: ceph-csi-cephfs\nstringData:\n  # Erforderlich f\u00fcr dynamisch erstellte Volumes\n  adminID: fs\n  adminKey:<\/code><\/pre>\n<p>Wir wenden das Manifest an:<\/p>\n<pre><code class=\"plaintext\">kubectl apply -f secret.yaml<\/code><\/pre>\n<p>Und jetzt \u2013 eine separate StorageClass:<\/p>\n<pre><code class=\"plaintext\">---\napiVersion: storage.k8s.io\/v1\nkind: StorageClass\nmetadata:\n  name: csi-cephfs-sc\nprovisioner: cephfs.csi.ceph.com\nparameters:\n  clusterID: \n\n  # Name des CephFS-Dateisystems, in dem der Volume erstellt wird\n  fsName: cephfs\n\n  # (optional) Ceph-Pool, in dem die Volumendaten gespeichert werden\n  # pool: cephfs_data\n\n  # (optional) Durch Kommas getrennte Mount-Optionen f\u00fcr Ceph-fuse\n  # zum Beispiel:\n  # fuseMountOptions: debug\n\n  # (optional) Durch Kommas getrennte Mount-Optionen f\u00fcr CephFS im Kernel\n  # Siehe man mount.ceph f\u00fcr eine Liste dieser Optionen. Zum Beispiel:\n  # kernelMountOptions: readdir_max_bytes=1048576,norbytes\n\n  # Die Secrets sollten Berechtigungen f\u00fcr Admin und\/oder Ceph-Nutzer enthalten.\n  csi.storage.k8s.io\/provisioner-secret-name: csi-cephfs-secret\n  csi.storage.k8s.io\/provisioner-secret-namespace: ceph-csi-cephfs\n  csi.storage.k8s.io\/controller-expand-secret-name: csi-cephfs-secret\n  csi.storage.k8s.io\/controller-expand-secret-namespace: ceph-csi-cephfs\n  csi.storage.k8s.io\/node-stage-secret-name: csi-cephfs-secret\n  csi.storage.k8s.io\/node-stage-secret-namespace: ceph-csi-cephfs\n\n  # (optional) Der Treiber kann entweder ceph-fuse (fuse) oder ceph kernelclient (kernel) verwenden.\n  # Wenn nicht angegeben, wird das Standard-Mount verwendet,\n  # dies wird durch die Suche nach ceph-fuse und mount.ceph bestimmt\n  # mounter: kernel\nreclaimPolicy: Delete\nallowVolumeExpansion: true\nmountOptions:\n  - debug<\/code><\/pre>\n<p>F\u00fcllen wir das hier aus <strong>clusterID<\/strong> und wenden es in Kubernetes an:<\/p>\n<pre><code class=\"plaintext\">kubectl apply -f storageclass.yaml<\/code><\/pre>\n<h2 id=\"proverka\">\u00dcberpr\u00fcfung<\/h2>\n<p>Um zu \u00fcberpr\u00fcfen, wie im vorherigen Beispiel, erstellen wir PVC:<\/p>\n<pre><code class=\"plaintext\">---\napiVersion: v1\nkind: PersistentVolumeClaim\nmetadata:\n  name: csi-cephfs-pvc\nspec:\n  accessModes:\n    - ReadWriteMany\n  resources:\n    requests:\n      storage: 5Gi\n  storageClassName: csi-cephfs-sc<\/code><\/pre>\n<p>Und \u00fcberpr\u00fcfen wir das Vorhandensein von PVC\/PV:<\/p>\n<pre><code class=\"plaintext\">kubectl get pvc\nkubectl get pv<\/code><\/pre>\n<p>Wenn Sie die Dateien und Verzeichnisse in CephFS ansehen m\u00f6chten, k\u00f6nnen Sie dieses Dateisystem irgendwo einbinden. Zum Beispiel wie unten gezeigt.<\/p>\n<p>Gehen wir zu einem der Knoten im Ceph-Cluster und f\u00fchren wir die folgenden Schritte aus:<\/p>\n<pre><code class=\"plaintext\"># \u0422\u043e\u0447\u043a\u0430 \u043c\u043e\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f\nmkdir -p \/mnt\/cephfs\n\n# \u0421\u043e\u0437\u0434\u0430\u0451\u043c \u0444\u0430\u0439\u043b \u0441 \u043a\u043b\u044e\u0447\u043e\u043c \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0430\nceph auth get-key client.admin &gt;\/etc\/ceph\/secret.key\n\n# \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u043f\u0438\u0441\u044c \u0432 \/etc\/fstab\n# !! \u0418\u0437\u043c\u0435\u043d\u044f\u0435\u043c ip \u0430\u0434\u0440\u0435\u0441 \u043d\u0430 \u0430\u0434\u0440\u0435\u0441 \u043d\u0430\u0448\u0435\u0433\u043e \u0443\u0437\u043b\u0430\necho \"172.18.8.6:6789:\/ \/mnt\/cephfs ceph name=admin,secretfile=\/etc\/ceph\/secret.key,noatime,_netdev    0       2\" &gt;&gt; \/etc\/fstab\n\nmount \/mnt\/cephfs<\/code><\/pre>\n<p>Nat\u00fcrlich ist ein solches Einh\u00e4ngen des FS auf einem Ceph-Knoten ausschlie\u00dflich f\u00fcr Ausbildungszwecke geeignet, was wir in unseren <noindex><a rel=\"nofollow\" href=\"http:\/\/slurm.io\">Slurm-Kursen<\/a><\/noindex>. Ich denke nicht, dass jemand dies in der Produktion tun w\u00fcrde; das Risiko, wichtige Dateien versehentlich zu \u00fcberschreiben, ist gro\u00df.<\/p>\n<p>Zu guter Letzt lassen Sie uns \u00fcberpr\u00fcfen, wie es bei CephFS mit der Gr\u00f6\u00dfen\u00e4nderung des Volumes aussieht. Wir kehren zu Kubernetes zur\u00fcck und bearbeiten unser Manifest f\u00fcr PVC \u2013 wir erh\u00f6hen die Gr\u00f6\u00dfe zum Beispiel auf 7Gi.<\/p>\n<p>Wenden wir die bearbeitete Datei an:<\/p>\n<pre><code class=\"plaintext\">kubectl apply -f pvc.yaml<\/code><\/pre>\n<p>Sehen wir uns im eingebundenen Verzeichnis an, wie sich das Kontingent ge\u00e4ndert hat:<\/p>\n<pre><code class=\"plaintext\">getfattr -n ceph.quota.max_bytes<\/code><\/pre>\n<p>F\u00fcr die Ausf\u00fchrung dieses Befehls m\u00fcssen Sie m\u00f6glicherweise das Paket in das System installieren <strong>attr<\/strong>.<\/p>\n<h2 id=\"glaza-boyatsya-a-ruki-delayut\">Die Augen haben Angst, aber die H\u00e4nde handeln<\/h2>\n<p>Auf den ersten Blick erscheinen all diese Befehle und langen YAML-Manifeste kompliziert, aber in der Praxis kommen die Slyrm-Studenten recht schnell damit zurecht.<br \/>\nIn diesem Artikel gehen wir nicht in die Tiefe \u2014 daf\u00fcr gibt es die offizielle Dokumentation. Wenn Sie sich f\u00fcr die Details der Ceph-Speicherintegration mit einem Kubernetes-Cluster interessieren, helfen Ihnen diese Links:<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/kubernetes.io\/docs\/concepts\/storage\/volumes\/\">Allgemeine Prinzipien von Kubernetes mit Volumes<\/a><\/noindex><br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/ceph.readthedocs.io\/en\/latest\/rbd\/\">Dokumentation zu RBD<\/a><\/noindex><br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/docs.ceph.com\/docs\/master\/rbd\/rbd-kubernetes\/\">Integration von RBD und Kubernetes aus der Perspektive von Ceph<\/a><\/noindex><br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/ceph\/ceph-csi\/blob\/master\/docs\/deploy-rbd.md\">Integration von RBD und Kubernetes aus der Perspektive von CSI<\/a><\/noindex><br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/ceph.readthedocs.io\/en\/latest\/cephfs\/\">Allgemeine Dokumentation zu CephFS<\/a><\/noindex><br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/ceph\/ceph-csi\/blob\/master\/docs\/deploy-cephfs.md\">Integration von CephFS und Kubernetes aus der Perspektive von CSI<\/a><\/noindex><\/p>\n<p>Im Slyrm-Kurs <noindex><a rel=\"nofollow\" href=\"http:\/\/to.slurm.io\/6p9lng\">Kubernetes Basis<\/a><\/noindex> k\u00f6nnen Sie noch einen Schritt weiter gehen und eine echte Anwendung in Kubernetes bereitstellen, die CephFS als Dateispeicher nutzt. \u00dcber GET\/POST-Anfragen k\u00f6nnen Sie Dateien \u00fcbertragen und aus Ceph abrufen.<\/p>\n<p>Wenn Sie mehr an der Datenspeicherung interessiert sind, melden Sie sich f\u00fcr den <noindex><a rel=\"nofollow\" href=\"http:\/\/to.slurm.io\/WkM2Eg\">neuen Ceph-Kurs<\/a><\/noindex>an. W\u00e4hrend der Beta-Testphase kann der Kurs zu einem erm\u00e4\u00dfigten Preis erlangt werden und Sie k\u00f6nnen Einfluss auf dessen Inhalt nehmen.<\/p>\n<p><em>Autor des Artikels: Alexander Shvalov, praktizierender Ingenieur <noindex><a rel=\"nofollow\" href=\"http:\/\/to.slurm.io\/ophLww\">Southbridge<\/a><\/noindex>, Certified Kubernetes Administrator, Autor und Entwickler der Slyrm-Kurse.<\/em><\/p>\n<p>Quelle: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/southbridge\/blog\/519642\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>Container Storage Interface (CSI) \u2014 \u044d\u0442\u043e \u0443\u043d\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f Kubernetes \u0438 \u0441\u0438\u0441\u0442\u0435\u043c \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043a\u0440\u0430\u0442\u0446\u0435 \u043e \u043d\u0451\u043c \u043c\u044b \u0443\u0436\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u043b\u0438, \u0430 \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0441\u0432\u044f\u0437\u043a\u0443 CSI \u0438 Ceph: \u043f\u043e\u043a\u0430\u0436\u0435\u043c, \u043a\u0430\u043a \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 Ceph \u043a \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0443 Kubernetes. \u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u044b \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0435, \u0445\u043e\u0442\u044f \u0438 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0443\u043f\u0440\u043e\u0449\u0451\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u0432\u043e\u0441\u043f\u0440\u0438\u044f\u0442\u0438\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u044b. \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0443 \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0443 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043e\u0432 Ceph \u0438 Kubernetes [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":94740,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-94739","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 4.9.10 - aioseo.com -->\n\t<meta name=\"description\" content=\"Container Storage Interface (CSI) \u2014 \u044d\u0442\u043e \u0443\u043d\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f Kubernetes \u0438 \u0441\u0438\u0441\u0442\u0435\u043c \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043a\u0440\u0430\u0442\u0446\u0435 \u043e \u043d\u0451\u043c \u043c\u044b \u0443\u0436\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u043b\u0438, \u0430 \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0441\u0432\u044f\u0437\u043a\u0443 CSI \u0438 Ceph: \u043f\u043e\u043a\u0430\u0436\u0435\u043c, \u043a\u0430\u043a \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 Ceph \u043a \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0443 Kubernetes. \u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u044b \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0435, \u0445\u043e\u0442\u044f \u0438 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0443\u043f\u0440\u043e\u0449\u0451\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u0432\u043e\u0441\u043f\u0440\u0438\u044f\u0442\u0438\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u044b. \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0443 \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0443 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043e\u0432 Ceph \u0438 Kubernetes\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/prakticheskij-primer-podklyucheniya-hranilishha-na-baze-ceph-v-klaster-kubernetes\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.10\" \/>\n\t\t<meta property=\"og:locale\" content=\"de_DE\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 \u043d\u0430 \u0431\u0430\u0437\u0435 Ceph \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 Kubernetes | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"Container Storage Interface (CSI) \u2014 \u044d\u0442\u043e \u0443\u043d\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f Kubernetes \u0438 \u0441\u0438\u0441\u0442\u0435\u043c \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043a\u0440\u0430\u0442\u0446\u0435 \u043e \u043d\u0451\u043c \u043c\u044b \u0443\u0436\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u043b\u0438, \u0430 \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0441\u0432\u044f\u0437\u043a\u0443 CSI \u0438 Ceph: \u043f\u043e\u043a\u0430\u0436\u0435\u043c, \u043a\u0430\u043a \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 Ceph \u043a \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0443 Kubernetes. \u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u044b \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0435, \u0445\u043e\u0442\u044f \u0438 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0443\u043f\u0440\u043e\u0449\u0451\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u0432\u043e\u0441\u043f\u0440\u0438\u044f\u0442\u0438\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u044b. \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0443 \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0443 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043e\u0432 Ceph \u0438 Kubernetes\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/prakticheskij-primer-podklyucheniya-hranilishha-na-baze-ceph-v-klaster-kubernetes\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-09-20T17:42:27+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2021-01-02T11:05:08+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47 Praktisches Beispiel f\u00fcr die Anbindung von Ceph-Speicher an ein Kubernetes-Cluster | ProHoster","description":"Container Storage Interface (CSI) \u2014 ist eine einheitliche Schnittstelle f\u00fcr die Interaktion zwischen Kubernetes und Speichersystemen. Wir haben bereits kurz dar\u00fcber gesprochen, und heute werden wir die Verbindung zwischen CSI und Ceph genauer betrachten: Wir zeigen, wie man Ceph-Speicher an ein Kubernetes-Cluster anschlie\u00dft. Der Artikel enth\u00e4lt reale, wenn auch etwas vereinfachte Beispiele zur besseren Verst\u00e4ndlichkeit. Installation und Konfiguration von Ceph- und Kubernetes-Clustern.","canonical_url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/prakticheskij-primer-podklyucheniya-hranilishha-na-baze-ceph-v-klaster-kubernetes","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"de_DE","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 \u043d\u0430 \u0431\u0430\u0437\u0435 Ceph \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 Kubernetes | ProHoster","og:description":"Container Storage Interface (CSI) \u2014 \u044d\u0442\u043e \u0443\u043d\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f Kubernetes \u0438 \u0441\u0438\u0441\u0442\u0435\u043c \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043a\u0440\u0430\u0442\u0446\u0435 \u043e \u043d\u0451\u043c \u043c\u044b \u0443\u0436\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u043b\u0438, \u0430 \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0441\u0432\u044f\u0437\u043a\u0443 CSI \u0438 Ceph: \u043f\u043e\u043a\u0430\u0436\u0435\u043c, \u043a\u0430\u043a \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 Ceph \u043a \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0443 Kubernetes. \u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u044b \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0435, \u0445\u043e\u0442\u044f \u0438 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0443\u043f\u0440\u043e\u0449\u0451\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u0432\u043e\u0441\u043f\u0440\u0438\u044f\u0442\u0438\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u044b. \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0443 \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0443 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043e\u0432 Ceph \u0438 Kubernetes","og:url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/prakticheskij-primer-podklyucheniya-hranilishha-na-baze-ceph-v-klaster-kubernetes","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-09-20T17:42:27+00:00","article:modified_time":"2021-01-02T11:05:08+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"94739","title":null,"description":"","keywords":"","keyphrases":null,"primary_term":null,"canonical_url":"","og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 11:19:21","updated":"2022-09-30 10:03:10"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/94739","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/comments?post=94739"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/94739\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media\/94740"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=94739"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=94739"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=94739"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}