Hoy empiezo con OpenShift

A√Īo nuevo, serie nueva ūüėĚ y es que estos d√≠as he estado entreteni√©ndome con OpenShift, a mi modo, viendo c√≥mo empezar a usar esta plataforma a partir de un ejemplo, mi Tour of heroes. Hoy quiero compartir contigo el primer art√≠culo de esta serie por si t√ļ tambi√©n quieres aprender sobre ello.

¬ŅQu√© es Openshift?

Si te ha tocado trabajar con contenedores o Kubernetes es muy probable que hayas o√≠do hablar de OpenShift, pero quiz√°s no tengas claro qu√© es lo que significa o porque debes saber sobre ello. Si vienes de Kubernetes te habr√°s dado cuenta de que este es s√ļper potente, pero requiere que tengas conocimientos avanzados en diferentes √°reas, como en redes y seguridad para ‚Äúhacer las cosas bien‚ÄĚ. OpenShift es la propuesta de Kubernetes de Red Hat, la cual te da una capa por encima de tu cl√ļster, ayud√°ndote a gestionar estos aspectos avanzados, adem√°s de una rica interfaz. Son muchas las empresas que optan por este modelo, con el objetivo de asegurarse un correcto uso de Kubernetes, adem√°s del respaldo de Red Hat y no solamente de la comunidad. Este, obviamente, es de pago aunque en este art√≠culo quiero mostrarte c√≥mo montar un entorno de desarrollo sin coste alguno para ti.

Entorno de desarrollo de OpenShift 4.x con CodeReady Containers

Si bien en la versión 3.x de OpenShift se utilizaba minishift como entorno de desarrollo, en la versión 4.x tenemos CodeReady Containers o CRC. Para poder descargarlo primero debes crearte una cuenta de Red Hat a través de este enlace, lo cual es totalmente gratuito. Una vez la tengas podrás descargar el instalador para tu sistema operativo en este otro enlace.

Download OpenShift Local CRC

En la misma página, copia también el pull secret, el cual se te pedirá al ejecutar el segundo de estos dos comandos:

# setup local cluster
crc setup
# start local cluster
crc start

Este proceso puede llevar unos minutos. Cuando finalice ver√°s algo como esto:

Started the OpenShift cluster.
The server is accessible via web console at:
  https://console-openshift-console.apps-crc.testing
Log in as administrator:
  Username: kubeadmin
  Password: 87z5d-wG6Sf-iEPMX-sMnhQ
Log in as user:
  Username: developer
  Password: developer
Use the 'oc' command line interface:
  $ eval $(crc oc-env)
  $ oc login -u developer https://api.crc.testing:6443

Como puedes ver, se han generados dos usuarios: un administrador y un desarrollador. Podemos decir que son los dos tipos principales y en base a estos dos roles se reparte incluso la interfaz web. También se ha descargado oc, nuestro kubectl en OpenShift, que a través de eval se configura como parte de la variable de entorno PATH para poder usarlo cómodamente en el terminal actual.

Aplicación de ejemplo

Ahora que ya tienes un cl√ļster en local, lo siguiente es desplegar una aplicaci√≥n de ejemplo. Para ello, voy a volver a apoyarme en mi Tour of heroes, con unos manifiestos que cree para Kubernetes (ligeramente modificados), que puedes encontrar en este repo de GitHub. Mi objetivo va a ser desplegarlos, sin errores, y acceder a la aplicaci√≥n de la misma forma que lo har√≠a en un cl√ļster de Kubernetes sin OpenShift.

Lo primero que voy a hacer es iniciar sesión con el usuario developer:

# configure oc command
eval $(crc oc-env)
# login as developer
oc login -u developer https://api.crc.testing:6443

En esta plataforma se trabaja por proyectos (que en realidad son nuestros namespaces de Kubernetes), por lo que creamos uno para alojar nuestros recursos:

# Create a new project
oc new-project tour-of-heroes

Ahora, al igual que lo haría con kubectl, utilizo oc para desplegar los manifiestos de mi ejemplo:

# Deploy resources in a project
oc create -f tour-of-heroes/ --recursive

No hace falta indicar el namespace proyecto, ya que una vez creado/seleccionado todas las operaciones se hacen sobre él. Cuando ejecutes este comando verás algunos avisos relacionados con algunos de los recursos que estás desplegando:

