
¡Hola a todos!
Por circunstancias, nuestro pequeño equipo, no exactamente reciente y ciertamente no de manera repentina, ha llegado al punto de migrar algunos (y potencialmente todos) los productos a Kubernetes.
Las razones para esto fueron muchas, pero nuestra historia no se trata de disputas.
Teníamos pocas opciones en términos de infraestructura. vCloud Director y vCloud Director. Elegimos el más nuevo y decidimos comenzar.
Al revisar de nuevo 'The Hard Way', llegué rápidamente a la conclusión de que necesitábamos una herramienta para automatizar al menos los procesos básicos, como el despliegue y el dimensionamiento, hace tiempo. Un estudio profundo en Google reveló un producto llamado VMware Container Service Extension (CSE), un producto de código abierto que permite automatizar la creación y dimensionamiento de clústeres de k8s para los que están en vCloud.
Descargo de responsabilidad: CSE tiene sus limitaciones, pero para nuestros propósitos fue perfecto. También se debe contar con el soporte del proveedor de la nube, pero dado que la parte del servidor también es de código abierto, exíjanos a su gerente más cercano 🙂
Para comenzar a utilizarlo, se necesita una cuenta de administrador en la organización de vCloud y una red enrutada previamente creada para el clúster (durante el proceso de despliegue se requiere acceso a Internet desde esta red, no olvide configurar el Firewall/NAT). La dirección no tiene importancia. En este ejemplo tomaremos 10.0.240.0/24.
![]()
Dado que después de la creación, el clúster necesita ser gestionado, se recomienda tener una VPN con enrutamiento a la red creada. Usamos un SSL-VPN estándar, configurado en el Edge Gateway de nuestra organización.
A continuación, es necesario instalar el cliente CSE en el lugar desde donde se gestionarán los clústeres de k8s. En mi caso, es mi computadora portátil de trabajo y un par de contenedores bien ocultos que manejan la automatización.
El cliente requiere tener Python instalado en la versión 3.7.3 o superior y el módulo , así que instalaremos ambas cosas.
pip3 install vcd-cli
pip3 install container-service-extension
Después de la instalación, verificamos la versión de CSE y obtenemos lo siguiente:
# vcd cse version
Error: No such command "cse".
Sorprendentemente, pero solucionable. Resulta que CSE necesita ser integrado como un módulo en vcd-cli.
Para ello, primero es necesario iniciar sesión en vcd-cli en nuestra organización:
# vcd login MyCloud.provider.com org-dev admin
Password:
admin logged in, org: 'org-dev', vdc: 'org-dev_vDC01'
Después de esto, vcd-cli creará un archivo de configuración ~/.vcd-cli/profiles.yaml
Al final de este, es necesario agregar lo siguiente:
extensions:
- container_service_extension.client.cse
Después de eso, verificamos nuevamente:
# vcd cse version
CSE, Container Service Extension for VMware vCloud Director, version 2.5.0
La etapa de instalación del cliente ha finalizado. Intentemos desplegar el primer clúster.
CSE tiene varios conjuntos de parámetros de uso, todos los cuales se pueden consultar.
Primero, crearemos claves para el acceso sin contraseña al futuro clúster. Este aspecto es importante, ya que, por defecto, el acceso por contraseña a los nodos estará desactivado y si no se configuran las claves, puede ser complicado realizar muchas tareas a través de la consola de máquinas virtuales.
# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
Intentemos iniciar la creación del clúster:
vcd cse cluster create MyCluster --network k8s_cluster_net --ssh-key ~/\.ssh/id_rsa.pub --nodes 3 --enable-nfsSi recibimos un error, Error: La sesión ha expirado o el usuario no ha iniciado sesión. Por favor, vuelve a iniciar sesión. — volvemos a iniciar sesión en vcd-cli en vCloud como se describió anteriormente y repetimos el intento.
Esta vez todo está bien y la tarea de creación del clúster ha comenzado.
operación del clúster: Creando el vApp del clúster 'MyCluster' (38959587-54f4-4a49-8f2e-61c3a3e879e0) a partir de la plantilla 'photon-v2_k8-1.12_weave-2.3.0' (revisión 1)
La tarea tomará alrededor de 20 minutos, mientras tanto analizaremos los principales parámetros de inicio.
—network — la red que creamos anteriormente.
—ssh-key — las claves que hemos creado, que serán escritas en los nodos del clúster.
—nodes n — Número de nodos Worker en el clúster. Siempre habrá un Master, esta es una limitación de CSE.
—enable-nfs — crear un nodo adicional para compartir NFS para volúmenes persistentes. Una opción un poco técnica, a la personalización de lo que hace volveremos más tarde.
Mientras tanto, en vCloud se puede observar visualmente la creación del clúster.

