{"id":3031,"date":"2021-01-05T11:48:03","date_gmt":"2021-01-05T15:48:03","guid":{"rendered":"http:\/\/arielantigua.com\/weblog\/?p=3031"},"modified":"2021-01-05T11:48:04","modified_gmt":"2021-01-05T15:48:04","slug":"kubernetes-respaldando-un-cluster-de-k8s-con-kasten-k10","status":"publish","type":"post","link":"https:\/\/arielantigua.com\/weblog\/2021\/01\/kubernetes-respaldando-un-cluster-de-k8s-con-kasten-k10\/","title":{"rendered":"Kubernetes \u2013 Respaldando un cluster de k8s con Kasten K10."},"content":{"rendered":"<p>Kubernetes \u2013 Respaldando un cluster de k8s con Kasten K10.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" width=\"600\" height=\"600\" class=\"wp-image-3032\" src=\"https:\/\/arielantigua.com\/weblog\/wp-content\/uploads\/2021\/01\/word-image.png\" srcset=\"https:\/\/arielantigua.com\/weblog\/wp-content\/uploads\/2021\/01\/word-image.png 600w, https:\/\/arielantigua.com\/weblog\/wp-content\/uploads\/2021\/01\/word-image-300x300.png 300w, https:\/\/arielantigua.com\/weblog\/wp-content\/uploads\/2021\/01\/word-image-150x150.png 150w, https:\/\/arielantigua.com\/weblog\/wp-content\/uploads\/2021\/01\/word-image-70x70.png 70w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/p>\n<p>Kasten K10 es una soluci\u00f3n de respaldos para Kubernetes, ya he tocado el tema de los respaldos en dos ocasiones con dos herramientas diferentes, K10 tiene ventajas muy claras en frente a los respaldos de Longhorn o Velero.<\/p>\n<p>El primer punto a favor que tiene la herramienta es la facilidad con la que se instala, sin embargo, K10 hace uso de funcionalidades que no vienen h\u00e1biles por defecto y tenemos que aplicar CRDs al cluster. K10 se apoya de VolumeSnapshot de Kubernetes que hasta hace varias versiones era Beta y que aun en versi\u00f3n 1.19 se deben agregar de manera manual algunos CRD.<\/p>\n<p>Otro punto a tener en cuenta es que la soluci\u00f3n de almacenamiento habilitada en k8s debe soportar el CSI de snapshots. En mi ambiente de \u201cproducci\u00f3n\u201d estoy usando Longhorn 1.0.2 y esta opci\u00f3n solo est\u00e1 disponible para la versi\u00f3n 1.1.0, esto quiere decir que la instalaci\u00f3n descrita en este art\u00edculo fue hecha en un cluster para estos fines ya que por circunstancias ajenas aun no puedo actualizar Longhorn a la \u00faltima versi\u00f3n.<\/p>\n<p><!--more--><\/p>\n<p><strong>Que tiene de impresionante K10?<\/strong><\/p>\n<p>Lo primero es su versi\u00f3n free que soporta hasta 10 nodos de Kuberentes, sin importar la cantidad de data o deployments que este cluster contenga, podr\u00e1s hacer respaldos tanto de la data como de las definiciones, configmaps y secrets.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" width=\"1049\" height=\"390\" class=\"wp-image-3033\" src=\"https:\/\/arielantigua.com\/weblog\/wp-content\/uploads\/2021\/01\/word-image-1.png\" srcset=\"https:\/\/arielantigua.com\/weblog\/wp-content\/uploads\/2021\/01\/word-image-1.png 1049w, https:\/\/arielantigua.com\/weblog\/wp-content\/uploads\/2021\/01\/word-image-1-300x112.png 300w, https:\/\/arielantigua.com\/weblog\/wp-content\/uploads\/2021\/01\/word-image-1-1024x381.png 1024w, https:\/\/arielantigua.com\/weblog\/wp-content\/uploads\/2021\/01\/word-image-1-768x286.png 768w\" sizes=\"auto, (max-width: 1049px) 100vw, 1049px\" \/><\/p>\n<p>Actualmente hago uso de los snapshot\/backups de Longhorn a Minio, estos respaldos no son administrados por k8s y no sabe que existen, a su vez para poder hacer respaldos de la otra informaci\u00f3n en el cluster uso Velero, son dos herramientas con conocimiento muy diferente que se deben administrar para lograr lo que ahora lograre hacer con solo K10.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" width=\"1716\" height=\"1044\" class=\"wp-image-3034\" src=\"https:\/\/arielantigua.com\/weblog\/wp-content\/uploads\/2021\/01\/word-image-2.png\" srcset=\"https:\/\/arielantigua.com\/weblog\/wp-content\/uploads\/2021\/01\/word-image-2.png 1716w, https:\/\/arielantigua.com\/weblog\/wp-content\/uploads\/2021\/01\/word-image-2-300x183.png 300w, https:\/\/arielantigua.com\/weblog\/wp-content\/uploads\/2021\/01\/word-image-2-1024x623.png 1024w, https:\/\/arielantigua.com\/weblog\/wp-content\/uploads\/2021\/01\/word-image-2-768x467.png 768w, https:\/\/arielantigua.com\/weblog\/wp-content\/uploads\/2021\/01\/word-image-2-1536x934.png 1536w\" sizes=\"auto, (max-width: 1716px) 100vw, 1716px\" \/><\/p>\n<p><strong>Prerequisitos<\/strong>.<\/p>\n<p>kubectl<\/p>\n<p>helm<\/p>\n<p><strong>Instalando<\/strong>.<\/p>\n<p>Para instalar K10 primero debemos tener Kubectl y Helm disponibles para ejecutar, luego agregamos el repo que contiene los Charts a nuestro repositorio local de helm, creamos un namespaces y lanzamos la instalaci\u00f3n en ese namespace, listo.<\/p>\n<p>As\u00ed de f\u00e1cil! ??<\/p>\n<p><strong>No, en mi caso no fue as\u00ed.<\/strong><\/p>\n<p>Lo mejor es seguir las recomendaciones y nos libraremos de muchos dolores de cabeza y troubleshooting cuando veamos que nuestros respaldos siempre fallan diciendo que no se puede hacer un snapshot.<\/p>\n<p><a href=\"https:\/\/docs.kasten.io\/latest\/install\/requirements.html#install-prereqs\">https:\/\/docs.kasten.io\/latest\/install\/requirements.html#install-prereqs<\/a><\/p>\n<p>Debemos ejecutar un script bash, siempre tener en cuenta que al momento de ejecutar scripts bash desde Internet, existe la posibilidad de comprometer el servidor donde se est\u00e1 ejecutando dicho script. Dicho esto:<\/p>\n<p>curl https:\/\/docs.kasten.io\/tools\/k10_primer.sh | bash<\/p>\n<p>El script revisa que las herramientas necesarias est\u00e1n disponibles, en este caso kubectl y helm, revisa que hallamos agregado el repositorio a helm, descarga un contenedor el cual ser\u00e1 ejecutado en el cluster y este se asegurara que dicho cluster cumple con los requisitos.<\/p>\n<p>En el mejor de los casos tendremos mensajes con un OK de color verde al final, pero como pueden ver en esta imagen tenemos dos errores, estos son relacionados con las capacidades de CSI (no existe un CRD para VolumeSnapshot) y no tenemos un VolumeSnapshotClass disponible y asociado al driver de Longhorn.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" width=\"865\" height=\"730\" class=\"wp-image-3035\" src=\"https:\/\/arielantigua.com\/weblog\/wp-content\/uploads\/2021\/01\/word-image-3.png\" srcset=\"https:\/\/arielantigua.com\/weblog\/wp-content\/uploads\/2021\/01\/word-image-3.png 865w, https:\/\/arielantigua.com\/weblog\/wp-content\/uploads\/2021\/01\/word-image-3-300x253.png 300w, https:\/\/arielantigua.com\/weblog\/wp-content\/uploads\/2021\/01\/word-image-3-768x648.png 768w\" sizes=\"auto, (max-width: 865px) 100vw, 865px\" \/><\/p>\n<p>Estos errores son debido a que nos saltamos la instalaci\u00f3n de los CRD antes mencionados, esto fue lo que me paso en mi cluster de \u201cproducci\u00f3n\u201d y luego de investigar m\u00e1s a fondo y entender que no contaba con VolumeSnapshot ni nada parecido, por esta raz\u00f3n no pod\u00eda hacer ning\u00fan respaldo.<\/p>\n<p><strong>RTFM \u2013 as\u00ed dicen.<\/strong><\/p>\n<p>Despu\u00e9s de invertir un buen rato en kubernetes.io, la documentaci\u00f3n de Longhorn y la documentaci\u00f3n de K10, descubr\u00ed que faltaban varios componentes.<\/p>\n<p>1 \u2013 CRDs de VolumeSnaphiot y VolumeSnapshotContent<\/p>\n<p>2 \u2013 La versi\u00f3n de longhorn instalada no cuenta con la implementaci\u00f3n de csi-snapshotter.<\/p>\n<p>3 \u2013 Crear un VolumeSnapshotClass con la anotaci\u00f3n de k10.<\/p>\n<p>Al terminar la evaluaci\u00f3n de todos los cambios que ten\u00eda que realizar y al ser mi cluster de producci\u00f3n, decid\u00ed crear un nuevo cluster desde Rancher UI y su integraci\u00f3n a vSphere.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" width=\"1318\" height=\"532\" class=\"wp-image-3036\" src=\"https:\/\/arielantigua.com\/weblog\/wp-content\/uploads\/2021\/01\/word-image-4.png\" srcset=\"https:\/\/arielantigua.com\/weblog\/wp-content\/uploads\/2021\/01\/word-image-4.png 1318w, https:\/\/arielantigua.com\/weblog\/wp-content\/uploads\/2021\/01\/word-image-4-300x121.png 300w, https:\/\/arielantigua.com\/weblog\/wp-content\/uploads\/2021\/01\/word-image-4-1024x413.png 1024w, https:\/\/arielantigua.com\/weblog\/wp-content\/uploads\/2021\/01\/word-image-4-768x310.png 768w\" sizes=\"auto, (max-width: 1318px) 100vw, 1318px\" \/><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" width=\"1599\" height=\"699\" class=\"wp-image-3037\" src=\"https:\/\/arielantigua.com\/weblog\/wp-content\/uploads\/2021\/01\/word-image-5.png\" srcset=\"https:\/\/arielantigua.com\/weblog\/wp-content\/uploads\/2021\/01\/word-image-5.png 1599w, https:\/\/arielantigua.com\/weblog\/wp-content\/uploads\/2021\/01\/word-image-5-300x131.png 300w, https:\/\/arielantigua.com\/weblog\/wp-content\/uploads\/2021\/01\/word-image-5-1024x448.png 1024w, https:\/\/arielantigua.com\/weblog\/wp-content\/uploads\/2021\/01\/word-image-5-768x336.png 768w, https:\/\/arielantigua.com\/weblog\/wp-content\/uploads\/2021\/01\/word-image-5-1536x671.png 1536w\" sizes=\"auto, (max-width: 1599px) 100vw, 1599px\" \/><\/p>\n<p>Luego de solicitar la creaci\u00f3n de un nuevo cluster de Kubernetes (RKE) en vSphere procedemos a copiar el kubeconfig desde el portal de Rancher y cargarlo en KUBECONFIG.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" width=\"786\" height=\"206\" class=\"wp-image-3038\" src=\"https:\/\/arielantigua.com\/weblog\/wp-content\/uploads\/2021\/01\/word-image-6.png\" srcset=\"https:\/\/arielantigua.com\/weblog\/wp-content\/uploads\/2021\/01\/word-image-6.png 786w, https:\/\/arielantigua.com\/weblog\/wp-content\/uploads\/2021\/01\/word-image-6-300x79.png 300w, https:\/\/arielantigua.com\/weblog\/wp-content\/uploads\/2021\/01\/word-image-6-768x201.png 768w\" sizes=\"auto, (max-width: 786px) 100vw, 786px\" \/><\/p>\n<p>Ahora procedemos a crear los nuevos recursos en forma de CRD, los pasos est\u00e1n muy bien detallados en la p\u00e1gina de Kubernetes-CSI en GitHub: <a href=\"https:\/\/kubernetes-csi.github.io\/docs\/snapshot-controller.html\">https:\/\/kubernetes-csi.github.io\/docs\/snapshot-controller.html<\/a><\/p>\n<p>CRDs \u2013 esto debe realizar en todos los cluster que queramos tener snapshots.<\/p>\n<pre>kubectl create -f https:\/\/raw.githubusercontent.com\/kubernetes-csi\/external-snapshotter\/release-2.0\/config\/crd\/snapshot.storage.k8s.io_volumesnapshotclasses.yaml\n\nkubectl create -f https:\/\/raw.githubusercontent.com\/kubernetes-csi\/external-snapshotter\/release-2.0\/config\/crd\/snapshot.storage.k8s.io_volumesnapshotcontents.yaml\n\nkubectl create -f https:\/\/raw.githubusercontent.com\/kubernetes-csi\/external-snapshotter\/release-2.0\/config\/crd\/snapshot.storage.k8s.io_volumesnapshots.yaml<\/pre>\n<p>Snapshot Controller \u2013 al igual que el CRD, se debe realizar en todos los cluster.<\/p>\n<pre>kubectl apply -f https:\/\/raw.githubusercontent.com\/kubernetes-csi\/external-snapshotter\/release-2.0\/deploy\/kubernetes\/snapshot-controller\/rbac-snapshot-controller.yaml\n\nkubectl apply -f https:\/\/raw.githubusercontent.com\/kubernetes-csi\/external-snapshotter\/release-2.0\/deploy\/kubernetes\/snapshot-controller\/setup-snapshot-controller.yaml<\/pre>\n<p><img loading=\"lazy\" decoding=\"async\" width=\"1105\" height=\"479\" class=\"wp-image-3039\" src=\"https:\/\/arielantigua.com\/weblog\/wp-content\/uploads\/2021\/01\/word-image-7.png\" srcset=\"https:\/\/arielantigua.com\/weblog\/wp-content\/uploads\/2021\/01\/word-image-7.png 1105w, https:\/\/arielantigua.com\/weblog\/wp-content\/uploads\/2021\/01\/word-image-7-300x130.png 300w, https:\/\/arielantigua.com\/weblog\/wp-content\/uploads\/2021\/01\/word-image-7-1024x444.png 1024w, https:\/\/arielantigua.com\/weblog\/wp-content\/uploads\/2021\/01\/word-image-7-768x333.png 768w\" sizes=\"auto, (max-width: 1105px) 100vw, 1105px\" \/><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" width=\"755\" height=\"621\" class=\"wp-image-3040\" src=\"https:\/\/arielantigua.com\/weblog\/wp-content\/uploads\/2021\/01\/word-image-8.png\" srcset=\"https:\/\/arielantigua.com\/weblog\/wp-content\/uploads\/2021\/01\/word-image-8.png 755w, https:\/\/arielantigua.com\/weblog\/wp-content\/uploads\/2021\/01\/word-image-8-300x247.png 300w\" sizes=\"auto, (max-width: 755px) 100vw, 755px\" \/><\/p>\n<p><strong>Longhorn version 1.1.0 <\/strong><\/p>\n<p>La versi\u00f3n actual de Longhorn que tengo instalada es 1.0.201, al momento de escribir este post, esa es la versi\u00f3n m\u00e1s reciente. Teniendo en cuenta que Longhorn acaba de liberar hace m\u00e1s de 15 d\u00edas una versi\u00f3n 1.1.0 que cuenta con la funcionalidad que se necesita para lograr hacer snapshot desde k8s. Al parecer son dos Helm Charts diferentes y a\u00fan no est\u00e1 listo el Chart para Cluster Explorer de Rancher UI.<\/p>\n<p>Esta fue la principal raz\u00f3n por la que decid\u00ed levantar un nuevo cluster para probar que corriendo Longhorn 1.1.0 se pueden hacer los respaldos con K10.<\/p>\n<p>En lugar de usar el Chart desde Cluster Explorer, proced\u00ed a usar el viejo m\u00e9todo [Rancher dice que esto ser\u00e1 eliminado en futuras versiones] e instalar la versi\u00f3n 1.1.0 de longhorn.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" width=\"1297\" height=\"551\" class=\"wp-image-3041\" src=\"https:\/\/arielantigua.com\/weblog\/wp-content\/uploads\/2021\/01\/word-image-9.png\" srcset=\"https:\/\/arielantigua.com\/weblog\/wp-content\/uploads\/2021\/01\/word-image-9.png 1297w, https:\/\/arielantigua.com\/weblog\/wp-content\/uploads\/2021\/01\/word-image-9-300x127.png 300w, https:\/\/arielantigua.com\/weblog\/wp-content\/uploads\/2021\/01\/word-image-9-1024x435.png 1024w, https:\/\/arielantigua.com\/weblog\/wp-content\/uploads\/2021\/01\/word-image-9-768x326.png 768w\" sizes=\"auto, (max-width: 1297px) 100vw, 1297px\" \/><\/p>\n<p>Otra configuraci\u00f3n que debemos crear es un VolumeSnapshotClass, esta configuraci\u00f3n ayuda a K10 a detectar que almacenamiento soporta snapshots para realizar respaldos.<\/p>\n<pre>apiVersion: snapshot.storage.k8s.io\/v1beta1\ndriver: driver.longhorn.io\nkind: VolumeSnapshotClass\ndeletionPolicy: Delete\nmetadata:\n  annotations:\n    k10.kasten.io\/is-snapshot-class: \"true\"\n  name: csi-hostpath-snapclass<\/pre>\n<p><img loading=\"lazy\" decoding=\"async\" width=\"557\" height=\"58\" class=\"wp-image-3042\" src=\"https:\/\/arielantigua.com\/weblog\/wp-content\/uploads\/2021\/01\/word-image-10.png\" srcset=\"https:\/\/arielantigua.com\/weblog\/wp-content\/uploads\/2021\/01\/word-image-10.png 557w, https:\/\/arielantigua.com\/weblog\/wp-content\/uploads\/2021\/01\/word-image-10-300x31.png 300w\" sizes=\"auto, (max-width: 557px) 100vw, 557px\" \/><\/p>\n<p>Ejecutamos nuevamente el script de pre-flight, ahora si tenemos todo verde!!!<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" width=\"621\" height=\"846\" class=\"wp-image-3043\" src=\"https:\/\/arielantigua.com\/weblog\/wp-content\/uploads\/2021\/01\/word-image-11.png\" srcset=\"https:\/\/arielantigua.com\/weblog\/wp-content\/uploads\/2021\/01\/word-image-11.png 621w, https:\/\/arielantigua.com\/weblog\/wp-content\/uploads\/2021\/01\/word-image-11-220x300.png 220w\" sizes=\"auto, (max-width: 621px) 100vw, 621px\" \/> Todo verde !!!<\/p>\n<p>Ya que este es un cluster nuevo y no existe el namespace de kasten-io, podemos proceder a realizar los pasos descritos en <a href=\"https:\/\/docs.kasten.io\/latest\/install\/requirements.html#prerequisites\">https:\/\/docs.kasten.io\/latest\/install\/requirements.html#prerequisites<\/a><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" width=\"808\" height=\"453\" class=\"wp-image-3044\" src=\"https:\/\/arielantigua.com\/weblog\/wp-content\/uploads\/2021\/01\/word-image-12.png\" srcset=\"https:\/\/arielantigua.com\/weblog\/wp-content\/uploads\/2021\/01\/word-image-12.png 808w, https:\/\/arielantigua.com\/weblog\/wp-content\/uploads\/2021\/01\/word-image-12-300x168.png 300w, https:\/\/arielantigua.com\/weblog\/wp-content\/uploads\/2021\/01\/word-image-12-768x431.png 768w\" sizes=\"auto, (max-width: 808px) 100vw, 808px\" \/><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" width=\"640\" height=\"390\" class=\"wp-image-3045\" src=\"https:\/\/arielantigua.com\/weblog\/wp-content\/uploads\/2021\/01\/word-image-13.png\" srcset=\"https:\/\/arielantigua.com\/weblog\/wp-content\/uploads\/2021\/01\/word-image-13.png 640w, https:\/\/arielantigua.com\/weblog\/wp-content\/uploads\/2021\/01\/word-image-13-300x183.png 300w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><\/p>\n<p>Todo se est\u00e1 creando en el namespace aplicado en Helm. Cuando todo este \u201cRunning\u201d podemos proceder a hacer el port-forward y conectarnos al dashboard de K10.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" width=\"1315\" height=\"579\" class=\"wp-image-3046\" src=\"https:\/\/arielantigua.com\/weblog\/wp-content\/uploads\/2021\/01\/word-image-14.png\" srcset=\"https:\/\/arielantigua.com\/weblog\/wp-content\/uploads\/2021\/01\/word-image-14.png 1315w, https:\/\/arielantigua.com\/weblog\/wp-content\/uploads\/2021\/01\/word-image-14-300x132.png 300w, https:\/\/arielantigua.com\/weblog\/wp-content\/uploads\/2021\/01\/word-image-14-1024x451.png 1024w, https:\/\/arielantigua.com\/weblog\/wp-content\/uploads\/2021\/01\/word-image-14-768x338.png 768w\" sizes=\"auto, (max-width: 1315px) 100vw, 1315px\" \/><\/p>\n<p>Ya podemos proceder a crear las configuraciones iniciales!!<\/p>\n<p>Esta entrada se queda hasta este punto ya que debo realizar algunas pruebas y determinar si la nueva versi\u00f3n de Longhorn con su csi-snapshotter funciona con Kasten k10.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Kubernetes \u2013 Respaldando un cluster de k8s con Kasten K10. Kasten K10 es una soluci\u00f3n de respaldos para Kubernetes, ya he tocado el tema de los respaldos en dos ocasiones con dos herramientas diferentes, K10 tiene ventajas muy claras en frente a los respaldos de Longhorn o Velero. El primer punto a favor que tiene [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7,128,131],"tags":[140,141,139,132],"class_list":["post-3031","post","type-post","status-publish","format-standard","hentry","category-general","category-kubernetes","category-rancher","tag-backups","tag-k10","tag-kubernetes","tag-rancher"],"_links":{"self":[{"href":"https:\/\/arielantigua.com\/weblog\/wp-json\/wp\/v2\/posts\/3031","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/arielantigua.com\/weblog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/arielantigua.com\/weblog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/arielantigua.com\/weblog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/arielantigua.com\/weblog\/wp-json\/wp\/v2\/comments?post=3031"}],"version-history":[{"count":0,"href":"https:\/\/arielantigua.com\/weblog\/wp-json\/wp\/v2\/posts\/3031\/revisions"}],"wp:attachment":[{"href":"https:\/\/arielantigua.com\/weblog\/wp-json\/wp\/v2\/media?parent=3031"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/arielantigua.com\/weblog\/wp-json\/wp\/v2\/categories?post=3031"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/arielantigua.com\/weblog\/wp-json\/wp\/v2\/tags?post=3031"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}