# Hello Minikube

LLMS index: [llms.txt](/llms.txt)

---

<!-- overview -->

Este tutorial muestra como ejecutar una aplicación Node.js Hola Mundo en Kubernetes utilizando 
[Minikube](/docs/setup/learning-environment/minikube) y Katacoda.
Katacoda provee un entorno de Kubernetes desde el navegador.


<div class="alert alert-info" role="note"><h4 class="alert-heading">Nota:</h4>También se puede  seguir este tutorial si se ha instalado <a href="/docs/tasks/tools/install-minikube/">Minikube localmente</a>.</div>




## Objetivos


* Desplegar una aplicación Hola Mundo en Minikube.
* Ejecutar la aplicación.
* Ver los logs de la aplicación.



## Antes de empezar


Este tutorial provee una imagen de contenedor construida desde los siguientes archivos:


















<div class="highlight code-sample">
    <div class="copy-code-icon">
    <a href="https://raw.githubusercontent.com/kubernetes/website/main/content/es/examples/minikube/server.js" download="minikube/server.js"><code>minikube/server.js</code>
    </a><img src="/images/copycode.svg" class="icon-copycode" onclick="copyCode('minikube-server-js')" title="Copiar minikube/server.js al portapapeles"></img></div>
    <div class="includecode" id="minikube-server-js"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kd">var</span> <span class="nx">http</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;http&#39;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">var</span> <span class="nx">handleRequest</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">request</span><span class="p">,</span> <span class="nx">response</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;Received request for URL: &#39;</span> <span class="o">+</span> <span class="nx">request</span><span class="p">.</span><span class="nx">url</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="nx">response</span><span class="p">.</span><span class="nx">writeHead</span><span class="p">(</span><span class="mi">200</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="nx">response</span><span class="p">.</span><span class="nx">end</span><span class="p">(</span><span class="s1">&#39;Hello World!&#39;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">};</span>