Una vez que la tarea de creación del clúster haya finalizado, estará listo para trabajar.
Verifiquemos la corrección del despliegue con el comando vcd cse cluster info MyCluster

A continuación, necesitamos obtener la configuración del clúster para usarla. kubectl
# vcd cse cluster config MyCluster > ./.kube/config
Y se puede verificar el estado del clúster ya con ella:

En este punto, se puede considerar que el clúster está condicionalmente operativo, si no fuera por la historia de los volúmenes persistentes. Dado que estamos en vCloud, no se puede usar el Proveedor de vSphere. La opción —enable-nfs está diseñada para suavizar este inconveniente, pero no funcionó completamente. Se requiere una configuración manual.
Primero, nuestro nodo necesita crear un disco independiente en vCloud. Esto garantiza que nuestros datos no desaparezcan junto con el clúster, en caso de ser eliminado. También, conectaremos el disco a NFS.
# vcd disk create nfs-shares-1 100g --description 'Kubernetes NFS shares'
# vcd vapp attach mycluster nfsd-9604 nfs-shares-1
Después de esto, accedemos por ssh (realmente, ¿creaste las claves?) a nuestro nodo NFS y conectamos finalmente el disco:
root@nfsd-9604:~# parted /dev/sdb
(parted) mklabel gpt
Advertencia: La etiqueta de disco existente en /dev/sdb se destruirá y todos los datos en
este disco se perderán. ¿Desea continuar?
Sí/No? sí
(parted) unidad GB
(parted) mkpart primary 0 100
(parted) print
Modelo: Disco virtual de VMware (scsi)
Disco /dev/sdb: 100GB
Tamaño del sector (lógico/físico): 512B/512B
Tabla de particiones: gpt
Banderas del disco:
Número Inicio Fin Tamaño Sistema de archivos Nombre Banderas
1 0.00GB 100GB 100GB primary
(parted) quit
root@nfsd-9604:~# mkfs -t ext4 /dev/sdb1
Creando sistema de archivos con 24413696 bloques de 4k y 6111232 inodos
UUID del sistema de archivos: 8622c0f5-4044-4ebf-95a5-0372256b34f0
Copias de seguridad de superbloques almacenadas en bloques:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000, 7962624, 11239424, 20480000, 23887872
Asignando tablas de grupos: hecho
Escribiendo tablas de inodos: hecho
Creando diario (32768 bloques): hecho
Escribiendo superbloques e información de contabilidad del sistema de archivos: hecho
Creamos un directorio para los datos y montamos allí la nueva partición:
mkdir /export
echo '/dev/sdb1 /export ext4 defaults 0 0' >> /etc/fstab
mount -a
Crearemos cinco particiones de prueba y las compartiremos para el clúster:
>cd /export
>mkdir vol1 vol2 vol3 vol4 vol5
>vi /etc/exports
# Agregamos esto al final del archivo
/export/vol1 *(rw,sync,no_root_squash,no_subtree_check)
/export/vol2 *(rw,sync,no_root_squash,no_subtree_check)
/export/vol3 *(rw,sync,no_root_squash,no_subtree_check)
/export/vol4 *(rw,sync,no_root_squash,no_subtree_check)
/export/vol5 *(rw,sync,no_root_squash,no_subtree_check)
#:wq! ;)
# A continuación, exportamos las particiones
>exportfs -r
Después de toda esta magia, podemos crear PV y PVC en nuestro clúster de esta manera:
PV:
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: PersistentVolume
metadata:
name: nfs-vol1
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteMany
nfs:
# La misma IP que el host NFS al que nos conectamos anteriormente.
server: 10.150.200.22
path: "/export/vol1"
EOF
PVC:
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nfs-pvc
spec:
accessModes:
- ReadWriteMany
storageClassName: ""
resources:
requests:
storage: 10Gi
EOF
Con esto, la historia de la creación de un clúster termina y comienza la historia de su ciclo de vida. Como bono, aquí hay dos comandos CSE útiles que a veces pueden ahorrar o no recursos:
#Увеличиваем размер кластера до 8 воркер нод
>cse cluster resize MyCluster --network k8s_cluster_net --nodes 8
#Выводим ненужные ноды из кластера с их последующим удалением
>vcd cse node delete MyCluster node-1a2v node-6685 --yes
Gracias a todos por su tiempo, si tienen preguntas, no duden en dejar comentarios.
Fuente: habr.com
