Ya que tenemos desplegado Kubernetes en OpenStack vamos a aprovechar las capacidades de este para desplegar nuestras aplicaciones.
Configurar Kubernetes para utilizar OpenStack
El primer paso que tenemos que dar es configurar nuestras credenciales de OpenStack en Kubernetes. Para ello editamos el fichero /etc/kubernetes/cloud_config y añadimos las siguientes líneas:
[Global] auth-url=http://AUTH_URL:5000/v3 username=demo password=s3cr3t region=RegionOne tenant-id=d245f207e6fc4e56b5a1d23e0716ad70 domain-name=Default
De esta forma el API de Kubernetes puede comunicar con el API de OpenStack y configurar los servicios.
El campo domain-name solo es necesario si usamos API v3 de OpenStack, como indica la AUTH_URL.
Ahora debemos cambiar añadir lo siguiente:
KUBE_API_ARGS=[...] --cloud-provider=openstack --cloud-config=/etc/kubernetes/cloud_config
al arranque de nuestro Kubernetes apiserver.
Igualmente en /etc/kubernetes/manifests/kube-controller-manager.yaml:
- [...] - --cloud_config=/etc/sysconfig/kube_openstack_config - --cloud_provider=openstack
Aquí la cosa se complica y depende de tu instalación. Si tienes el binario en el sistema solo tienes que ajustar en /etc/kubernetes/* pero si estás usando contenedores, deberás volver a construir los contenedores y añadir estos parámetros.
Utilizar el LBaaS de OpenStack en Kubernetes
Para habilitar el balanceador debemos añadir los siguientes datos en nuestro fichero de cloud_config:
- La subred donde se va a construir el balanceador.
- Debemos indicar que maneje los security groups.
- El security group que se debe aplicar al puerto del balanceador. Es el vip_port_id anterior.
- Y por último la id de la red de la que tomará la IP flotante.
Deberiamos tener algo así:
[LoadBalancer] lb-version=v2 subnet-id=82f277d7-1b29-49b3-94ee-40424c4e36d9 manage-security-groups=true node-security-group=b063453a-41fb-47e5-ac3e-fbe270fc2232 floating-network-id=ccee1f8b-c813-4a69-a072-ee1e10aba677
¿Qué tiene que pasar? Ahora, cuando en el service pongamos LoadBalancer Kubernetes utilizará las credenciales que le hemos proporcionado y construirá un balanceador completo para la aplicación. De la red que le hemos proporcionado cogerá un IP flotante libre. Esta es la IP a la que debemos atacar cuando queramos utilizar el servicio recién publicado.
Self Service Provisioning
Para que nuestras aplicaciones conserven los datos que generen en su tiempo de vida es necesario proporcionarles volúmenes de persistencia. Para ello comenzamos creando un nuevo objeto de Kubernetes llamado StorageClass donde vamos a definir como debe pedir el volumen a OpenStack y como vamos a llamarlo desde nuestra aplicación. Podemos definir tantos como sistemas de aprovisionamiento tengamos. El StorageClass tiene esta pinta:
kind: StorageClass apiVersion: storage.k8s.io/v1beta1 metadata: name: gold #-> este es el nombre con el que nos referiremos a el cuando hagamos el claim provisioner: kubernetes.io/cinder parameters: type: kube-storage #-> Esto hay que definirlo en openstack availability: nova
Como vemos los dos valores que tenemos que definir son name y type. Entonces, cuando queramos que nuestra aplicación haga uso de esta persistencia dinámica usaremos algo como esto:
kind: PersistentVolumeClaim apiVersion: v1 metadata: name: claim1 annotations: volume.beta.kubernetes.io/storage-class: gold #-> Este es el nombre que le hemos dado spec: accessModes: - ReadWriteOnce resources: requests: storage: 30Gi
Antes había que hacer uso de PersistentVolume pero está siendo reemplazado por este nuevo objeto que creará el volumen dinámicamente.