</span></span><span class="line"><span class="cl"><span class="kd">var</span> <span class="nx">www</span> <span class="o">=</span> <span class="nx">http</span><span class="p">.</span><span class="nx">createServer</span><span class="p">(</span><span class="nx">handleRequest</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="nx">www</span><span class="p">.</span><span class="nx">listen</span><span class="p">(</span><span class="mi">8080</span><span class="p">);</span>
</span></span></code></pre></div></div>
</div>


















<div class="highlight code-sample">
    <div class="copy-code-icon">
    <a href="https://raw.githubusercontent.com/kubernetes/website/main/content/es/examples/minikube/Dockerfile" download="minikube/Dockerfile"><code>minikube/Dockerfile</code>
    </a><img src="/images/copycode.svg" class="icon-copycode" onclick="copyCode('minikube-dockerfile')" title="Copiar minikube/Dockerfile al portapapeles"></img></div>
    <div class="includecode" id="minikube-dockerfile"><pre tabindex="0"><code class="language-conf" data-lang="conf">FROM node:6.14.2
EXPOSE 8080
COPY server.js .
CMD [ &#34;node&#34;, &#34;server.js&#34; ]
</code></pre></div>
</div>

Para más información sobre el comando `docker build`, lea la [documentación de Docker ](https://docs.docker.com/engine/reference/commandline/build/).



<!-- lessoncontent -->

## Crear un clúster Minikube

1. Haz clic en **Launch Terminal**

    
    


    
<div class="alert alert-info" role="note"><h4 class="alert-heading">Nota:</h4>Si se tiene instalado Minikube local, ejecutar <code>minikube start</code>.</div>


2. Abrir el tablero de Kubernetes dashboard en un navegador:

    ```shell
    minikube dashboard
    ```

3. Solo en el entorno de Katacoda: En la parte superior de la terminal, haz clic en el símbolo + y luego clic en **Select port to view on Host 1**.

4. Solo en el entorno de Katacoda: Escribir `30000`, y hacer clic en **Display Port**.

## Crear un Deployment

Un [*Pod*](/docs/concepts/workloads/pods/pod/) en Kubernetes es un grupo de uno o más contenedores,
asociados con propósitos de administración y redes. El Pod en este tutorial tiene solo un contenedor.
Un [*Deployment*](/docs/concepts/workloads/controllers/deployment/) en Kubernetes verifica la salud del Pod y reinicia su contenedor si este es eliminado. Los Deployments son la manera recomendada de manejar la creación y escalación.

1. Ejecutar el comando `kubectl create` para crear un Deployment que maneje un Pod. El Pod ejecuta un contenedor basado en la imagen proveida por Docker.

    ```shell
    kubectl create deployment hello-node --image=registry.k8s.io/e2e-test-images/agnhost:2.53 -- /agnhost netexec --http-port=8080
    ```

2. Ver el Deployment:

    ```shell
    kubectl get deployments
    ```

    El resultado es similar a:

    ```
    NAME         READY   UP-TO-DATE   AVAILABLE   AGE
    hello-node   1/1     1            1           1m
    ```

3. Ver el Pod:

    ```shell
    kubectl get pods
    ```

    El resultado es similar a:

    ```
    NAME                          READY     STATUS    RESTARTS   AGE
    hello-node-5f76cf6ccf-br9b5   1/1       Running   0          1m
    ```

4. Ver los eventos del clúster:

    ```shell
    kubectl get events
    ```

5. Ver la configuración `kubectl`:

    ```shell
    kubectl config view
    ```

    
<div class="alert alert-info" role="note"><h4 class="alert-heading">Nota:</h4>Para más información sobre el comando <code>kubectl</code>, ver <a href="/docs/user-guide/kubectl-overview/">kubectl overview</a>.</div>


## Crear un Service

Por defecto, el Pod es accedido por su dirección IP interna dentro del clúster de Kubernetes, para hacer que el contenedor `hello-node` sea accesible desde afuera de la red virtual Kubernetes, se debe exponer el Pod como un
 [*Service*](/docs/concepts/services-networking/service/) de Kubernetes.

1. Exponer el Pod a la red pública de internet utilizando el comando `kubectl expose`:

    ```shell
    kubectl expose deployment hello-node --type=LoadBalancer --port=8080
    ```

    El flag `--type=LoadBalancer` indica que se quiere exponer el Service fuera del clúster.

2. Ver el Service creado:

    ```shell
    kubectl get services
    ```

    El resultado es similar a:

    ```
    NAME         TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
    hello-node   LoadBalancer   10.108.144.78   <pending>     8080:30369/TCP   21s
    kubernetes   ClusterIP      10.96.0.1       <none>        443/TCP          23m
    ```

    Para los proveedores Cloud que soportan balanceadores de carga, una dirección IP externa será provisionada para acceder al servicio, en Minikube, el tipo `LoadBalancer` permite que el servicio sea accesible a través del comando `minikube service`.

3. Ejecutar el siguiente comando:

    ```shell
    minikube service hello-node
    ```

4. Solo en el entorno de Katacoda: Hacer clic sobre el símbolo +, y luego en **Select port to view on Host 1**.

5. Solo en el entorno de Katacoda: Anotar el puerto de 5 dígitos ubicado al lado del valor de `8080` en el resultado de servicios. Este número de puerto es generado aleatoriamente y puede ser diferente al indicado en el ejemplo. Escribir el número de puerto en el cuadro de texto y hacer clic en Display Port. Usando el ejemplo anterior, usted escribiría `30369`.

    Esto abre una ventana de navegador que contiene la aplicación y muestra el mensaje "Hello World".

## Habilitar Extensiones

Minikube tiene un conjunto  de <a class='glossary-tooltip' title='Son recursos que amplían la funcionalidad de Kubernetes.' data-bs-toggle='tooltip' data-bs-placement='top' href='/es/docs/concepts/cluster-administration/addons/' target='_blank' aria-label='Extensiones'>Extensiones</a> que pueden ser habilitados y desahabilitados en el entorno local de Kubernetes.

1. Listar las extensiones soportadas actualmente:

    ```shell
    minikube addons list
    ```

    El resultado es similar a:

    ```
    addon-manager: enabled
    dashboard: enabled
    default-storageclass: enabled
    efk: disabled
    freshpod: disabled
    gvisor: disabled
    helm-tiller: disabled
    ingress: disabled
    ingress-dns: disabled
    logviewer: disabled
    metrics-server: disabled
    nvidia-driver-installer: disabled
    nvidia-gpu-device-plugin: disabled
    registry: disabled
    registry-creds: disabled
    storage-provisioner: enabled
    storage-provisioner-gluster: disabled
    ```

2. Habilitar una extensión, por ejemplo, `metrics-server`:

    ```shell
    minikube addons enable metrics-server
    ```

    El resultado es similar a:

    ```
    metrics-server was successfully enabled
    ```

3. Ver el Pod y Service creados:

    ```shell
    kubectl get pod,svc -n kube-system
    ```

    El resultado es similar a:

    ```
    NAME                                        READY     STATUS    RESTARTS   AGE
    pod/coredns-5644d7b6d9-mh9ll                1/1       Running   0          34m
    pod/coredns-5644d7b6d9-pqd2t                1/1       Running   0          34m
    pod/metrics-server-67fb648c5                1/1       Running   0          26s
    pod/etcd-minikube                           1/1       Running   0          34m
    pod/influxdb-grafana-b29w8                  2/2       Running   0          26s
    pod/kube-addon-manager-minikube             1/1       Running   0          34m
    pod/kube-apiserver-minikube                 1/1       Running   0          34m
    pod/kube-controller-manager-minikube        1/1       Running   0          34m
    pod/kube-proxy-rnlps                        1/1       Running   0          34m
    pod/kube-scheduler-minikube                 1/1       Running   0          34m
    pod/storage-provisioner                     1/1       Running   0          34m

    NAME                           TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)             AGE
    service/metrics-server         ClusterIP   10.96.241.45    <none>        80/TCP              26s
    service/kube-dns               ClusterIP   10.96.0.10      <none>        53/UDP,53/TCP       34m
    service/monitoring-grafana     NodePort    10.99.24.54     <none>        80:30002/TCP        26s
    service/monitoring-influxdb    ClusterIP   10.111.169.94   <none>        8083/TCP,8086/TCP   26s
    ```

4. Deshabilitar `metrics-server`:

    ```shell
    minikube addons disable metrics-server
    ```

    El resultado es similar a:

    ```
    metrics-server was successfully disabled
    ```

## Limpieza

Ahora se puede eliminar los recursos creados en el clúster:

```shell
kubectl delete service hello-node
kubectl delete deployment hello-node
```

Opcional, detener la máquina virtual de Minikube:

```shell
minikube stop
```

Opcional, eliminar la máquina virtual de Minikube:

```shell
minikube delete
```



## ¿Qué sigue?


* Leer más sobre [Deployments](/docs/concepts/workloads/controllers/deployment/).
* Leer más sobre [Desplegando aplicaciones](/docs/tasks/run-application/run-stateless-application-deployment/).
* Leer más sobre [Services](/docs/concepts/services-networking/service/).
