Creación de un proyecto

Vamos a trabajar en CRC con el usuario developer:

oc login -u developer -p developer https://api.crc.testing:6443
...
Using project "developer".

Creación de Pods

OpenShift configura por defecto una política de seguridad que sólo nos permite ejecutar contenedores no privilegiados, es decir, donde no se ejecuten procesos o acciones por el usuario con privilegio root (por ejemplo, no utilizan puertos no privilegiados, puertos menores a 1024, o no ejecuta operaciones con el usuario root).

Por esta razón, la mayoría de las imágenes que encontramos en el registro Docker Hub no funcionarán en OpenShift. Es por ello que es necesario usar imágenes de contenedores no privilegiados, por ejemplo creadas con imágenes constructoras (images builder) del propio OpenShift. En nuestro caso, en estos primeros ejemplos, vamos a usar imágenes generadas por la empresa Bitnami, que ya están preparadas para su ejecución en OpenShift.

De forma imperativa podríamos crear un Pod, ejecutando:

oc run pod-nginx --image=bitnami/nginx

Pero, normalmente necesitamos indicar más parámetros en la definición de los recursos. Además, sería deseable crear el Pod de forma declarativa, es decir indicando el estado del recurso que queremos obtener. Para ello, definiremos el recurso, en nuestro caso el Pod, en un fichero de texto en formato YAML. Por ejemplo, podemos tener el fichero pod.yaml:

apiVersion: v1 
kind: Pod 
metadata: 
 name: pod2-nginx 
 labels:
   app: nginx
   service: web
spec: 
 containers:
   - image: bitnami/nginx
     name: contenedor-nginx
     imagePullPolicy: Always

Veamos cada uno de los parámetros que hemos definido:

  • apiVersion: v1: La versión de la API que vamos a usar.
  • kind: Pod: La clase de recurso que estamos definiendo.
  • metadata: Información que nos permite identificar unívocamente el recurso:
    • name: Nombre del pod.
    • labels: Las Labels nos permiten etiquetar los recursos de OpenShift (por ejemplo un pod) con información del tipo clave/valor.
  • spec: Definimos las características del recurso. En el caso de un Pod indicamos los contenedores que van a formar el Pod (sección containers), en este caso sólo uno.
    • image: La imagen desde la que se va a crear el contenedor
    • name: Nombre del contenedor.
    • imagePullPolicy: Si creamos un contenedor, necesitamos tener descargada en un registro interno la imagen. Existe una política de descarga de estas imágenes:
      • La política por defecto es IfNotPresent, que se baja la imagen si no está en el registro interno.
      • Si queremos forzar la descarga desde el repositorio externo, indicaremos el valor Always.
      • Si estamos seguro que la imagen esta en el registro interno, y no queremos bajar la imagen del registro externo, indicamos el valor Never.

Ahora para crear el Pod a partir del fichero YAML, podemos usar dos subcomandos:

  • create: Configuración imperativa de objetos, creamos el objeto (en nuestro caso el pod) pero si necesitamos modificarlo tendremos que eliminarlo y volver a crearlo después de modificar el fichero de definición.

      oc create -f pod.yaml
    
  • apply: Configuración declarativa de objetos, el fichero indica el estado del recurso que queremos tener. Al aplicar los cambios, se realizarán todas las acciones necesarias para llegar al estado indicado. Por ejemplo, si no existe el objeto se creará, pero si existe el objeto, se modificará.

      oc apply -f pod.yaml
    

Otras operaciones con Pods

Podemos ver el estado en el que se encuentra y si está o no listo:

oc get pod

Nota: Sería equivalente usar po, pod o pods.

Si queremos ver más información sobre los Pods, como por ejemplo, saber en qué nodo del cluster se está ejecutando:

oc get pod -o wide

Para obtener información más detallada del Pod:

oc describe pod pod-nginx

Podríamos editar el Pod y ver todos los atributos que definen el objeto, la mayoría de ellos con valores asignados automáticamente por el propio OpenShift y podremos actualizar ciertos valores:

oc edit pod pod-nginx

Normalmente no se interactúa directamente con el Pod a través de una shell, pero sí se obtienen directamente los logs al igual que se hace en docker:

oc logs pod/pod-nginx

En el caso poco habitual de que queramos ejecutar alguna orden adicional en el Pod, podemos utilizar el comando exec, por ejemplo, en el caso particular de que queremos abrir una shell de forma interactiva:

oc exec -it pod-nginx -- /bin/bash

Otra manera de acceder al pod:

oc rsh pod-nginx

Podemos acceder a la aplicación, redirigiendo un puerto de localhost al puerto de la aplicación:

oc port-forward pod-nginx 8080:8080

Y accedemos al servidor web en la url http://localhost:8080.

NOTA: Esta no es la forma con la que accedemos a las aplicaciones en OpenShift. Para el acceso a las aplicaciones usaremos un recurso llamado Service. Con la anterior instrucción lo que estamos haciendo es una redirección desde localhost el puerto 8080 al puerto 8080 del Pod y es útil para pequeñas pruebas de funcionamiento, nunca para acceso real a un servicio.

Para obtener las etiquetas de los Pods que hemos creado:

oc get pod --show-labels

Las etiquetas las hemos definido en la sección metadata del fichero YAML, pero también podemos añadirlos a los Pods ya creados:

oc label pod pod-nginx service=web --overwrite=true

Las etiquetas son muy útiles, ya que permiten seleccionar un recurso determinado (en el clúster puede haber cientos o miles de objetos). Por ejemplo para visualizar los Pods que tienen una etiqueta con un determinado valor:

oc get pod -l service=web

También podemos visualizar los valores de las etiquetas como una nueva columna:

oc get pod -Lservice

Y por último, eliminamos el Pod mediante:

oc delete pod pod-nginx

Actualizado: