{"id":2905,"date":"2019-09-26T15:04:46","date_gmt":"2019-09-26T19:04:46","guid":{"rendered":"http:\/\/arielantigua.com\/weblog\/?p=2905"},"modified":"2021-02-19T14:08:54","modified_gmt":"2021-02-19T18:08:54","slug":"kubernetes-almacenamiento-con-linstor","status":"publish","type":"post","link":"https:\/\/arielantigua.com\/weblog\/2019\/09\/kubernetes-almacenamiento-con-linstor\/","title":{"rendered":"Kubernetes \u2013 Almacenamiento con Linstor."},"content":{"rendered":"<p>Kubernetes \u2013 Almacenamiento con Linstor.<\/p>\n<p>Hace ya un tiempo que escrib\u00ed sobre k8s, otros proyectos han tomado tiempo y recursos, hace unas semanas retome el cl\u00faster que tengo en casa para terminar las configuraciones necesarias y mover lo m\u00e1s que pueda de algunas m\u00e1quinas virtuales que tengo en <strong>vSphere<\/strong> y que entiendo desempe\u00f1ar\u00edan mejor estando en <strong>Kubernetes<\/strong>.<\/p>\n<p>Inicialmente las pruebas fueron realizadas con longhorn, algunos problemas los cuales no inspiran mucha confianza me hicieron no escribir sobre esa implementaci\u00f3n, claramente <strong>Rancher<\/strong> dice que es un proyecto aun en beta.<\/p>\n<p>Hace unas semanas le\u00ed sobre <strong>Linstor<\/strong> [ <a href=\"http:\/\/vitobotta.com\/2019\/08\/07\/linstor-storage-with-kubernetes\/\">http:\/\/vitobotta.com\/2019\/08\/07\/linstor-storage-with-kubernetes\/<\/a> ], la instalaci\u00f3n fue realizada en Ubuntu que es la misma distribuci\u00f3n que estoy usando. He decidido usar esta implementaci\u00f3n porque usa LVM como backend en los equipos que aportaran almacenamiento para el cl\u00faster, adem\u00e1s de esto los nodos que est\u00e1n aportando almacenamiento no necesariamente deben tener k8s, al menos eso es lo que entiendo y algo que debo validar.<\/p>\n<p><strong>Instalando Linstor.<\/strong><\/p>\n<p>Prepararemos nuestros equipos con los siguientes pasos:<\/p>\n<blockquote>\n<pre>apt-get install linux-headers-$(uname -r)\nadd-apt-repository ppa:linbit\/linbit-drbd9-stack\napt-get update\napt install drbd-utils drbd-dkms lvm2\nmodprobe drbd\nlsmod | grep -i drbd\necho drbd &gt; \/etc\/modules-load.d\/drbd.conf<\/pre>\n<\/blockquote>\n<p>&nbsp;<\/p>\n<p>En este punto ya los equipos est\u00e1n listos para instalar los componentes de <strong>Linstor<\/strong>. Para estar seguro de que todo estaba bien proced\u00ed a reiniciar el nodo.<\/p>\n<p>Seleccionamos un equipo para que sea controlador del cluster de <strong>Linstor<\/strong>, adem\u00e1s este mismo equipo puede aportar almacenamiento as\u00ed que tambi\u00e9n instalaremos el componente de <strong>satellite<\/strong>.<\/p>\n<blockquote>\n<pre>apt install linstor-controller linstor-satellite linstor-client<\/pre>\n<\/blockquote>\n<p>Ahora habilitamos e inicializamos los componentes.<\/p>\n<blockquote>\n<pre>systemctl enable --now linstor-controller\nsystemctl start linstor-controller<\/pre>\n<\/blockquote>\n<p>En los dem\u00e1s equipos instalamos el componente de sat\u00e9lite.<\/p>\n<blockquote>\n<pre>apt install linstor-satellite linstor-client<\/pre>\n<\/blockquote>\n<p>Habilitamos el servicio y lo iniciamos.<\/p>\n<blockquote>\n<pre>systemctl enable --now linstor-satellite\nsystemctl start linstor-satellite<\/pre>\n<\/blockquote>\n<p>Desde el controller agregamos los equipos sat\u00e9lites.<\/p>\n<blockquote>\n<pre>linstor node create kube1 172.22.35.25\nlinstor node create kube2 172.22.35.26\nlinstor node create kube3 172.22.35.27<\/pre>\n<\/blockquote>\n<p>Esperamos unos minutos y ejecutamos:<\/p>\n<blockquote>\n<pre>linstor node list<\/pre>\n<\/blockquote>\n<p>Este comando nos mostrar\u00e1 la lista de nodos disponibles, ser\u00e1 algo as\u00ed:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" width=\"538\" height=\"184\" class=\"wp-image-2906\" src=\"https:\/\/arielantigua.com\/weblog\/wp-content\/uploads\/2019\/09\/word-image.png\" srcset=\"https:\/\/arielantigua.com\/weblog\/wp-content\/uploads\/2019\/09\/word-image.png 538w, https:\/\/arielantigua.com\/weblog\/wp-content\/uploads\/2019\/09\/word-image-300x103.png 300w\" sizes=\"auto, (max-width: 538px) 100vw, 538px\" \/><\/p>\n<p>Ya contamos con un cl\u00faster de <strong>Linstor<\/strong> pero aun no estamos presentando almacenamiento a este, procederemos a crear almacenamiento administrado por LVM, <strong>Linstor<\/strong> soporta ZFS, esta es una herramienta que nunca he usado en el pasado de manera seria as\u00ed que prefiero LVM que tiene a\u00f1os disponible en las distribuciones Linux.<\/p>\n<p>En cada m\u00e1quina virtual para <strong>Kubernetes<\/strong> agregue dos discos, uno para el sistema operativo y otro para almacenamiento que ahora ser\u00e1 usado en su totalidad con <strong>Linstor<\/strong>.<\/p>\n<p>Lo primero es preparar el disco f\u00edsico para ser usado en LVM.<\/p>\n<blockquote>\n<pre>pvcreate \/dev\/sdb<\/pre>\n<\/blockquote>\n<p>Luego creamos un volumen group (vg).<\/p>\n<blockquote>\n<pre>vgcreate kube \/dev\/sdb<\/pre>\n<\/blockquote>\n<p>He seleccionado kube para que sea el nombre del Volume Group.<\/p>\n<p>Procederemos a crear un thin pool, esto nos permitir\u00e1 crear vol\u00famenes m\u00e1s grandes que el espacio f\u00edsico del cual disponemos.<\/p>\n<blockquote>\n<pre>lvcreate -l 100%FREE --thinpool kube\/lvmthinpool<\/pre>\n<\/blockquote>\n<p>Una vez realizados estos pasas en cada nodo que aportara almacenamiento al cluster, volvemos al controller para crear un storage-pool.<\/p>\n<blockquote>\n<pre>linstor storage-pool create lvmthin kube1 linstor-pool kube\/lvmthinpool\nlinstor storage-pool create lvmthin kube2 linstor-pool kube\/lvmthinpool\nlinstor storage-pool create lvmthin kube3 linstor-pool kube\/lvmthinpool<\/pre>\n<\/blockquote>\n<p>validamos que nuestro storage-pool fue creado.<\/p>\n<blockquote>\n<pre>linstor storage-pool list<\/pre>\n<\/blockquote>\n<p>Debemos recibir lo siguiente:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" width=\"945\" height=\"174\" class=\"wp-image-2907\" src=\"https:\/\/arielantigua.com\/weblog\/wp-content\/uploads\/2019\/09\/word-image-1.png\" srcset=\"https:\/\/arielantigua.com\/weblog\/wp-content\/uploads\/2019\/09\/word-image-1.png 945w, https:\/\/arielantigua.com\/weblog\/wp-content\/uploads\/2019\/09\/word-image-1-300x55.png 300w, https:\/\/arielantigua.com\/weblog\/wp-content\/uploads\/2019\/09\/word-image-1-768x141.png 768w\" sizes=\"auto, (max-width: 945px) 100vw, 945px\" \/><\/p>\n<p>Listo, ya contamos con una plataforma para provisionar almacenamiento a <strong>Kubernetes<\/strong>, lo interesante es que tambi\u00e9n podr\u00eda provisionar almacenamiento a otras plataformas tales como <strong>Proxmox<\/strong>.<\/p>\n<p><strong>Kubernetes \u2013 que necesitamos?<\/strong><\/p>\n<p>Para habilitar que <strong>Kubernetes<\/strong> pueda usar almacenamiento proveniente de <strong>Linstor<\/strong>, debemos contar con el plugin CSI y crear StorageClass, recomiendo tener una versi\u00f3n de <strong>Kubernetes<\/strong> m\u00ednimo 1.13 para que todo funcione bien ya que ah\u00ed plugins que no est\u00e1n habilitados por defecto antes de esta versi\u00f3n. Al momento de crear los CRD estos fallaban con un mensaje que especificaba la falta de CSINodeInfo, actualizando <strong>RKE<\/strong> a 1.14.6 se resolvi\u00f3.<\/p>\n<p>Instalaremos todo lo necesario para usar <strong>Linstor<\/strong> usando esta l\u00ednea la cual descargar la versi\u00f3n 0.7.2 del CSI y usando sed estamos cambian un valor de ejemplo por el controlador de <strong>Linstor<\/strong> que en mi caso es 172.22.35.25. Esto debe ser ejecutado en la misma maquina de donde administramos k8s.<\/p>\n<blockquote>\n<pre>curl https:\/\/raw.githubusercontent.com\/LINBIT\/linstor-csi\/v0.7.0\/examples\/k8s\/deploy\/linstor-csi-1.14.yaml | sed \"s\/linstor-controller.example.com\/172.22.35.25\/g\" | kubectl apply -f -<\/pre>\n<\/blockquote>\n<p>Podemos ver el avance del de la instalaci\u00f3n con:<\/p>\n<blockquote>\n<pre>watch kubectl -n kube-system get all<\/pre>\n<\/blockquote>\n<p>Procederemos a crear un Storage Class usando este yaml<\/p>\n<p>El n\u00famero de r\u00e9plicas debe ser el n\u00famero de nodos de <strong>Kubernetes<\/strong>.<\/p>\n<blockquote>\n<pre>apiVersion: storage.k8s.io\/v1\nkind: StorageClass\nmetadata:\n  name: linstor\nprovisioner: linstor.csi.linbit.com\nparameters:\n  autoPlace: \"3\"\n  storagePool: \"linstor-pool\"<\/pre>\n<\/blockquote>\n<p>Para este punto ya podemos hacer solicitudes de vol\u00famenes usando un PresistentVolumeClaim<\/p>\n<p>En mi caso ya tenia varios yaml con requerimientos de pvc, aqu\u00ed uno.<\/p>\n<blockquote>\n<pre>apiVersion: v1\nkind: PersistentVolumeClaim\nmetadata:\n  namespace: services\n  name: adguard-config\nspec:\n  storageClassName: linstor\n  accessModes:\n    - ReadWriteOnce\n  resources:\n    requests:\n       storage: 2Gi<\/pre>\n<\/blockquote>\n<p><img loading=\"lazy\" decoding=\"async\" width=\"977\" height=\"76\" class=\"wp-image-2908\" src=\"https:\/\/arielantigua.com\/weblog\/wp-content\/uploads\/2019\/09\/word-image-2.png\" srcset=\"https:\/\/arielantigua.com\/weblog\/wp-content\/uploads\/2019\/09\/word-image-2.png 977w, https:\/\/arielantigua.com\/weblog\/wp-content\/uploads\/2019\/09\/word-image-2-300x23.png 300w, https:\/\/arielantigua.com\/weblog\/wp-content\/uploads\/2019\/09\/word-image-2-768x60.png 768w\" sizes=\"auto, (max-width: 977px) 100vw, 977px\" \/><\/p>\n<p>Podemos ver que el STATUS es Bound, esto quiere decir que satisfactoriamente <strong>Linstor<\/strong> asigno espacio a <strong>Kubernetes<\/strong> para este volumen.<\/p>\n<p>Desde el punto de vista de <strong>Linstor<\/strong> usando<\/p>\n<p>linstor volume list<\/p>\n<p>Podemos ver lo siguiente:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" width=\"1154\" height=\"421\" class=\"wp-image-2909\" src=\"https:\/\/arielantigua.com\/weblog\/wp-content\/uploads\/2019\/09\/word-image-3.png\" srcset=\"https:\/\/arielantigua.com\/weblog\/wp-content\/uploads\/2019\/09\/word-image-3.png 1154w, https:\/\/arielantigua.com\/weblog\/wp-content\/uploads\/2019\/09\/word-image-3-300x109.png 300w, https:\/\/arielantigua.com\/weblog\/wp-content\/uploads\/2019\/09\/word-image-3-768x280.png 768w, https:\/\/arielantigua.com\/weblog\/wp-content\/uploads\/2019\/09\/word-image-3-1024x374.png 1024w\" sizes=\"auto, (max-width: 1154px) 100vw, 1154px\" \/><\/p>\n<p>Estos son todos los vol\u00famenes que est\u00e1n siendo usados por contenedores en <strong>Kubernetes<\/strong>.<\/p>\n<p><strong>Listo!<\/strong><\/p>\n<p>Ya puedo usar el cluster de <strong>Kubernetes<\/strong>, bueno por la cantidad de vol\u00famenes que se ven en la imagen se puede deducir que lo estoy usando. He movido varios servicios hacia el cl\u00faster y hasta ahora muy feliz con <strong>Kubernetes<\/strong>.<\/p>\n<p>El pr\u00f3ximo paso es los respaldos, para esto estar\u00e9 usando <strong>Velero de Heptio\/VMware<\/strong>.<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Kubernetes \u2013 Almacenamiento con Linstor. Hace ya un tiempo que escrib\u00ed sobre k8s, otros proyectos han tomado tiempo y recursos, hace unas semanas retome el cl\u00faster que tengo en casa para terminar las configuraciones necesarias y mover lo m\u00e1s que pueda de algunas m\u00e1quinas virtuales que tengo en vSphere y que entiendo desempe\u00f1ar\u00edan mejor estando [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[128,131,124],"tags":[129,139,132],"class_list":["post-2905","post","type-post","status-publish","format-standard","hentry","category-kubernetes","category-rancher","category-ubuntu","tag-k8s","tag-kubernetes","tag-rancher"],"_links":{"self":[{"href":"https:\/\/arielantigua.com\/weblog\/wp-json\/wp\/v2\/posts\/2905","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=2905"}],"version-history":[{"count":0,"href":"https:\/\/arielantigua.com\/weblog\/wp-json\/wp\/v2\/posts\/2905\/revisions"}],"wp:attachment":[{"href":"https:\/\/arielantigua.com\/weblog\/wp-json\/wp\/v2\/media?parent=2905"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/arielantigua.com\/weblog\/wp-json\/wp\/v2\/categories?post=2905"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/arielantigua.com\/weblog\/wp-json\/wp\/v2\/tags?post=2905"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}