oc create – warnings

Esto es así porque OpenShift viene de base con lo que se conoce como Security Context Constraints o SCC, que comentaré más abajo. Para ver el estado de lo desplegado puedes usar el siguiente comando:

# Check project status
oc status

En este caso comprobar√°s que algo no va bien:

Resultado de oc status

Si revisas los logs del despliegue de tour-of-heroes-web comprobarás que estos están intentando crear un archivo en el sistema de ficheros (el comentado en este artículo anterior) y no tienen permiso:

oc logs deploy/tour-of-heroes-web

El error es como el que sigue:

Resultado de oc logs deploy/tour-of-heroes-web

Dentro de los constraints existen diferentes configuraciones. Para saber cu√°l es la que est√° afectando puedes usar oc adm policy scc-subject-review de la siguiente forma:

oc get pod -l app=tour-of-heroes-web -o yaml | oc adm policy scc-subject-review -f -

Esto nos devolver√° algo como lo siguiente:

SCC que est√° afectando a los pods de tour-of-heroes-web

Restricted-v2 es el grupo por defecto y el más restrictivo que viene de caja, al menos en la versión 4.11, que es la actual en el momento de este artículo. Si quisieras cambiarlo debes iniciar sesión como administrador, crear una service account, asociar el SCC que quieres que aplique sobre esta y utilizar la misma con tu despliegue:

# Login as kubeadmin
oc login -u kubeadmin -p 87z5d-wG6Sf-iEPMX-sMnhQ https://api.crc.testing:6443
# Create service account
oc create sa tour-of-heroes-sa
# Add anyuid security context
oc adm policy add-scc-to-user anyuid -z tour-of-heroes-sa
# Assign sa to the deployment
oc set sa deploy tour-of-heroes-web tour-of-heroes-sa

Si vuelves a comprobar ver√°s que ahora todo est√° en estado Running.

La otra opci√≥n, en muchas ocasiones la recomendada, ser√° ce√Īirte a las restricciones que te dan estas reglas para cumplir con los m√≠nimos de seguridad definidos por la empresa. Sin embargo, para este ejemplo, solo quer√≠a que supieras que existen y que son ajustables.

Routes en OpenShift

Para terminar con el art√≠culo de hoy lo √ļltimo que quiero conseguir es poder acceder a la API de Tour of heroes y al frontal web. Si recuperas los objetos Service generados son todos del tipo ClusterIP, es decir que s√≥lo se puede acceder a ellos desde dentro del cl√ļster:

# Get services
oc get services

En OpenShift existe el concepto de rutas (Routes) que nos recuerda a las reglas de Ingress en Kubernetes, pero sin tener que instalar ning√ļn Ingress Controller. Para exponer tanto la API como la web puedes lanzar lo siguiente:

# Expose services
oc expose service tour-of-heroes-web -l route=external --name=tour-of-heroes-web
oc expose service tour-of-heroes-api -l route=external --name=tour-of-heroes-api

Con este otro comando puedes recuperar las rutas generadas:

# See routes
oc get routes

En CodeReady Containers el dominio proporcionado es *.apps-crc.testing (configurado de manera automática para ti en el /etc/hosts de tu máquina), por lo que puedes acceder a lo expuesto a través de estas URLs:

# Call services
curl http://tour-of-heroes-web-tour-of-heroes.apps-crc.testing
curl http://tour-of-heroes-api-tour-of-heroes.apps-crc.testing/api/hero

Puedes utilizar este archivo para incluir algunos héroes en la base de datos a través de la API y comprobar que funciona correctamente.

Todo lo comentado en este artículo puedes visualizarlo de una forma muy rica a través de la interfaz web, la cual puedes lanzar ejecutando este comando:

# Launch web UI
crc console

o bien a través de https://console-openshift-console.apps-crc.testing, que aparecía como resultado de ejecutar crc start.

Para eliminar el proyecto puedes hacerlo así:

# Delete project
oc delete project tour-of-heroes

Y, por √ļltimo, si quieres parar o eliminar el cl√ļster completo estos dos comandos son los que necesitas:

# stop cluster
crc stop
# delete cluster
crc delete

¬°Saludos!