Puedes empezar consiguiendo un entorno de desarrollo en Katacoda:
- Entra en Katacoda
- Pulsa el botón de "Start scenario"
- Crea tu cluster:
minikube start --wait=false
- Comprueba que tu entorno existe
kubectl version
- Crea un namespace (
cat << EOF
es un mecanismo para crear ficheros)
cat << EOF > demo-ns.yaml
apiVersion: v1
kind: Namespace
metadata:
name: demo-$USER
EOF
kubectl apply -f demo-ns.yaml
- Ahora define el
deployment
y lánzalo. En este deployment tenemos un contenedor principal (la aplicación) escuchando el puerto 3000. Pero ponemos también otro contenedor connginx
en el puerto 80 que servirá para recibir las peticiones exteriores, filtrarlas y pasarlas a la aplicación principal.
cat << 'EOF' > demo-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: demo-deployment
spec:
replicas: 2
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: web
image: ciberado/pokemon-nodejs:0.0.1
env:
- name: PORT
value: "3000"
- name: nginx
image: ciberado/nginx
EOF
kubectl apply -f demo-deployment.yaml -n demo-$USER
- Espera a que se haya lanzado tu deployment y que está ready (puedes terminar con
ctrl+c
)
kubectl get deployment -n demo-$USER --watch
- Verás que también existe un replicaset y dos replicas de un pod:
kubectl get deployment,replicaset,pod -n demo-$USER
- Usa el servicio para poder acceder a tu aplicación:
cat << EOF > demo-service.yaml
apiVersion: v1
kind: Service
metadata:
name: demo-service
spec:
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
app: web
type: ClusterIP
EOF
kubectl apply -f demo-service.yaml -n demo-$USER
- Es un servicio interno, así que para poder usarlo desde tu entorno de desarrollo (que no está dentro del clúster) tendrás que mapear el servicio a un puerto local:
PORT=8080
kubectl port-forward service/demo-service -n demo-$USER $PORT:80 &
PID=$!
- Ahora puedes usar el puerto local 8000 para acceder al puerto 80 del servicio, que te llevará a uno de los pods desplegados. Recuerda que en el puerto 80 del pod hay un contenedor con
nginx
que te redirigirá al puerto 3000 del mismo pod, en el que se encuentra la aplicación (la petición solo recupera las cabeceras HTTP para que no se te llene de texto la terminal)
curl --head http://localhost:$PORT
- El contenedor con el
nginx
está configurado para limitar el número de peticiones por segundo desde la misma IP (un Quality of Service) y puedes comprobarlo ejecutando 20 peticionesGET
en rápida sucesión (verás que termina devolviendo un código 503 en lugar del típico 200):
curl --head http://localhost:$PORT?[1-20]
- Elimina el namespace y todo lo que haya dentro desaparecerá:
kubectl delete -f demo-ns.yaml
¡Enhorabuena!