• Skip to main content
  • Skip to secondary menu
  • Skip to primary sidebar
El Blog de Jorge de la Cruz

El Blog de Jorge de la Cruz

El Blog de Jorge de la Cruz - Todas las novedades sobre VMware, Veeam, InfluxData, Grafana, Zimbra, etc.

  • Home
  • VMware
    • VMworld
    • VMware vSphere 6.7
    • VMware vSphere 6.5
  • Veeam
    • Resumen Contenido 2021
    • Veeam v11
      • Continuous Data Protection (CDP
      • Ransomware Protection
      • Archive Tier
      • Mejoras en Instant Recovery
      • Veeam Agent for Mac
      • Veeam Backup for AHV v2.1
    • Veeam Backup for Microsoft Office 365
      • 1 – Razones para proteger nuestra información en Microsoft Office 365
      • 2 – Componentes lógicos de Veeam Backup for Microsoft Office 365 2.0
      • 3 – Instalación paso a paso de Veeam Backup for Microsoft Office 365 v2.0
      • 4 – Configuración inicial de Veeam Backup for Microsoft Office 365 v2.0
      • 5 – Creando trabajos de copia en Veeam Backup for Microsoft Office 365 v2.0
      • 6 – Restaurando elementos en Veeam Backup for Microsoft Office 365 v2.0
    • Veeam Backup for AWS
      • Veeam: Veeam anuncia Veeam Backup for AWS Free Edition
      • Veeam: Cómo Desplegar Veeam Backup for AWS – paso a paso
      • Veeam: Vistazo en profundidad al nuevo Veeam Backup for AWS – Creación de Políticas de Backup y Restauración
      • Veeam: Cómo conectar nuestro Veeam Backup & Replication a Veeam Backup for AWS
    • Veaam ONE
      • En busca del Dashboard perfecto: Veeam ONE – Parte I – Introducción a Veeam ONE
      • En busca del Dashboard perfecto: Veeam ONE – Parte II – Descarga e Instalación de Veeam ONE
      • En busca del Dashboard perfecto: Veeam ONE – Parte III – Añadir una Infraestructura de VMware vSphere a Veeam ONE
      • En busca del Dashboard perfecto: Veeam ONE – Parte IV – Añadir una Infraestructura de Veeam Backup and Replication a Veeam ONE
      • En busca del Dashboard perfecto: Veeam ONE – Parte V – Realizando troubleshooting de vSphere usando Veeam ONE Monitor
      • En busca del Dashboard perfecto: Veeam ONE – Parte VI – Realizando troubleshooting de Veeam Backup and Replication usando Veeam ONE Monitor
      • En busca del Dashboard perfecto: Veeam ONE – Parte VII – Vistazo profundo a los Dashboards en Veeam ONE Reporter
      • En busca del Dashboard perfecto: Veeam ONE – Parte VIII – Vistazo profundo a Reportes en Veeam ONE Reporter
      • En busca del Dashboard perfecto: Veeam ONE – Parte IX – Chargeback para crear reportes de coste de nuestra Infraestructura
    • Veeam Availability Console
      • 1 – Teoría e información útil sobre el producto
      • 2 – Instalación de Veeam Availability Console
      • 3 – Configuración y conexión con VBR Server
      • 4 – Administración centralizada de Veeam Backup Agents
      • 5 – Backup de Agentes a diferentes destinos, SMB, Repositorio Veeam o Cloud Connect
      • 6 – Reportes de Backup de Veeam Agent y Veeam Backup and Replication
      • 7 – Manejando la Facturación de Veeam Agents, Backup and Replication y Cloud Connect
    • Backup y restore de cargas de trabajo a Microsoft Azure
      • 1 – Introducción
      • 2 – Conectividad entre nuestro Datacenter y Microsoft Azure
      • 3 – Desplegar Veeam Backup and Replication en Microsoft Azure
      • 4 – Configuración en nuestro Datacenter para backup a Microsoft Azure
      • 5 – Restaurando a Microsoft Azure, desde Microsoft Azure
      • 6 – Migrar cargas de trabajo desde Microsoft Azure hacía nuestro Datacenter
    • Veeam v9.5 Update 4
      • Veeam Cloud Tier
        • Cómo controlar el ancho de banda en Veeam Cloud Tier
      • Secure Restore y Staged Restore
      • Mejoras en Veeam Agent Management
      • Veeam Community Edition
      • Actualizar Veeam Enterprise Manager y Veeam Backup and Replication a la última versión
      • VeeamONE con Intelligent Diagnostics, Remediation actions, Business View 2.0 y Application Monitoring
    • VeeamON 2022
      • Novedades en Veeam ONE v12
    • VeeamON 2021
      • VBO v6 – Self-Service y Backup Copy Glacier-Azure Archive
    • VeeamON 2020
      • Veeam Backup for AWS v2.0
    • VeeamON 2019
      • Veeam Availability Orchestrator v2.0 – ¡novedades!
    • VeeamON 2017
      • Sesiones recomendadas
      • Día I – Veeam Availability Suite v10 – ¡novedades!
      • Día II – Veeam Azure PN (Powered Network), Scale-out Archive Tier y mucho más
    • VeeamON 2015
      • VeeamON 2015 volverá a Las Vegas en el único Evento sobre Disponibilidad en el Data Center
      • Completo resumen, keynotes e imágenes
      • vBrownBag – Jorge de la Cruz – Stop sending postcards to your customers
  • Zextras
  • PRTG
  • Office 365
    • Microsoft – Añadiendo nuestro dominio a Office 365, configuración de DNS y migración de actual Mailbox
    • Veeam: Usando Microsoft Office 365 para nuestras notificaciones por correo electrónico
    • PRTG: Usando Microsoft Office 365 para nuestras notificaciones por correo electrónico
  • Zimbra
    • Instalación
      • Instalando Zimbra 8.7.6 sobre Ubuntu 14.04 LTS – ¡con Chat y Drive!
      • Amazon Lightsail para instalar Zimbra Collaboration 8.7.1, Parte II
      • Amazon Lightsail para instalar Zimbra Collaboration 8.7.1, Parte I
      • Instalando Zimbra 8.7.x con un solo comando, incluye Chat y Drive
  • Linux
    • InfluxDB, Grafana y Telegraf
      • 1 – Instalación y configuración de los components
      • 2 – Instalar agente en Linux
      • 3 – Integración con PRTG
      • 4 – Instalar agente Telegraf en Nodos remotos Windows
      • 5 – Activar inputs específicos, Red, MySQL/MariaDB, Nginx
      • 6 – Monitorizando Veeam
    • Ansible y Zabbix
      • 1 – Inicio
      • 2 – Instalación de Ansible e integración con Active Directory
      • 3 – Configuración de AutoDiscovery en Zabbix
      • 4 – Instalación del agente de Zabbix en Windows
      • 5 – Instalación del agente de Zabbix en Linux y Auto Remove en Zabbix
    • Jenkins
      • 1 – Inicio
      • 2 – Instalación de Jenkins en Ubuntu
      • 3 – Instalando nuestro primer plugin
      • 4 – Sincronización NTP de Linux
      • 5 – Añadir un Slave Windows a Jenkins
      • 6 – Ejecutar tareas en Linux
      • 7 – Ejecutar tareas en Windows
    • Kubernetes
      • 1 – Introducción a Kubernetes
      • 2 – Instalación paso a paso
      • 3 – RollingUpdate con Kubernetes
      • 4 – Dashboard
      • 5 – Volúmenes NFS
      • 6 – Registry
      • 7 – Traefik
      • 8 – Systemd con Traefik y Proxy de Kubernetes
      • 9 – Heapster Influx Grafana
      • 10 – Labels de Kubernetes
      • 11 – API: Swagger
      • 12 – API: Creando nuestro primer POD
  • Contribuidores
    • Acerca de Jorge
    • Acerca de Oscar Mas
      • Clúster SQL
        • 1 – Introducción
        • 2 – Preparación de los equipos virtuales
        • 3 – Instalación del Clúster de Microsoft
        • 4 – Instalación de SQL Server para Clúster de Microsoft
        • 5 – Configuración de nuestro Clúster de SQL
        • 6 – Monitorización de Clúster de SQL con Zabbix
        • 7 – Actualizando clúster de SQL

Kubernetes – Helm Heketi con GlusterFS

23 August, 2018 - Escrito en: kubernetes, opensource

Soy Oscar Mas y me gustaría enseñaros que es Helm y como montar el almacenamiento para que Helm funcione correctamente. Helm dicho rápidamente es el “apt-get” de Kubernetes, pero para que esto funcione de manera automática hay que realizar un par de procedimientos antes de empezar a usarlo.

Cuando vemos en GitHub como despliegan un helm, veremos que para hacerlo rápido (TL;DR;) lo lanzan de la siguiente forma:

$ helm install stable/dokuwiki

Pero si no procedemos de una forma correcta al montaje del almacenamiento, nos encontraremos que nos da errores, ya que el sistema no encontrará un storage por defecto para poder hacer el despliegue que indicamos en el comando de “helm install stable/paquete”.

En este post os explicaré como configurar un sistema de almacenamiento basado en GlusterFS, el cual se adaptará a las necesidades de los paquetes Helm. El almacenamiento se adaptará gracias a los StorageClass de Kubernetes y su Dynamic Provisioning, el cual pasó de ser Beta a Estable en la versión 1.6 de Kubernetes. Si queréis más información sobre el Dynamic Provisioning , os aconsejo que os leáis el siguiente artículo:

  • http://blog.kubernetes.io/2017/03/dynamic-provisioning-and-storage-classes-kubernetes.html

Es importante indicar que los paquetes Helm disponen de dos ramas:

  • Stable – es la versión estable.
  • Incubator – es la versión de prueba, las cuales están a la espera para pasar a ser estables.

Lo primero que hay que hacer es montar el StorageClass, el cual es un volumen con persistencia. El almacenamiento que usará el StorageClass, se puede definir con diferentes tecnologías de almacenamiento, como pueden ser: Ceph RBD, ScaleIO, GlusterFS, etc…. Este post se enfocará en GlusterFS.

Kubernetes por si solo no puede comunicarse con GlusterFS, ya que Kubernetes usa RESTful en sus comunicaciones. A consecuencia de esto necesitamos una herramienta intermedia con la cual se comunicará Kubernetes con GlusterFS. Esta herramienta intermedia es Heketi, que no es más que un RESTful para poder gestionar el almacenamiento de GlusterFS.

Para poder realizar este post, partimos de la base de una plataforma de Kubernetes desplegada, tal y como se muestra en mi anterior post:

  • https://www.jorgedelacruz.es/2017/12/05/kubernetes-instalacion/

En definitiva, los servidores necesarios son los siguientes:

Los servidores de ub-nodo0-sbd y ub-nodo1-sbd, son los que forman la infraestructura de Kubernetes.

El esquema lógico será el siguiente:

Cosas a tener en cuenta

Hay varios puntos que hay que tener en cuenta antes de realizar el montaje:

En los servidores de GlusterFS, les he añadido a cada uno un disco (sdb) de 50GB en el cual se almacenaran los datos.

Cabe destacar que este tipo de montajes, es necesario como mínimo tres servidores de GlusterFS para un correcto funcionamiento. Si usamos menos de tres servidores, podremos observar el siguiente error: “Error: No space”.

También es importante que entre los servidores de GlusterFS hay resolución entre ellos, ya sea por DNS o añadiendo las entradas en el fichero de hosts.

Montaje de GlusterFS

El primer paso que hemos de realizar es el montaje del sistema de GlusterFS en tres o más servidores. En estos servidores desplegaremos GlusterFS, pero no realizaremos ningún tipo de configuración, ya que para esto se encargará Kubernetes mediante el RESTful de Heketi. Así que procederemos a la instalación en los tres servidores de GlusterFS:

apt-get update && apt-get install -y apt-transport-https
apt-get install -y software-properties-common
add-apt-repository ppa:gluster/glusterfs-3.12
apt-get update && apt-get install -y glusterfs-server thin-provisioning-tools
mkdir -p /data/heketi/{db,.ssh} && chmod 700 /data/heketi/.ssh

Una vez instalados los paquetes necesarios en nuestros servidores de GlusterFS, instalaremos la parte cliente en todos los nodos que queramos que accedan a nuestro Storage. En mi caso al sólo tener un nodo de Kubernetes, lo instalaré en el nodo ub-nodo1-sbd. Recordar que el servidor ub-nodo0-sbd es donde está ubicado el servidor master de Kubernetes y en este servidor no se despliega nada por defecto.

apt-get update && apt-get install -y apt-transport-https
apt-get install -y software-properties-common
add-apt-repository ppa:gluster/glusterfs-3.12
apt-get update && apt-get install -y glusterfs-client thin-provisioning-tools
mkdir -p /data/heketi/{db,.ssh} && chmod 700 /data/heketi/.ssh

Fijaros que tanto en los servidores de GlusterFS como en los nodos de Kubernetes, hemos realizado es mismo procedimiento, pero en los servidores de GlusterFS hemos instalado el paquete: “glusterfs-server” y en los nodos de Kubernetes se ha de instalar el paquete: “glusterfs-client”.

Revisaremos que nuesto cluster de Kubernetes esté funcionando correctamente y le añadiremos el label: “glusterfs” a los nodos de nuestro Kubernetes que vayan a gestionar el storage y en los cuales se vaya a desplegar el Helm que hayamos decidido. Esto es a consecuencia, de que el deployment que usaremos más adelante, simplemente se desplegará en los servidores de Kubernetes que tengan el label “glusterfs”. En mi caso es el servidor ub-nodo1-sbd y lo haremos de la siguiente manera:

root@ub-nodo0-sbd:~# kubectl get nodes
root@ub-nodo0-sbd:~# kubectl label node ub-nodo1-sbd storagenode=glusterfs

Instalación de Heketi

Heketi se conecta a nuestro sistema de GlusterFS mediante el protocolo SSH, por eso lo que haremos es crear una clave SSH, para que Heketi pueda conectarse al GlusterFS y así poder crear los storages de una forma transparente y automática. En el momento de descargar la versión de Heketi, es importante verificar que estamos usando la última versión en su web oficial: https://github.com/heketi/heketi/releases

root@ub-nodo0-sbd:~# wget https://github.com/heketi/heketi/releases/download/v6.0.0/heketi-client-v6.0.0.linux.amd64.tar.gz
root@ub-nodo0-sbd:~# tar xzvf heketi-client-v6.0.0.linux.amd64.tar.gz
root@ub-nodo0-sbd:~# cp heketi-client/bin/heketi-cli /usr/local/sbin/
root@ub-nodo0-sbd:~# heketi-cli -v
root@ub-nodo0-sbd:~# mkdir -p /data/heketi/.ssh && chmod 700 /data/heketi/.ssh
root@ub-nodo0-sbd:~# ssh-keygen -t rsa -b 2048 -f /data/heketi/.ssh/id_rsa
root@ub-nodo0-sbd:~# for NODE in 172.26.0.218 172.26.0.219 172.26.0.220; do scp -r /data/heketi/.ssh/ root@${NODE}:/data/heketi; done
root@ub-nodo0-sbd:~# for NODE in 172.26.0.218 172.26.0.219 172.26.0.220; do cat /data/heketi/.ssh/id_rsa.pub | ssh root@${NODE} "cat >> /root/.ssh/authorized_keys"; done

Ahora nos descargaremos el deployment y el secret del despliegue de Heketi. Podremos observar que el deployment (heketi-deployment.json), se desplegará en los servidores con el label “glusterfs” y modificaremos el fichero de secret, en el cual pondremos nuestro password en base64.

root@ub-nodo0-sbd:~# wget https://raw.githubusercontent.com/psyhomb/heketi/master/kubernetes/heketi-deployment.json
root@ub-nodo0-sbd:~# wget https://raw.githubusercontent.com/psyhomb/heketi/master/kubernetes/heketi-secret.yaml
root@ub-nodo0-sbd:~# cat heketi-deployment.json | grep storagenode
root@ub-nodo0-sbd:~# echo -n "password" | base64
root@ub-nodo0-sbd:~# vim heketi-secret.yaml

Una vez realizados los cambios y antes de desplegar los ficheros que nos hemos descargado, copiaremos las claves SSH en nuestros servidores de Kubernetes que hayamos etiquetado con el label “glusterfs”, que es mi caso es el nodo 1 (ub-nodo1-sbd).

Ahora solamente nos queda esperar a se descarguen y se cree el deployment de Heketi. Hemos de verificar que todo está funcionando de manera correcta de la siguiente forma:

root@ub-nodo0-sbd:~# kubectl get pods
root@ub-nodo0-sbd:~# kubectl get svc -l glusterfs=heketi-service
root@ub-nodo0-sbd:~# curl -s http://172.26.0.217:30537/hello

Al desplegar el pod de Heketi, este nos dará un puerto de acceso aleatorio. En mi caso ha sido el puerto 30537, el cual usaremos para poder comunicarnos con Heketi durante el post.

En el último comando podremos observar que Heketi nos saluda: “Hello from Heketi”. Ahora ya tenemos instalado Heketi en nuestra plataforma, seguidamente precederemos a la configuración de Heketi.

Configuración de Heketi

Una vez realizada la instalación de Heketi, procederemos a indicarle la topología, donde le indicaremos la lista de los nodos que forman parte del GlusterFS y los discos.

root@ub-nodo0-sbd:~# vim heketi-topology.json
{
    "clusters": [
        {
            "nodes": [
                {
                    "node": {
                        "hostnames": {
                            "manage": [
                                "172.26.0.218"
                            ],
                            "storage": [
                                "172.26.0.218"
                            ]
                        },
                        "zone": 1
                    },
                    "devices": [
                        "/dev/sdb"
                    ]
                },
                {
                    "node": {
                        "hostnames": {
                            "manage": [
                                "172.26.0.219"
                            ],
                            "storage": [
                                "172.26.0.219"
                            ]
                        },
                        "zone": 2
                    },
                    "devices": [
                        "/dev/sdb"
                    ]
                },
                {
                    "node": {
                        "hostnames": {
                            "manage": [
                                "172.26.0.220"
                            ],
                            "storage": [
                                "172.26.0.220"
                            ]
                        },
                        "zone": 3
                    },
                    "devices": [
                        "/dev/sdb"
                    ]
                }
            ]
        }
    ]
}

Una vez creado el fichero y adaptado a nuestras necesidades, lo aplicaremos:

root@ub-nodo0-sbd:~# heketi-cli --user admin --secret password --server http://172.26.0.217:30537 topology load --json heketi-topology.json

Una vez aplicada nuestra configuración, podremos observar el resultado:

root@ub-nodo0-sbd:~# heketi-cli --user admin --secret password--server http://172.26.0.217:30537 topology info

Seguidamente extraeremos la configuración del Heketi y la aplicaremos:

root@ub-nodo0-sbd:~# heketi-cli --user admin --secret password --server  http://172.26.0.217:30537 setup-openshift-heketi-storage --listfile heketi-storage.json
root@ub-nodo0-sbd:~# kubectl apply -f heketi-storage.json

Verificaremos que se ha creado todo correctamente y lo borraremos, ya que lo que hemos provocado es que nos añada la base de datos de Heketi en nuestro sistema de GlusterFS:

root@ub-nodo0-sbd:~# kubectl get job
root@ub-nodo0-sbd:~# kubectl delete -f heketi-storage.json

Eliminaremos los datos locales de los servidores, ya que nos interesa que use los datos que se han almacenado en nuestrop storage de GlusterFS y verificaremos que nos los ha creado en nuestro GlusterFS:

root@ub-nodo1-sbd:~# ls -la /data/heketi/db/heketi.db
root@ub-nodo1-sbd:~# rm -rf /data/heketi/db/heketi.db
root@ub-nodo1-sbd:~# mount.glusterfs 172.26.0.218:/heketidbstorage /data/heketi/db
root@ub-nodo1-sbd:~# ls -la /data/heketi/db/heketi.db

Nos descargaremos el strorageClass y modificaremos el resturl y el clusterid con nuestros valores para que el sistema pueda acceder a nuestro sistema de GlusterFS.

root@ub-nodo0-sbd:~# wget https://raw.githubusercontent.com/psyhomb/heketi/master/kubernetes/heketi-storageclass.yaml
root@ub-nodo0-sbd:~# heketi-cli --user admin --secret password --server  http://172.26.0.217:30537 cluster list
root@ub-nodo0-sbd:~# vim heketi-storageclass.yaml
  resturl: "http://172.26.0.217:30537"
  clusterid: "bb14cc9ae7865f48b7b03d6ef5912736"
root@ub-nodo0-sbd:~# kubectl apply -f heketi-storageclass.yaml

Ahora lo que nos queda es crear nuestro PVC y PV en nuestro sistema de Kubernetes.

root@ub-nodo0-sbd:~# wget https://raw.githubusercontent.com/psyhomb/heketi/master/kubernetes/heketi-pvc.yaml
root@ub-nodo0-sbd:~# kubectl apply -f heketi-pvc.yaml
root@ub-nodo0-sbd:~# kubectl get pvc test-claim
root@ub-nodo0-sbd:~# kubectl get pv
root@ub-nodo0-sbd:~# heketi-cli --user admin --secret password --server http://172.26.0.217:30537 volume list

Le indicaremos a Kubernetes que este storage que hemos creado es el default. De esta manera cuando despleguemos el helm, usará este storage de manera automática:

root@ub-nodo0-sbd:~# kubectl get sc
root@ub-nodo0-sbd:~# kubectl describe storageclass slow | grep IsDefaultClass
root@ub-nodo0-sbd:~# kubectl patch storageclass slow -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
root@ub-nodo0-sbd:~# kubectl get sc
root@ub-nodo0-sbd:~# kubectl describe storageclass slow | grep IsDefaultClass

Helm

Una vez realizado la configuración de nuestro storage por defecto, descargaremos helm y lo actualizaremos:

root@ub-nodo0-bcn:~# curl https://raw.githubusercontent.com/kubernetes/helm/master/scripts/get > get_helm.sh
root@ub-nodo0-bcn:~# chmod 700 get_helm.sh
root@ub-nodo0-bcn:~# ./get_helm.sh
root@ub-nodo0-bcn:~# helm init
root@ub-nodo0-bcn:~# helm init –upgrade

Crearemos la cuenta de servicio y actualizaremos helm, para que se apliquen los cambios realizados:

root@ub-nodo0-bcn:~# kubectl create serviceaccount --namespace kube-system tiller
root@ub-nodo0-bcn:~# kubectl create clusterrolebinding tiller-cluster-rule --clusterrole=cluster-admin --serviceaccount=kube-system:tiller
root@ub-nodo0-bcn:~# kubectl patch deploy --namespace kube-system tiller-deploy -p '{"spec":{"template":{"spec":{"serviceAccount":"tiller"}}}}'     
root@ub-nodo0-bcn:~# helm init --service-account tiller –upgrade

Una vez acabados todos los pasos, simplemente actualizaremos nuestro repositorio de helm e instalaremos nuestro paquete. En este caso he instalado la DokuWiki, pero podéis probar cualquier otro paquete.

root@ub-nodo0-bcn:~# helm repo update
root@ub-nodo0-bcn:~# helm search dokuwiki
root@ub-nodo0-sbd:~# helm install stable/dokuwiki

Ahora solamente nos falta crear el ingress y configurar nuestro traefik para poder acceder a nuestra dokuwiki desplegada desde helm, tal y como he mostrado en posts anteriores:

https://www.jorgedelacruz.es/2018/01/09/kubernetes-traefik/

https://www.jorgedelacruz.es/2018/01/16/kubernetes-systemd-con-traefik-y-proxy-de-kubernetes/

Espero que os sirva de ayuda.

Filed Under: kubernetes, opensource Tagged With: helm glusterfs, helm heketi, kubernetes, kubernetes helm, kubernetes oscar

Reader Interactions

Comments

  1. evilbeast666 says

    4 March, 2019 at 21:29

    Muy currado, thx dude.

    Reply
  2. Angel says

    12 March, 2019 at 17:11

    Tengo creado este pv y este pvc
    NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
    persistentvolume/pvc-2b54cf82-4365-11e9-97a8-8ae35e6569e3 1Gi RWO Delete Bound default/gluster1 slow 46h

    NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
    persistentvolumeclaim/gluster1 Bound pvc-2b54cf82-4365-11e9-97a8-8ae35e6569e3 1Gi RWO slow 46h

    El cual es usado por un pod con nginx.

    Si deseo instalar con helm la dokuwiki del ejemplo, se me queda el pod sin crear con el error:
    pod has unbound immediate PersistentVolumeClaims

    ¿Debo de crear un pvc por cada ‘aplicaión’ que desee instalar?

    Gracias.

    Reply

Leave a Reply Cancel reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Primary Sidebar

  • Email
  • GitHub
  • LinkedIn
  • RSS
  • Twitter
  • YouTube

Gold Partners

Silver Partners

Libros Gratuitos

Cloud por vExperts
VMware por vExperts

VMware vExpert

Puesto 16 en Top vBlog

Calendario de Posts

August 2018
M T W T F S S
 12345
6789101112
13141516171819
20212223242526
2728293031  
« Jul   Sep »

Disclaimer

Todas las opiniones expresadas en este sitio son las mías propias y no representan las opiniones de ninguna compañía con la que haya trabajado, esté trabajando o vaya a estar trabajando.

Copyright © 2026 · El Blog de Jorge de la Cruz