Skip to content

Instantly share code, notes, and snippets.

@ciberado
Last active June 14, 2021 20:51
Show Gist options
  • Save ciberado/0636b067ef13c7887c9c1c9daafd0c7e to your computer and use it in GitHub Desktop.
Save ciberado/0636b067ef13c7887c9c1c9daafd0c7e to your computer and use it in GitHub Desktop.

Kubernetes intro

Creación del clúster

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

Despliegue del pod

  • 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 con nginx 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

Creación del servicio

  • 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 connginx 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 peticiones GET 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]

Limpieza de la casa

  • Elimina el namespace y todo lo que haya dentro desaparecerá:
kubectl delete -f demo-ns.yaml

¡Enhorabuena!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment