Skip to content

Openshift Container Platform Labs

IMPORTANTE

Adapte las instrucciones para su sistema operativo.

Hello World (podinfo)

  1. Ingrese a su plataforma de Openshift via CLI

  2. Cree un proyecto llamado devuserXX, remplace XX por el número asignado a su usuario.

    oc new-project devuserXX-hello
    

  3. Cree la definición del recurso tipo deployment haciendo uso del comando oc. Cree todo el siguiente ejercicio en un directorio llamado hello-manifests.

    mkdir hello-manifests
    
    oc create deployment  podinfo --image=docker.io/stefanprodan/podinfo:latest --port=9898 -o yaml --dry-run=client > deployment-hello.yaml
    

  4. Explore el archivo creado.

    cat deployment-hello.yaml
    
    Salida similar:
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      creationTimestamp: null
      labels:
        app: podinfo
      name: podinfo
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: podinfo
      strategy: {}
      template:
        metadata:
          creationTimestamp: null
          labels:
            app: podinfo
        spec:
          containers:
          - image: docker.io/stefanprodan/podinfo:latest
            name: podinfo
            ports:
            - containerPort: 9898
            resources: {}
    
    Note la cantidad de contenedores [1] y la sección resources vacía. Esto nos indica que no se tiene definos límites de recursos para el contenedor adentro del pod llamada podinfo.

    RECOMENDACIÓN

    Todas las cargas de trabajo deben tener recursos definidos.

  5. Modifique la sección de resouces con el siguinete contenido, asegurese de utilizar la indentación adecuada.

          resources:
            requests:
              cpu: 50m
              memory: 32Mi
            limits:
              cpu: 100m
              memory: 128Mi
    

  6. El resultado final será similar a:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      creationTimestamp: null
      labels:
        app: podinfo
      name: podinfo
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: podinfo
      strategy: {}
      template:
        metadata:
          creationTimestamp: null
          labels:
            app: podinfo
        spec:
          containers:
          - image: docker.io/stefanprodan/podinfo:latest
            name: podinfo
            ports:
            - containerPort: 9898
            resources:
              requests:
                cpu: 50m
                memory: 32Mi
              limits:
                cpu: 100m
                memory: 128Mi
    

  7. Aplique los cambios en su ambiente.

    oc apply -f deployment-hello.yaml
    

  8. Liste los pods en ejecución.

    oc get pods
    
    Salida similar a:
    NAME                      READY   STATUS    RESTARTS   AGE
    podinfo-c57b77b97-5j9b7   1/1     Running   0          55s
    

  9. Liste los pods en ejecución y sus etiquetas.

    oc get pods --show-labels
    
    Salida similar a:
    NAME                      READY   STATUS    RESTARTS   AGE     LABELS
    podinfo-c57b77b97-5j9b7   1/1     Running   0          2m18s   app=podinfo,pod-template-hash=c57b77b97
    

  10. Obtener los pod(s) con la etiqueta app=podinfo.

    oc get pods -l app=podinfo
    
    Salida similar:
    NAME                      READY   STATUS    RESTARTS   AGE
    podinfo-c57b77b97-5j9b7   1/1     Running   0          4m10s
    

  11. Obtenga los logs de la ejeción de los pods con esa etiqueta.

    oc logs -l app=podinfo
    
    Salida similar:
      {"level":"info","ts":"2025-08-13T03:52:45.944Z","caller":"podinfo/main.go:153","msg":"Starting podinfo","version":"6.9.1","revision":"cdd09cdd3daacc3082d5a78062ac493806f7abd0","port":"9898"}
      {"level":"info","ts":"2025-08-13T03:52:45.945Z","caller":"http/server.go:224","msg":"Starting HTTP Server.","addr":":9898"}
    
    Puede observar que se ha ejecutado de forma satisfactoria.

  12. Obtenga información acerca de los recursos del pod.

    oc describe pod -l app=podinfo
    
    En la salida identifique la sección:
    Containers:
    podinfo:
      Container ID:   cri-o://a533a78bbefd0cc6a0cdff9dd2a695d9b1ac73ff5a99e8629b8d8bcfcb785782
      Image:          docker.io/stefanprodan/podinfo:latest
      Image ID:       docker.io/stefanprodan/podinfo@sha256:262578cde928d5c9eba3bce079976444f624c13ed0afb741d90d5423877496cb
      Port:           9898/TCP
      Host Port:      0/TCP
      State:          Running
        Started:      Tue, 12 Aug 2025 21:52:45 -0600
      Ready:          True
      Restart Count:  0
      Limits:
        cpu:     100m
        memory:  128Mi
      Requests:
        cpu:        50m
        memory:     32Mi
      Environment:  <none>
      Mounts:
        /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-k4rbm (ro)
    
    Observe los recursos asignados a este pod.

  13. Modifique el archivo de definición del recurso deployment y remplace el valor de replicas a 2.

    spec:
      replicas: 2
    

  14. Valida las diferencias entre el estado deseado y el estado actual.

    oc diff -f deployment-hello.yaml
    
    Salida similar:
            kubectl.kubernetes.io/last-applied-configuration: |
            {"apiVersion":"apps/v1","kind":"Deployment","metadata":{"annotations":{},"creationTimestamp":null,"labels":{"app":"podinfo"},"name":"podinfo","namespace":"devuser0-hello"},"spec":{"replicas":1,"selector":{"matchLabels":{"app":"podinfo"}},"strategy":{},"template":{"metadata":{"creationTimestamp":null,"labels":{"app":"podinfo"}},"spec":{"containers":[{"image":"docker.io/stefanprodan/podinfo:latest","name":"podinfo","ports":[{"containerPort":9898}],"resources":{"limits":{"cpu":"100m","memory":"128Mi"},"requests":{"cpu":"50m","memory":"32Mi"}}}]}}}}
        creationTimestamp: "2025-08-13T03:52:42Z"
      -  generation: 4
      +  generation: 5
        labels:
          app: podinfo
        name: podinfo
      @@ -15,7 +15,7 @@
        uid: cdbbefac-206d-4988-ae1b-6254f284177c
      spec:
        progressDeadlineSeconds: 600
      -  replicas: 1
      +  replicas: 2
        revisionHistoryLimit: 10
        selector:
          matchLabels:
    
    Note el cambio que se aplicará antes de ejecutarlo: replicas = 1 -> 2.

  15. Aplique los cambios en su ambiente.

    oc apply -f deployment-hello.yaml
    
    Salida:
    deployment.apps/podinfo configured
    

  16. Liste los pods nuevamnete con las mimas etiquetas.

    oc get pods -l app=podinfo
    
    Salida:
    NAME                       READY   STATUS    RESTARTS   AGE
    podinfo-58954d6f47-jvp72   1/1     Running   0          5m2s
    podinfo-58954d6f47-pp7lv   1/1     Running   0          29s
    

  17. Escoja uno de los dos pods y elimine uno.

    oc delete pod podinfo-XXXXX
    

  18. Liste los pods nuevamnete con las mimas etiquetas.

    oc get pods -l app=podinfo
    
    Deberá observar la misma cantidad de pods 2.

  19. Cree la definición de un recurso tipo service para el recurso deployment a partir del comando oc.

    oc expose deployment podinfo -o yaml --dry-run=client > service-hello.yaml
    

  20. Explore la definición del servicio.

    cat sevice-hello.yaml
    
    Salida:
    apiVersion: v1
    kind: Service
    metadata:
      creationTimestamp: null
      labels:
        app: podinfo
      name: podinfo
    spec:
      ports:
      - port: 9898
        protocol: TCP
        targetPort: 9898
      selector:
        app: podinfo
    status:
      loadBalancer: {}
    

  21. Aplique los cambios en su ambiente.

    oc apply -f service-hello.yaml
    

  22. Observer el recurso creado service.

    oc describe service podinfo
    
    Salida:
    Name:                     podinfo
    Namespace:                devuser0-hello
    Labels:                   app=podinfo
    Annotations:              <none>
    Selector:                 app=podinfo
    Type:                     ClusterIP
    IP Family Policy:         SingleStack
    IP Families:              IPv4
    IP:                       X.X.X.X
    IPs:                      X.X.X.X
    Port:                     <unset>  9898/TCP
    TargetPort:               9898/TCP
    Endpoints:                Y.Y.Y.Y:9898,Z.Z.Z.Z:9898
    Session Affinity:         None
    Internal Traffic Policy:  Cluster
    Events:                   <none>
    

  23. Cree la definición de un recurso tipo route para exponer el servicio al exterior utilizando el comando oc. bash oc expose service podinfo -o yaml --dry-run=client > route-hello.yaml

  24. Explore la definición del servicio.

    cat route-hello.yaml
    
    Salida:
    apiVersion: route.openshift.io/v1
    kind: Route
    metadata:
      creationTimestamp: null
      labels:
        app: podinfo
      name: podinfo
    spec:
      port:
        targetPort: 9898
      to:
        kind: ""
        name: podinfo
        weight: null
    

  25. Aplique los cambios en su ambiente.

    oc apply -f route-hello.yaml
    

  26. Obtener el host asignado e la ruta.

    oc get route podinfo
    
    Salida: NAME HOST/PORT PATH SERVICES PORT TERMINATION WILDCARD podinfo podinfo-devuser0-hello.apps.XXXXX podinfo 9898 None

  27. Valide el acceso a su aplicación via CLI.

    cur; http://podinfo-devuser0-hello.apps.XXXXX
    
    Salida:
    {
    "hostname": "podinfo-58954d6f47-pp7lv",
    "version": "6.9.1",
    "revision": "cdd09cdd3daacc3082d5a78062ac493806f7abd0",
    "color": "#34577c",
    "logo": "https://raw.githubusercontent.com/stefanprodan/podinfo/gh-pages/cuddle_clap.gif",
    "message": "greetings from podinfo v6.9.1",
    "goos": "linux",
    "goarch": "arm64",
    "runtime": "go1.24.5",
    "num_goroutine": "6",
    "num_cpu": "4"
    }%
    

  28. Utilizando el browser. POdinfo

  29. Eliminar todo el proyecto.

    oc delete project devuserXX-hello
    
    Puede tomar unos minutos.

  30. Valide el acceso a su aplicación via CLI.

    curl http://podinfo-devuser0-hello.apps.XXXXX
    
    Debe mostrar error.

  31. Cree de nuevo todos los recursos.

    oc new-project devuserXX-hello
    
    oc apply -f hello-manifests
    
    Salida:
    deployment.apps/podinfo created
    route.route.openshift.io/podinfo created
    service/podinfo created
    

  32. Valide el acceso a su aplicación via CLI.

    curl http://podinfo-devuser0-hello.apps.XXXXX
    
    Salida:
    {
    "hostname": "podinfo-58954d6f47-pp7lv",
    "version": "6.9.1",
    "revision": "cdd09cdd3daacc3082d5a78062ac493806f7abd0",
    "color": "#34577c",
    "logo": "https://raw.githubusercontent.com/stefanprodan/podinfo/gh-pages/cuddle_clap.gif",
    "message": "greetings from podinfo v6.9.1",
    "goos": "linux",
    "goarch": "arm64",
    "runtime": "go1.24.5",
    "num_goroutine": "6",
    "num_cpu": "4"
    }%
    

  33. Modique el recurso tipo deployment agregando confguración por medio de variables de entorno. Agregue la sección env en el contenedor podinfo dentro del template del pod. Se ha omitido el resto del recurso.

        spec:
          containers:
          - image: quay.io/erickeliseo/stefanprodan/podinfo
            name: podinfo
            env:
              - name: PODINFO_UI_MESSAGE
                value: DEMO-OCP
    

  34. Aplique los cambios en su ambiente.

    oc apply -f deployment-hello.yaml
    
    Espere a que los pods estén en estado Ready.

  35. Valide el acceso a su aplicación via CLI.

    curl http://podinfo-devuser0-hello.apps.XXXXX
    
    Salida:
    {
    "hostname": "podinfo-955b49456-2b92f",
    "version": "6.9.1",
    "revision": "cdd09cdd3daacc3082d5a78062ac493806f7abd0",
    "color": "#34577c",
    "logo": "https://raw.githubusercontent.com/stefanprodan/podinfo/gh-pages/cuddle_clap.gif",
    "message": "DEMO-OCP",
    "goos": "linux",
    "goarch": "arm64",
    "runtime": "go1.24.5",
    "num_goroutine": "7",
    "num_cpu": "4"
    }%
    
    Note el valor en message = DEMO-OCP.

  36. Agregue a su definición del recurso tipo deployment validaciones/checks que se ejecutarán en diferentes momentos del inicio,disponibilidad y vide de los pods. Agregue la siguiente sección en la sección de contenedor podinfo al mismo nivel que resources y env. Se ha omitido el resto del recurso.

            livenessProbe:
              exec:
                command:
                - podcli
                - check
                - http
                - localhost:9898/healthz
            readinessProbe:
              exec:
                command:
                - podcli
                - check
                - http
                - localhost:9898/healthz
            startupProbe:
              exec:
                command:
                - podcli
                - check
                - http
                - localhost:9898/healthz
    

    RECOMENDACIÓN

    Todas las cargas de trabajo deben tener validaciones definidas.

  37. Aplique los cambios en su ambiente.

    oc apply -f deployment-hello.yaml
    
    Note que puede tomar unos segundos dependiendo de las validaciones realizadas.

  38. Puede obtener los eventos de forma constante con el comando:

    oc get events  --sort-by='.lastTimestamp' -w
    
    Puede Presionar Ctrl+C para detener el proceso.

  39. Elimine nuevamente el proyecto.

    oc delete project devuserXX-hello