Proyecto final: Implementación de sitios web en Kubernetes#

Equipo AMJ-GAB-TPKL

  • Alanis Martínez Jennifer
  • González Arreguín Bryan
  • Torres Partida Karen Larissa

Nombre de Dominio y Dirección IP Pública#

Nombre de Dominio: scrapykoko.ml

IP pública: 20.213.61.249

Creación de imagenes de contenedor con Docker#

Nombres de Usuario:

  • dtanatos01

  • jalanis3

  • kalatopari

Instalación y Prueba bósica Docker Desktop#

Primeramente se instaló docker desktop como venía en la página.

Docker Desktop

Luego se probó corriendo el contenedor hello-world:

C:\Users\DTana>docker run -it hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
2db29710123e: Pull complete
Digest: sha256:13e367d31ae85359f42d637adf6da428f76d75dc9afeb3c21faea0d976f5c651
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

Después se descargó la imagen nginx:1.22-alpine de docker, y se ejecutó ese contenedor con los siguientes comandos:

C:\Users\DTana> docker pull nginx:1.22-alpine

C:\Users\DTana>docker run -it -p 8080:80 docker.io/library/nginx:1.22-alpine
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
/docker-entrypoint.sh: Configuration complete; ready for start up
2022/06/19 02:43:40 [notice] 1#1: using the "epoll" event method
2022/06/19 02:43:40 [notice] 1#1: nginx/1.22.0
2022/06/19 02:43:40 [notice] 1#1: built by gcc 11.2.1 20220219 (Alpine 11.2.1_git20220219)
2022/06/19 02:43:40 [notice] 1#1: OS: Linux 5.10.16.3-microsoft-standard-WSL2
2022/06/19 02:43:40 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
2022/06/19 02:43:40 [notice] 1#1: start worker processes
2022/06/19 02:43:40 [notice] 1#1: start worker process 32
2022/06/19 02:43:40 [notice] 1#1: start worker process 33
2022/06/19 02:43:40 [notice] 1#1: start worker process 34
2022/06/19 02:43:40 [notice] 1#1: start worker process 35
2022/06/19 02:43:40 [notice] 35#35: signal 28 (SIGWINCH) received
2022/06/19 02:43:40 [notice] 34#34: signal 28 (SIGWINCH) received
2022/06/19 02:43:40 [notice] 32#32: signal 28 (SIGWINCH) received
2022/06/19 02:43:40 [notice] 33#33: signal 28 (SIGWINCH) received
2022/06/19 02:43:40 [notice] 1#1: signal 28 (SIGWINCH) received
172.17.0.1 - - [19/Jun/2022:02:46:00 +0000] "GET / HTTP/1.1" 200 615 "-" "curl/7.83.1" "-"
172.17.0.1 - - [19/Jun/2022:02:46:10 +0000] "GET / HTTP/1.1" 200 615 "-" "curl/7.83.1" "-"
172.17.0.1 - - [19/Jun/2022:02:46:39 +0000] "GET / HTTP/1.1" 200 615 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36" "-"
2022/06/19 02:46:40 [error] 33#33: *3 open() "/usr/share/nginx/html/favicon.ico" failed (2: No such file or directory), client: 172.17.0.1, server: localhost, request: "GET /favicon.ico HTTP/1.1", host: "localhost:8080", referrer: "http://localhost:8080/"
172.17.0.1 - - [19/Jun/2022:02:46:40 +0000] "GET /favicon.ico HTTP/1.1" 404 555 "http://localhost:8080/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36" "-"
^C
2022/06/19 02:47:16 [notice] 35#35: signal 2 (SIGINT) received, exiting
2022/06/19 02:47:16 [notice] 34#34: signal 2 (SIGINT) received, exiting
2022/06/19 02:47:16 [notice] 35#35: exiting
2022/06/19 02:47:16 [notice] 34#34: exiting
2022/06/19 02:47:16 [notice] 33#33: signal 2 (SIGINT) received, exiting
2022/06/19 02:47:16 [notice] 1#1: signal 2 (SIGINT) received, exiting
2022/06/19 02:47:16 [notice] 33#33: exiting
2022/06/19 02:47:16 [notice] 32#32: signal 2 (SIGINT) received, exiting
2022/06/19 02:47:16 [notice] 32#32: exiting
2022/06/19 02:47:16 [notice] 34#34: exit
2022/06/19 02:47:16 [notice] 33#33: exit
2022/06/19 02:47:16 [notice] 35#35: exit
2022/06/19 02:47:16 [notice] 32#32: exit
2022/06/19 02:47:16 [notice] 1#1: signal 14 (SIGALRM) received
2022/06/19 02:47:16 [notice] 1#1: signal 17 (SIGCHLD) received from 35
2022/06/19 02:47:16 [notice] 1#1: worker process 35 exited with code 0
2022/06/19 02:47:16 [notice] 1#1: signal 29 (SIGIO) received
2022/06/19 02:47:16 [notice] 1#1: signal 17 (SIGCHLD) received from 34
2022/06/19 02:47:16 [notice] 1#1: worker process 32 exited with code 0
2022/06/19 02:47:16 [notice] 1#1: worker process 33 exited with code 0
2022/06/19 02:47:16 [notice] 1#1: worker process 34 exited with code 0
2022/06/19 02:47:16 [notice] 1#1: exit

Mientras se ejecutaba lo podíamos visualizar con el siguiente comando:

C:\Users\DTana\Downloads\curl-7.83.1_4-win64-mingw\curl-7.83.1_4-win64-mingw\bin>docker ps
CONTAINER ID   IMAGE               COMMAND                  CREATED          STATUS          PORTS                  NAMES
d31d95609379   nginx:1.22-alpine   "/docker-entrypoint.…"   40 seconds ago   Up 36 seconds   0.0.0.0:8080->80/tcp   adoring_wright

Y además se hicieron dos pruebas una con curl y otra ingresando desde un navegador web:

C:\Users\DTana\Downloads\curl-7.83.1_4-win64-mingw\curl-7.83.1_4-win64-mingw\bin>.\curl.exe -f -s -S -L http://localhost:8080/ | egrep "</?title>"
<title>Welcome to nginx!</title>
Prueba servidor Nginx

Creación de Imágenes de Contenedor#

Se crearon 3 imágenes para ello primero se descargaron sus Dockerfile desde esta sección.

  • Hello Nginx

Este nos sirvió de base para entender algunas de las sintaxis que usa un Dockerfile, este se encuentra aquí, además para su construcción se usó el siguiente comando:

docker build --progress plain -t "dtanatos01/hello-nginx" .

Y la salida de este está aquí.

  • Linux Doc y Tareas Redes

Primeramente se comentaron las instrucciones contenidas en los archivos descargados, para así especificar qué hacían:

Después se construyeron con los siguientes comandos:

docker build --progress plain -t "dtanatos01/linux-doc" .

docker build --progress plain -t "dtanatos01/tareas-redes" .

Y la salida de estos es:

Después de haberlas construido se le hizo push para que se subiera al registry DockerHub con lo siguientes comandos:

docker push "dtanatos01/hello-nginx"

docker push "dtanatos01/linux-doc"

docker push "dtanatos01/tareas-redes"

Y la salida de estos es:

Y se pueden revisar en las siguientes paginas de docker hub:

Preparación de la máquina virtual para k3s#

Primeramente se revisó la memoria RAM en el equipo:

root@scrapykoko:~# free -m
               total        used        free      shared  buff/cache   available
Mem:             913         143          61           0         708         609
Swap:              0           0           0

Luego se removío Apache y se reemplazó a rsyslog con busybox-syslogd con los siguientes comandos:

root@scrapykoko:~# apt remove apache2

root@scrapykoko:~# apt remove rsyslog

root@scrapykoko:~# apt install busybox-syslogd

Quedando lo siguiente:

root@scrapykoko:~# apt remove apache2
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
Package 'apache2' is not installed, so not removed
The following packages were automatically installed and are no longer required:
  apache2-bin apache2-data apache2-utils augeas-lenses certbot libapr1 libaprutil1 libaprutil1-dbd-sqlite3
  libaprutil1-ldap libaugeas0 libestr0 libfastjson4 libjansson4 liblognorm5 python3-acme python3-augeas
  python3-certbot python3-configargparse python3-icu python3-josepy python3-parsedatetime python3-requests-toolbelt
  python3-rfc3339 python3-tz python3-zope.component python3-zope.event python3-zope.hookable python3-zope.interface
  ssl-cert
Use 'apt autoremove' to remove them.
0 upgraded, 0 newly installed, 0 to remove and 1 not upgraded.
root@scrapykoko:~# apt remove rsyslog
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
Package 'rsyslog' is not installed, so not removed
The following packages were automatically installed and are no longer required:
  apache2-bin apache2-data apache2-utils augeas-lenses certbot libapr1 libaprutil1 libaprutil1-dbd-sqlite3
  libaprutil1-ldap libaugeas0 libestr0 libfastjson4 libjansson4 liblognorm5 python3-acme python3-augeas
  python3-certbot python3-configargparse python3-icu python3-josepy python3-parsedatetime python3-requests-toolbelt
  python3-rfc3339 python3-tz python3-zope.component python3-zope.event python3-zope.hookable python3-zope.interface
  ssl-cert
Use 'apt autoremove' to remove them.
0 upgraded, 0 newly installed, 0 to remove and 1 not upgraded.
root@scrapykoko:~# apt install busybox-syslogd
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
busybox-syslogd is already the newest version (1:1.30.1-6).
The following packages were automatically installed and are no longer required:
  apache2-bin apache2-data apache2-utils augeas-lenses certbot libapr1 libaprutil1 libaprutil1-dbd-sqlite3
  libaprutil1-ldap libaugeas0 libestr0 libfastjson4 libjansson4 liblognorm5 python3-acme python3-augeas
  python3-certbot python3-configargparse python3-icu python3-josepy python3-parsedatetime python3-requests-toolbelt
  python3-rfc3339 python3-tz python3-zope.component python3-zope.event python3-zope.hookable python3-zope.interface
  ssl-cert
Use 'apt autoremove' to remove them.
0 upgraded, 0 newly installed, 0 to remove and 1 not upgraded.

Después se deshabilitaron el servicio de actualizaciones automáticas con el siguiente comando:

root@scrapykoko:~# systemctl disable unattended-upgrades

Y si vemos el estado está muerto:

root@scrapykoko:~# systemctl status unattended-upgrades
● unattended-upgrades.service - Unattended Upgrades Shutdown
     Loaded: loaded (/lib/systemd/system/unattended-upgrades.service; disabled; vendor preset: enabled)
     Active: inactive (dead)
       Docs: man:unattended-upgrade(8)

Luego desabilitamos las tareas programadas moviendo la carpeta cron.daily a cron.daily.disabled con el siguiente comando:

root@scrapykoko:~# mv -v /etc/cron.daily /etc/cron.daily.disabled

Quedando de la siguiente manera:

root@scrapykoko:~# tree /etc/cron.*
/etc/cron.d
├── certbot
└── e2scrub_all
/etc/cron.daily.disabled
└── cron.daily
    ├── apache2
    ├── apt-compat
    ├── dpkg
    ├── logrotate
    ├── man-db
    └── mlocate
/etc/cron.hourly
/etc/cron.monthly
/etc/cron.weekly
└── man-db

Después se redujo el uso de memoria de JournalD, agregando los siguientes valores a /etc/systemd/journald.conf:

Storage=none
ForwardToSyslog=no
ForwardToKMsg=no
ForwardToConsole=no
ForwardToWall=no
ReadKMsg=no
Audit=no

Quedando de la siguiente manera:

root@scrapykoko:~# egrep -v '^\s*(#|$)' /etc/systemd/journald.conf
[Journal]
Storage=none
ForwardToSyslog=no
ForwardToKMsg=no
ForwardToConsole=no
ForwardToWall=no
ReadKMsg=no
Audit=no

Ya con eso ahora se establecerá el área de intercambio SWAP:

  • Primero habilitamos la política SWAP en sysctl, agregando las siguentes líneas al archivo local.conf ubicado en /etc/sysctl.d/
###################################################################
# https://www.kernel.org/doc/html/latest/admin-guide/sysctl/vm.html#swappiness
vm.swappiness = 1
  • Quedando de la siguiente manera:
root@scrapykoko:~# cat /etc/sysctl.d/local.conf
###################################################################
# https://www.kernel.org/doc/html/latest/admin-guide/sysctl/vm.html#swappiness
vm.swappiness = 1
  • Y con ello se recargó la configuración de sysctl para probar que los cambios surtieran efecto:
root@scrapykoko:~# sysctl -p
vm.swappiness = 1
root@scrapykoko:~# cat /proc/sys/vm/swappiness
1
  • Ya con ello luego se creó la partición SWAP, primeramente se listaron los dispositivos de bloques y se verificó que /dev/sdb1 se encuentre montado en /mnt:
root@scrapykoko:~# lsblk
NAME    MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda       8:0    0   30G  0 disk
├─sda1    8:1    0 29.9G  0 part /
├─sda14   8:14   0    3M  0 part
└─sda15   8:15   0  124M  0 part /boot/efi
sdb       8:16   0    4G  0 disk
└─sdb1    8:17   0    4G  0 part /mnt
  • Como sí estaba se desmontó a /mnt con:
root@scrapykoko:~# umount /mnt
  • Después comentamos la siguiente línea del archivo /etc/fstab para desabilitar el punto de montaje de la partición /dev/sdb1:
/dev/disk/cloud/azure_resource-part1  /mnt    auto    defaults,nofail,comment=cloudconfig 0   2
  • Quedando de la siguiente manera:
root@scrapykoko:~# cat /etc/fstab
# /etc/fstab: static file system information
UUID=ad6b1df1-54de-4e70-800b-fccd17238cbc / ext4 rw,discard,errors=remount-ro,x-systemd.growfs 0 1
UUID=E098-B03A /boot/efi vfat defaults 0 0
# /dev/disk/cloud/azure_resource-part1  /mnt    auto    defaults,nofail,comment=cloudconfig     0       2
  • Ya después se revisó que no estuviera en uso o montada la partición /dev/sdb1 y luego se convirtió en una partición SWAP con el siguiente comando:
root@scrapykoko:~# mkswap /dev/sdb1
  • Luego se estableció el punto de montaje de la partición SWAP en el archivo /etc/fstab quedando de la siguiente manera:
root@scrapykoko:~# cat /etc/fstab
# /etc/fstab: static file system information
UUID=ad6b1df1-54de-4e70-800b-fccd17238cbc / ext4 rw,discard,errors=remount-ro,x-systemd.growfs 0 1
UUID=E098-B03A /boot/efi vfat defaults 0 0
# /dev/disk/cloud/azure_resource-part1  /mnt    auto    defaults,nofail,comment=cloudconfig     0       2


# swap
/dev/sdb1 none swap defaults 0 0
  • Luego se habilitó de manera manual para revisar que todo estuviera en orden con el siguiente comando:
root@scrapykoko:~# swapon -va
  • Y quedando finalmente el uso de memoria de la siguiente manera:
root@scrapykoko:~# free -m
               total        used        free      shared  buff/cache   available
Mem:             913         552          71           1         289         223
Swap:           4093           0        4093

Nota: la memoria en uso es mayor pues esto se está escribiendo cuando ya los kubernetes están instalados.

Instalación de k3s en Debian 11#

Antes de instalar primero escaneamos la URL de k3s para identificar que no tuviera algo malicioso:

Escaneo de K3s

Luego se descargó el script de instalación y se dieron permisos de ejecución con los siguientes comandos:

root@scrapykoko:~# wget -c -nv -O ~/get-k3s-io.sh https://get.k3s.io/
root@scrapykoko:~# chmod -c +x ./get-k3s-io.sh

Y luego se ejecutó el script de instalación pero definiendo antes las variables de entorno especificadas aquí:

root@scrapykoko:~# export INSTALL_K3S_SKIP_START="true"
root@scrapykoko:~# export INSTALL_K3S_EXEC="--tls-san='k3s.scrapykoko.ml' --tls-san='20.213.61.249' --disable-cloud-controller --disable=metrics-server --disable=servicelb --disable=traefik"

root@scrapykoko:~# ~/get-k3s-io.sh

Luego se establecieron las variables de entorno de k3s para que ocupe aún menos memoria ram en el equipo, quedando el archivo k3s.service.env de la siguiente manera:

root@scrapykoko:~# cat /etc/systemd/system/k3s.service.env
# Aggressive garbage collector
GOGC=10

Ya con esto hecho se reinició la máquina y se revisó que el servicio k3s estuviera en línea:

root@scrapykoko:~# reboot
root@scrapykoko:~# systemctl status --full k3s
● k3s.service - Lightweight Kubernetes
     Loaded: loaded (/etc/systemd/system/k3s.service; enabled; vendor preset: enabled)
     Active: active (running) since Sat 2022-06-18 16:02:33 CDT; 22h ago
       Docs: https://k3s.io
   Main PID: 565 (k3s-server)
      Tasks: 119
     Memory: 385.2M
        CPU: 1h 1min 14.009s
     CGroup: /system.slice/k3s.service
             ├─ 565 /usr/local/bin/k3s server
             ├─ 589 containerd -c /var/lib/rancher/k3s/agent/etc/containerd/config.toml -a /run/k3s/containerd/containerd.sock --state /run/k3s/containerd --root /var>
             ├─1008 /var/lib/rancher/k3s/data/8c2b0191f6e36ec6f3cb68e2302fcc4be850c6db31ec5f8a74e4b3be403101d8/bin/containerd-shim-runc-v2 -namespace k8s.io -id d947d>
             ├─1067 /var/lib/rancher/k3s/data/8c2b0191f6e36ec6f3cb68e2302fcc4be850c6db31ec5f8a74e4b3be403101d8/bin/containerd-shim-runc-v2 -namespace k8s.io -id d12e0>
             ├─1453 /var/lib/rancher/k3s/data/8c2b0191f6e36ec6f3cb68e2302fcc4be850c6db31ec5f8a74e4b3be403101d8/bin/containerd-shim-runc-v2 -namespace k8s.io -id ee313>
             ├─1458 /var/lib/rancher/k3s/data/8c2b0191f6e36ec6f3cb68e2302fcc4be850c6db31ec5f8a74e4b3be403101d8/bin/containerd-shim-runc-v2 -namespace k8s.io -id 858b4>
             ├─1487 /var/lib/rancher/k3s/data/8c2b0191f6e36ec6f3cb68e2302fcc4be850c6db31ec5f8a74e4b3be403101d8/bin/containerd-shim-runc-v2 -namespace k8s.io -id 97986>
             └─1493 /var/lib/rancher/k3s/data/8c2b0191f6e36ec6f3cb68e2302fcc4be850c6db31ec5f8a74e4b3be403101d8/bin/containerd-shim-runc-v2 -namespace k8s.io -id 63473>
root@scrapykoko:~#

Con ello podemos notar la memoria RAM creció muy considerablemente:

root@scrapykoko:~# free -m
               total        used        free      shared  buff/cache   available
Mem:             913         553          69           1         290         223
Swap:           4093           0        4093

Luego se revisó que el puerto de kube-apiserver esté escuchando:

root@scrapykoko:~# netstat -ntulp | grep 6443
tcp6       0      0 :::6443                 :::*                    LISTEN      565/k3s server

Después tuvimos que preparar el archivo ~/.kube/config, para ello primero se agregó al usuario redes al grupo staff:

root@scrapykoko:~# adduser redes staff

root@scrapykoko:~# groups redes
redes : redes adm dialout cdrom floppy sudo audio dip video plugdev staff netdev

Luego se le cambiaron los permisos del archivo /etc/rancher/k3s/k3s.yaml como indicaba la sección del proyecto quedando de la siguiente manera:

root@scrapykoko:~# ls -la /etc/rancher/k3s/k3s.yaml
-r--r----- 1 root staff 2961 Jun 18 16:02 /etc/rancher/k3s/k3s.yaml

Ya con eso luego se creó una liga simbólica de k3s.yaml en la ruta ~/.kube/config quedando de la siguiente manera:

root@scrapykoko:~# ls -la ~/.kube/config
lrwxrwxrwx 1 root root 25 Jun 16 22:29 /root/.kube/config -> /etc/rancher/k3s/k3s.yaml

Luego con el usuario redes, copiamos el archivo k3s.yaml a la ruta ~/.kube/config lo anterior fue hecho con el usuario root, ya luego le cambiamos los permisos como venía especificado aquí, quedando de la siguiente manera:

redes@scrapykoko:~$ ls -la ~/.kube/config
-r--r----- 1 redes staff 2961 Jun 16 22:30 /home/redes/.kube/config

Ya con esto hecho listamos la información del cluster eso gracias a kubectl que fue instalado junto con k3s:

redes@scrapykoko:~$ which kubectl
/usr/local/bin/kubectl

redes@scrapykoko:~$ kubectl version
Client Version: version.Info{Major:"1", Minor:"23", GitVersion:"v1.23.6+k3s1", GitCommit:"418c3fa858b69b12b9cefbcff0526f666a6236b9", GitTreeState:"clean", BuildDate:"2022-04-28T22:16:18Z", GoVersion:"go1.17.5", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"23", GitVersion:"v1.23.6+k3s1", GitCommit:"418c3fa858b69b12b9cefbcff0526f666a6236b9", GitTreeState:"clean", BuildDate:"2022-04-28T22:16:18Z", GoVersion:"go1.17.5", Compiler:"gc", Platform:"linux/amd64"}

redes@scrapykoko:~$ kubectl get nodes -o wide
NAME            STATUS   ROLES                  AGE     VERSION        INTERNAL-IP   EXTERNAL-IP   OS-IMAGE                         KERNEL-VERSION          CONTAINER-RUNTIME
scrapykoko.ml   Ready    control-plane,master   2d16h   v1.23.6+k3s1   10.0.0.4      <none>        Debian GNU/Linux 11 (bullseye)   5.10.0-15-cloud-amd64   containerd://1.5.11-k3s2

Después se abrió el puerto 6443 en el grupo de seguridad de Azure:

Reglas de Entrada de Grupo de Seguridad

Luego se instaló kubectl en el equipo local, como lo indicaba esta página, quedando de la siguiente manera:

C:\Users\DTana>kubectl version
WARNING: This version information is deprecated and will be replaced with the output from kubectl version --short.  Use --output=yaml|json to get the full version.
Client Version: version.Info{Major:"1", Minor:"24", GitVersion:"v1.24.1", GitCommit:"3ddd0f45aa91e2f30c70734b175631bec5b5825a", GitTreeState:"clean", BuildDate:"2022-05-24T12:26:19Z", GoVersion:"go1.18.2", Compiler:"gc", Platform:"windows/amd64"}
Kustomize Version: v4.5.4
Server Version: version.Info{Major:"1", Minor:"23", GitVersion:"v1.23.6+k3s1", GitCommit:"418c3fa858b69b12b9cefbcff0526f666a6236b9", GitTreeState:"clean", BuildDate:"2022-04-28T22:16:18Z", GoVersion:"go1.17.5", Compiler:"gc", Platform:"linux/amd64"}

Después se instaló krew tanto en el equipo remoto como en el local como se especificaba, quedando de la siguiente manera:

Equipo remoto

redes@scrapykoko:~$ kubectl krew version
OPTION            VALUE
GitTag            v0.4.3
GitCommit         dbfefa5
IndexURI          https://github.com/kubernetes-sigs/krew-index.git
BasePath          /home/redes/.krew
IndexPath         /home/redes/.krew/index/default
InstallPath       /home/redes/.krew/store
BinPath           /home/redes/.krew/bin
DetectedPlatform  linux/amd64

Equipo local

C:\Users\DTana>kubectl krew version
OPTION            VALUE
GitTag            v0.4.3
GitCommit         dbfefa5
IndexURI          https://github.com/kubernetes-sigs/krew-index.git
BasePath          C:\Users\DTana\.krew
IndexPath         C:\Users\DTana\.krew\index\default
InstallPath       C:\Users\DTana\.krew\store
BinPath           C:\Users\DTana\.krew\bin
DetectedPlatform  windows/amd64

Luego se instaló además el plugin neat, este solo pudo ser instalado en el equipo remoto puesto que para la plataforma windows aún no está disponible:

Equipo local

C:\Users\DTana>kubectl krew install neat
Updated the local copy of plugin index.
Installing plugin: neat
W0619 14:49:41.412175   15072 install.go:164] failed to install plugin "neat": plugin "neat" does not offer installation for this platform
failed to install some plugins: [neat]: plugin "neat" does not offer installation for this platform
Error: exit status 1

C:\Users\DTana>kubectl krew list
PLUGIN  VERSION
krew    v0.4.3

Equipo remoto

redes@scrapykoko:~$ kubectl krew list
PLUGIN  VERSION
krew    v0.4.3
neat    v2.0.3

Ya con eso hecho eso, ahora hay que preparar el archivo ~/.kube/config en el equipo local, primeramente se descargó el archivo desde la máquina virtual, y luego se editó para que quedara al final así.

Luego de eso se probó que nos pudieramos conectar al cluster desde el equipo local para ello primero se definió la siguiente variable de entorno:

Variable de entorno KUBECONFIG

Luego se revisó que pudiéramos conectarnos al puerto 6443:

C:\Users\DTana>nmap -v -p 6443 ks3.scrapykoko.ml
Starting Nmap 7.92 ( https://nmap.org ) at 2022-06-19 17:37 Hora de verano central (MÚxico)
Initiating Ping Scan at 17:37
Scanning ks3.scrapykoko.ml (20.213.61.249) [4 ports]
Completed Ping Scan at 17:37, 0.43s elapsed (1 total hosts)
Initiating Parallel DNS resolution of 1 host. at 17:37
Completed Parallel DNS resolution of 1 host. at 17:37, 0.26s elapsed
Initiating SYN Stealth Scan at 17:37
Scanning ks3.scrapykoko.ml (20.213.61.249) [1 port]
Discovered open port 6443/tcp on 20.213.61.249
Completed SYN Stealth Scan at 17:37, 0.21s elapsed (1 total ports)
Nmap scan report for ks3.scrapykoko.ml (20.213.61.249)
Host is up (0.20s latency).

PORT     STATE SERVICE
6443/tcp open  sun-sr-https

Read data files from: C:\Program Files (x86)\Nmap
Nmap done: 1 IP address (1 host up) scanned in 2.39 seconds
           Raw packets sent: 5 (196B) | Rcvd: 2 (88B)


C:\Users\DTana>ncat -v -z k3s.scrapykoko.ml 6443
Ncat: Version 7.92 ( https://nmap.org/ncat )
Ncat: Connected to 20.213.61.249:6443.
Ncat: 0 bytes sent, 0 bytes received in 1.16 seconds.

Y por último se revisó que nos pudiéramos conectar al servidor API de kubernetes con el comando kubectl:

C:\Users\DTana>kubectl version --insecure-skip-tls-verify=false
WARNING: This version information is deprecated and will be replaced with the output from kubectl version --short.  Use --output=yaml|json to get the full version.
Client Version: version.Info{Major:"1", Minor:"24", GitVersion:"v1.24.1", GitCommit:"3ddd0f45aa91e2f30c70734b175631bec5b5825a", GitTreeState:"clean", BuildDate:"2022-05-24T12:26:19Z", GoVersion:"go1.18.2", Compiler:"gc", Platform:"windows/amd64"}
Kustomize Version: v4.5.4
Server Version: version.Info{Major:"1", Minor:"23", GitVersion:"v1.23.6+k3s1", GitCommit:"418c3fa858b69b12b9cefbcff0526f666a6236b9", GitTreeState:"clean", BuildDate:"2022-04-28T22:16:18Z", GoVersion:"go1.17.5", Compiler:"gc", Platform:"linux/amd64"}

C:\Users\DTana>kubectl get nodes
NAME            STATUS   ROLES                  AGE     VERSION
scrapykoko.ml   Ready    control-plane,master   2d19h   v1.23.6+k3s1

Instalación y configuración de Ingress NGINX en Kubernetes#

Primeramente se instaló ingress-nginx en el equipo local, se descargó para ello este archivo, y se usó el siguiente comando para instalarlo:

kubectl apply -f ingress-nginx-${INGRESS_NGINX_VERSION}.yaml

Luego como ingress controller no tiene de manera predeterminada abiertos los puertos 80 y 443, los abrimos con el siguiente comando:

kubectl patch deployment/ingress-nginx-controller -n ingress-nginx --patch '{"spec":{"template":{"spec":{"hostNetwork":true}}}}'

Y con ello podemos verificar que los puertos 80 y 443 estén asociados al proceso nginx en el equipo remoto:

root@scrapykoko:~# netstat -ntulp | egrep -w '80|443'
tcp        0      0 0.0.0.0:443             0.0.0.0:*               LISTEN      2011/nginx: master
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      2011/nginx: master
tcp6       0      0 :::443                  :::*                    LISTEN      2011/nginx: master
tcp6       0      0 :::80                   :::*                    LISTEN      2011/nginx: master

Luego hay que revisar si el deployment se encuentra en estado READY y el que estado del pod sea Running:

C:\Users\DTana>kubectl get deployments -n ingress-nginx
NAME                       READY   UP-TO-DATE   AVAILABLE   AGE
ingress-nginx-controller   1/1     1            1           2d17h

C:\Users\DTana>kubectl get pods -n ingress-nginx --field-selector=status.phase==Running
NAME                                        READY   STATUS    RESTARTS      AGE
ingress-nginx-controller-7f7dd56cc6-tztfj   1/1     Running   1 (25h ago)   27h

Y además revisar que el servicio ingress-nginx-controller este activo:

C:\Users\DTana>kubectl get service ingress-nginx-controller -n ingress-nginx
NAME                       TYPE           CLUSTER-IP     EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx-controller   LoadBalancer   10.43.164.87   <pending>     80:31405/TCP,443:31011/TCP   2d17h

También hay que revisar que nos podamos conectar al puerto 80 y 443 del servidor:

C:\Users\DTana>ncat -v -z scrapykoko.ml 80
Ncat: Version 7.92 ( https://nmap.org/ncat )
Ncat: Connected to 20.213.61.249:80.
Ncat: 0 bytes sent, 0 bytes received in 0.25 seconds.

C:\Users\DTana>ncat -v -z scrapykoko.ml 443
Ncat: Version 7.92 ( https://nmap.org/ncat )
Ncat: Connected to 20.213.61.249:443.
Ncat: 0 bytes sent, 0 bytes received in 0.23 seconds.

C:\Users\DTana>nmap -v -p 80 scrapykoko.ml
Starting Nmap 7.92 ( https://nmap.org ) at 2022-06-19 17:56 Hora de verano central (MÚxico)
Initiating Ping Scan at 17:56
Scanning scrapykoko.ml (20.213.61.249) [4 ports]
Completed Ping Scan at 17:56, 0.37s elapsed (1 total hosts)
Initiating Parallel DNS resolution of 1 host. at 17:56
Completed Parallel DNS resolution of 1 host. at 17:56, 0.17s elapsed
Initiating SYN Stealth Scan at 17:56
Scanning scrapykoko.ml (20.213.61.249) [1 port]
Discovered open port 80/tcp on 20.213.61.249
Completed SYN Stealth Scan at 17:56, 0.21s elapsed (1 total ports)
Nmap scan report for scrapykoko.ml (20.213.61.249)
Host is up (0.20s latency).

PORT   STATE SERVICE
80/tcp open  http

Read data files from: C:\Program Files (x86)\Nmap
Nmap done: 1 IP address (1 host up) scanned in 1.58 seconds
           Raw packets sent: 5 (196B) | Rcvd: 2 (88B)

C:\Users\DTana>nmap -v -p 443 scrapykoko.ml
Starting Nmap 7.92 ( https://nmap.org ) at 2022-06-19 17:56 Hora de verano central (MÚxico)
Initiating Ping Scan at 17:56
Scanning scrapykoko.ml (20.213.61.249) [4 ports]
Completed Ping Scan at 17:56, 0.37s elapsed (1 total hosts)
Initiating Parallel DNS resolution of 1 host. at 17:56
Completed Parallel DNS resolution of 1 host. at 17:56, 0.00s elapsed
Initiating SYN Stealth Scan at 17:56
Scanning scrapykoko.ml (20.213.61.249) [1 port]
Discovered open port 443/tcp on 20.213.61.249
Completed SYN Stealth Scan at 17:56, 0.21s elapsed (1 total ports)
Nmap scan report for scrapykoko.ml (20.213.61.249)
Host is up (0.20s latency).

PORT    STATE SERVICE
443/tcp open  https

Read data files from: C:\Program Files (x86)\Nmap
Nmap done: 1 IP address (1 host up) scanned in 1.40 seconds
           Raw packets sent: 5 (196B) | Rcvd: 2 (88B)

También se intentó acceder a la página con el nombre de dominio pero esta prueba ya se hizo hasta al final por lo que no manda el error 404, sino que muestra la página index.html hecha en la secciones siguientes a esta:

C:\Users\DTana\Downloads\curl-7.83.1_4-win64-mingw\curl-7.83.1_4-win64-mingw\bin>curl.exe -vk# http://scrapykoko.ml/
*   Trying 20.213.61.249:80...
* Connected to scrapykoko.ml (20.213.61.249) port 80 (#0)
> GET / HTTP/1.1
> Host: scrapykoko.ml
> User-Agent: curl/7.83.1
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Date: Sun, 19 Jun 2022 22:59:33 GMT
< Content-Type: text/html
< Content-Length: 610
< Connection: keep-alive
< Last-Modified: Sat, 18 Jun 2022 18:38:27 GMT
< ETag: "62ae1ba3-262"
< Accept-Ranges: bytes
<
<!DOCTYPE HTML>
<html>
  <head>
    <meta charset="UTF-8">
    <title>Práctica 8 - Redes 2022-2</title>
    <link href="data:image/x-icon;base64," rel="icon" type="image/x-icon" />
  </head>
  <body>
    <h1>Hola</h1>
    <div>
      <p>Esta es la página del <code>Equipo-AMJ-GAB-TPKL</code></p>
      <p>Nuestro dominio DNS es <code>scrapykoko.ml</code></p>
      <ul>
        <li><em>Esta página se está sirviendo desde el cluster de <b>Kubernetes</b> en <code>k3s.scrapykoko.ml</code></em></li>
      </ul>
    </div>
    <hr/>
    <code>Redes de Computadoras</code>
  </body>
</html>* Connection #0 to host scrapykoko.ml left intact

Implementación de sitios web en Kubernetes#

Lo primero que hicimos fue crear el sitio web default, para ello se creó una página de índice tomando como base la puesta en esta página, quedando así.

Luego se creó un configmap para guardar el contenido del archivo index.html eso se logró con el siguiente comando:

kubectl create configmap index-equipo-amj-gab-tpkl --from-file=index.html

Después de eso se creó un deployment del servidor web nginx, especificando que escucha en el puerto 80:

kubectl create deployment root-nginx --image=nginx --port=80

Ya con eso se verificó que estuviera el pod de nginx corriendo:

C:\Users\DTana>kubectl get pods -l app=root-nginx
NAME                          READY   STATUS    RESTARTS      AGE
root-nginx-787f7b4d49-9cmgc   1/1     Running   1 (26h ago)   28h

Luego se editó el deployment root-nginx para montar el configmap que contiene al archivo index.html, agregando las siguiente líneas correspondientes a volumeMounts y volumes en las secciones adecuadas:

volumes:
   - configMap:
      name: index-equipo-amj-gab-tpkl
   name: index-equipo-amj-gab-tpkl

volumeMounts:
   - mountPath: /usr/share/nginx/html/index.html
      name: index-equipo-amj-gab-tpkl
   subPath: index.html

Quedando de la siguiente manera:

# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    deployment.kubernetes.io/revision: "3"
  creationTimestamp: "2022-06-18T17:41:56Z"
  generation: 7
  labels:
    app: root-nginx
  name: root-nginx
  namespace: default
  resourceVersion: "47431"
  uid: 2c8e991b-011e-4830-bfb8-4e17f2094d91
spec:
  progressDeadlineSeconds: 600
  replicas: 1
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app: root-nginx
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: root-nginx
    spec:
      containers:
      - image: nginx
        imagePullPolicy: Always
        name: nginx
        ports:
        - containerPort: 80
          protocol: TCP
        resources: {}
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
        volumeMounts:
        - mountPath: /usr/share/nginx/html/index.html
          name: index-equipo-amj-gab-tpkl
          subPath: index.html
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 30
      volumes:
      - configMap:
          name: index-equipo-amj-gab-tpkl
        name: index-equipo-amj-gab-tpkl
status:
  availableReplicas: 1
  conditions:
  - lastTransitionTime: "2022-06-18T17:41:56Z"
    lastUpdateTime: "2022-06-18T18:38:07Z"
    message: ReplicaSet "root-nginx-787f7b4d49" has successfully progressed.
    reason: NewReplicaSetAvailable
    status: "True"
    type: Progressing
  - lastTransitionTime: "2022-06-18T18:38:31Z"
    lastUpdateTime: "2022-06-18T18:38:31Z"
    message: Deployment has minimum availability.
    reason: MinimumReplicasAvailable
    status: "True"
    type: Available
  observedGeneration: 7
  readyReplicas: 1
  replicas: 1
  updatedReplicas: 1

Después de haberlo editado, nos sale un mensaje de edited si tuvimos éxito, en nuestro caso sí fue exitoso, y revisamos que se haya lanzado un nuevo pod con el comando:

kubectl get pods -l app=root-nginx

De todos modos por seguridad seguimos la nota para forzar la creación de un nuevo pod con los siguientes comandos:

kubectl scale deployment/root-nginx --replicas 0
kubectl scale deployment/root-nginx --replicas 1

Luego de ello con port-forward revisamos que la página de índice fuera visible, para ello primero pusimos al puerto local 8080 en escucha y redirecciona las peticiones al puerto 80 del pod en el cluster con el siguiente comando:

C:\Users\DTana>kubectl port-forward deployment/root-nginx 8080:80
Forwarding from 127.0.0.1:8080 -> 80
Forwarding from [::1]:8080 -> 80
Handling connection for 8080
Handling connection for 8080
Página en Kubernetes mostrada a través de port-forward

Luego ya con eso, ahora creamos un sitio de la página de documentación de kernel de linux, para ello creamos un deployment donde se ejecutará la imagen de contenedor que creamos en la primera sección la que llamamos docker.io/dtanatos01/linux-doc, con el siguiente comando:

kubectl create deployment linux-doc --image="docker.io/dtanatos01/linux-doc" --port=80

Después verificamos que el pod de linux-doc se estuviera ejecutando:

C:\Users\DTana>kubectl get pods -l app=linux-doc
NAME                         READY   STATUS    RESTARTS      AGE
linux-doc-77c968ccfc-rc8k6   1/1     Running   3 (26h ago)   29h

Luego de ello con port-forward revisamos que pudieramos acceder a ese sitio web, para ello primero pusimos al puerto local 8081 en escucha y redirecciona las peticiones al puerto 80 del pod en el cluster con el siguiente comando:

kubectl port-forward deployment/linux-doc 8081:80
Forwarding from 127.0.0.1:8081 -> 80
Forwarding from [::1]:8081 -> 80
Handling connection for 8081
Handling connection for 8081
Handling connection for 8081
Handling connection for 8081
Handling connection for 8081
Handling connection for 8081
Página en Kubernetes mostrada a través de port-forward

Luego ya con eso, ahora creamos un sitio de la página de tareas de la materia, para ello creamos un deployment donde se ejecutará la imagen de contenedor que creamos en la primera sección la que llamamos docker.io/dtanatos01/tareas-redes, con el siguiente comando:

kubectl create deployment linux-doc --image="docker.io/dtanatos01/tareas-redes" --port=80

Después verificamos que el pod de tareas-redes se estuviera ejecutando:

C:\Users\DTana>kubectl get pods -l app=tareas-redes
NAME                            READY   STATUS    RESTARTS      AGE
tareas-redes-7cff8d845d-xwwjl   1/1     Running   3 (26h ago)   29h

Luego de ello con port-forward revisamos que pudieramos acceder a ese sitio web, para ello primero pusimos al puerto local 8082 en escucha y redirecciona las peticiones al puerto 80 del pod en el cluster con el siguiente comando:

C:\Users\DTana>kubectl port-forward deployment/tareas-redes 8082:80
Forwarding from 127.0.0.1:8082 -> 80
Forwarding from [::1]:8082 -> 80
Handling connection for 8082
Handling connection for 8082
Handling connection for 8082
Handling connection for 8082
Página en Kubernetes mostrada a través de port-forward

Ya con todo esto revisamos que todos los deployments tenga estado READY y que el estado de los pods sea Running:

C:\Users\DTana>kubectl get deployments,pods
NAME                           READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/linux-doc      1/1     1            1           29h
deployment.apps/tareas-redes   1/1     1            1           29h
deployment.apps/root-nginx     1/1     1            1           30h

NAME                                READY   STATUS    RESTARTS      AGE
pod/tareas-redes-7cff8d845d-xwwjl   1/1     Running   3 (26h ago)   29h
pod/root-nginx-787f7b4d49-9cmgc     1/1     Running   1 (26h ago)   29h
pod/linux-doc-77c968ccfc-rc8k6      1/1     Running   3 (26h ago)   29h

Implementación de ingress en Kubernetes#

Como normalmente los pods no se acceden directamente en el cluster de Kubernetes, tenemos que crear un servicio que apunte a los pods de deployment, con los siguientes comandos:

kubectl expose deployment root-nginx --port=80
kubectl expose deployment linux-doc --port=80
kubectl expose deployment tareas-redes --port=80

Con ello hecho podemos verificar que los servicios hayan sidos creados y que apunten al puerto 80:

C:\Users\DTana>kubectl get services
NAME           TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
kubernetes     ClusterIP   10.43.0.1      <none>        443/TCP   2d20h
root-nginx     ClusterIP   10.43.43.195   <none>        80/TCP    29h
linux-doc      ClusterIP   10.43.108.21   <none>        80/TCP    29h
tareas-redes   ClusterIP   10.43.209.31   <none>        80/TCP    29h

Luego se crearon rutas para dirigir el tráfico a los servicios, se descargó el archivo de esta sección y se le hicieron las modificaciones pertinentes para que quedara así y se creó el recurso con el siguiente comando:

kubectl apply -f recurso-ingress.yaml

Y por último revisamos que pudiéramos alcancar a todos los sitios web:

  • http://scrapykoko.ml/
C:\Users\DTana\Downloads\curl-7.83.1_4-win64-mingw\curl-7.83.1_4-win64-mingw\bin>curl.exe -vk#L http://scrapykoko.ml/ | egrep "</?title>"
*   Trying 20.213.61.249:80...
* Connected to scrapykoko.ml (20.213.61.249) port 80 (#0)
> GET / HTTP/1.1
> Host: scrapykoko.ml
> User-Agent: curl/7.83.1
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Date: Mon, 20 Jun 2022 00:04:05 GMT
< Content-Type: text/html
< Content-Length: 610
< Connection: keep-alive
< Last-Modified: Sat, 18 Jun 2022 18:38:27 GMT
< ETag: "62ae1ba3-262"
< Accept-Ranges: bytes
<
{ [610 bytes data]
################################################################################################################ 100.0%* Connection #0 to host scrapykoko.ml left intact

    <title>Práctica 8 - Redes 2022-2</title>
Prueba a http://scrapykoko.ml
  • http://kernel.scrapykoko.ml/
C:\Users\DTana\Downloads\curl-7.83.1_4-win64-mingw\curl-7.83.1_4-win64-mingw\bin>curl.exe -vk#L http://kernel.scrapykoko.ml/ | egrep "</?title>"
*   Trying 20.213.61.249:80...
* Connected to kernel.scrapykoko.ml (20.213.61.249) port 80 (#0)
> GET / HTTP/1.1
> Host: kernel.scrapykoko.ml
> User-Agent: curl/7.83.1
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Date: Mon, 20 Jun 2022 00:13:56 GMT
< Content-Type: text/html
< Content-Length: 145412
< Connection: keep-alive
< Last-Modified: Thu, 09 Jun 2022 21:37:36 GMT
< ETag: "62a26820-23804"
< Accept-Ranges: bytes
<
{ [1191 bytes data]
                                                                                                                   0.8%  <title>The Linux Kernel documentation &mdash; The Linux Kernel  documentation</title>
################################################################################################################ 100.0%* Connection #0 to host kernel.scrapykoko.ml left intact
Prueba a http://kernel.scrapykoko.ml
  • http//tareas.scrapykoko.ml/
C:\Users\DTana\Downloads\curl-7.83.1_4-win64-mingw\curl-7.83.1_4-win64-mingw\bin>curl.exe -vk#L http://tareas.scrapykoko.ml/ | egrep "</?title>"
*   Trying 20.213.61.249:80...
* Connected to tareas.scrapykoko.ml (20.213.61.249) port 80 (#0)
> GET / HTTP/1.1
> Host: tareas.scrapykoko.ml
> User-Agent: curl/7.83.1
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Date: Mon, 20 Jun 2022 00:17:10 GMT
< Content-Type: text/html
< Content-Length: 15221
< Connection: keep-alive
< Last-Modified: Fri, 17 Jun 2022 02:33:26 GMT
< ETag: "62abe7f6-3b75"
< Accept-Ranges: bytes
<
{ [13739 bytes data]
        <title>Redes - Tareas 2022-2</title>
################################################################################################################ 100.0%* Connection #0 to host tareas.scrapykoko.ml left intact

Prueba a http://tareas.scrapykoko.ml

Configuración de SSL/TLS en Ingress NGINX#

Para esto primero se generó un index.html, en la carpeta /var/www/html/.well-known/acme-challenge, el cual tendrá de contenido "Move Along":

root@scrapykoko:~# echo "Move along" > /var/www/html/.well-known/acme-challenge/index.html

Quedando de la siguiente manera:

root@scrapykoko:~# cat /var/www/html/.well-known/acme-challenge/index.html
Move along

Luego volvemos a editar el deployment de host default, es decir, root-nginx agregando las siguientes líneas:

volumeMounts:  # Agrega el punto de montaje "acme-challenge"
        - name: acme-challenge
          mountPath: /usr/share/nginx/html/.well-known

volumes:  # Agrega el volumen hostPath "acme-challenge"
      - name: acme-challenge
        hostPath:
          path: /var/www/html/.well-known

Quedando finalmente el archivo como:

# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    deployment.kubernetes.io/revision: "3"
  creationTimestamp: "2022-06-18T17:41:56Z"
  generation: 7
  labels:
    app: root-nginx
  name: root-nginx
  namespace: default
  resourceVersion: "47431"
  uid: 2c8e991b-011e-4830-bfb8-4e17f2094d91
spec:
  progressDeadlineSeconds: 600
  replicas: 1
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app: root-nginx
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: root-nginx
    spec:
      containers:
      - image: nginx
        imagePullPolicy: Always
        name: nginx
        ports:
        - containerPort: 80
          protocol: TCP
        resources: {}
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
        volumeMounts:
        - mountPath: /usr/share/nginx/html/.well-known
          name: acme-challenge
        - mountPath: /usr/share/nginx/html/index.html
          name: index-equipo-amj-gab-tpkl
          subPath: index.html
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 30
      volumes:
      - hostPath:
          path: /var/www/html/.well-known
          type: ""
        name: acme-challenge
      - configMap:
          defaultMode: 420
          name: index-equipo-amj-gab-tpkl
        name: index-equipo-amj-gab-tpkl
status:
  availableReplicas: 1
  conditions:
  - lastTransitionTime: "2022-06-18T17:41:56Z"
    lastUpdateTime: "2022-06-18T18:38:07Z"
    message: ReplicaSet "root-nginx-787f7b4d49" has successfully progressed.
    reason: NewReplicaSetAvailable
    status: "True"
    type: Progressing
  - lastTransitionTime: "2022-06-18T18:38:31Z"
    lastUpdateTime: "2022-06-18T18:38:31Z"
    message: Deployment has minimum availability.
    reason: MinimumReplicasAvailable
    status: "True"
    type: Available
  observedGeneration: 7
  readyReplicas: 1
  replicas: 1
  updatedReplicas: 1

Después de haberlo editado, nos sale un mensaje de edited si tuvimos éxito, en nuestro caso sí fue exitoso, y revisamos que se haya lanzado un nuevo pod con el comando:

kubectl get pods -l app=root-nginx

De todos modos por seguridad seguimos la nota para forzar la creación de un nuevo pod con los siguientes comandos:

kubectl scale deployment/root-nginx --replicas 0
kubectl scale deployment/root-nginx --replicas 1

Y revisamos que se pueda visitar a la url /.well-known/acme-challenge:

Prueba a scrapykoko.ml/.well-known/acme-challenge/

Ahora nos toco revisar la validéz del certificado SSL, para ello primero listamos el contenido del directorio /etc/letsencrypt/live:

root@scrapykoko:~# tree /etc/letsencrypt/live
/etc/letsencrypt/live
├── README
└── scrapykoko.ml
    ├── cert.pem -> ../../archive/scrapykoko.ml/cert1.pem
    ├── chain.pem -> ../../archive/scrapykoko.ml/chain1.pem
    ├── fullchain.pem -> ../../archive/scrapykoko.ml/fullchain1.pem
    ├── privkey.pem -> ../../archive/scrapykoko.ml/privkey1.pem
    └── README

1 directory, 6 files

Luego obtuvimos una representación en texto del certificado SSL con el siguiente comando:

root@scrapykoko:/etc/letsencrypt/live# openssl x509 -in scrapykoko.ml/cert.pem -noout -issuer -subject -dates -ext subjectAltName
issuer=C = US, O = Let's Encrypt, CN = R3
subject=CN = scrapykoko.ml
notBefore=Jun  8 00:59:46 2022 GMT
notAfter=Sep  6 00:59:45 2022 GMT
X509v3 Subject Alternative Name:
    DNS:*.scrapykoko.ml, DNS:scrapykoko.ml

El archivo resultante es este

Después hay que verificar la validez del cert.pem con el siguiente comando:

root@scrapykoko:/etc/letsencrypt/live# openssl verify -show_chain -CApath /etc/ssl/certs -untrusted scrapykoko.ml/chain.pem scrapykoko.ml/cert.pem
scrapykoko.ml/cert.pem: OK
Chain:
depth=0: CN = scrapykoko.ml (untrusted)
depth=1: C = US, O = Let's Encrypt, CN = R3 (untrusted)
depth=2: C = US, O = Internet Security Research Group, CN = ISRG Root X1

Ahora nos toca configurar el certificado SSL y la llave privada en el cluster para ello primero copiamos el directorio /etc/letsencrypt/live a nuestro equipo local, ya con ellos los listamos:

C:\Users\DTana\Documents\Clases\Redes\Proyecto\certificados>ls -la letsencrypt
total 29
drwxr-xr-x 2 DTana Administradores 4096 Jun 20 00:44 .
drwxr-xr-x 3 DTana Administradores 4096 Jun 18 21:00 ..
-rw-r--r-- 1 DTana Administradores  692 Jun 18 18:51 README
-rw-r--r-- 1 DTana Administradores 1862 Jun 18 18:56 cert.pem
-rw-r--r-- 1 DTana Administradores 5266 Jun 18 18:51 cert.txt
-rw-r--r-- 1 DTana Administradores 3749 Jun 18 18:56 chain.pem
-rw-r--r-- 1 DTana Administradores 5611 Jun 18 18:56 fullchain.pem
-rw-r--r-- 1 DTana Administradores 1704 Jun 18 18:56 privkey.pem

Luego se agrega el certificado SSL y la llave privada en un recurso secret tls, para ello lo creamos con el siguiente comando, pero estando dentro de la carpeta letsencrypt que descargamos anteriormente a nuestro equipo remoto:

kubectl create secret tls nginx-ingress-tls --cert fullchain.pem --key privkey.pem

Después revisamos que el recurso tipo secret haya sido creado y que contenga a:

  • tls.crt Certificado

  • tls.key Llave privada

En nuestro caso sí lo contiene:

C:\Users\DTana>kubectl get secret nginx-ingress-tls
NAME                TYPE                DATA   AGE
nginx-ingress-tls   kubernetes.io/tls   2      29h

C:\Users\DTana>kubectl describe secret nginx-ingress-tl
Name:         nginx-ingress-tls
Namespace:    default
Labels:       <none>
Annotations:  <none>

Type:  kubernetes.io/tls

Data
====
tls.crt:  5611 bytes
tls.key:  1704 bytes

Luego necesitamos agregar el soporte TLS al recurso ingress para ello volvemos a editar el archivo recurso-ingress.yaml, pero agregando las siguientes líneas:

tls:
  - secretName: nginx-ingress-tls
    hosts:
    - '*.scrapykoko.ml'
    - kernel.scrapykoko.ml
    - tareas.scrapykoko.ml

Y aplicamos estos cambios al recurso ingress con el siguiente comando:

kubectl apply -f recurso-ingress.yaml

Luego tenemos que cambiar el certificado SSL en el ingress controller con el siguiente comando:

kubectl edit deployment/ingress-nginx-controller -n ingress-nginx

Agregando la siguiente línea:

- --default-ssl-certificate=default/nginx-ingress-tls

Quedando de la siguiente manera:

spec:
      containers:
      - args:
        - /nginx-ingress-controller
        - --publish-service=$(POD_NAMESPACE)/ingress-nginx-controller
        - --election-id=ingress-controller-leader
        - --controller-class=k8s.io/ingress-nginx
        - --ingress-class=nginx
        - --configmap=$(POD_NAMESPACE)/ingress-nginx-controller
        - --validating-webhook=:8443
        - --validating-webhook-certificate=/usr/local/certificates/cert
        - --validating-webhook-key=/usr/local/certificates/key
        - --default-ssl-certificate=default/nginx-ingress-tls

Luego tuvimos que reiniciar el controlador de ingress en el cluster, esto normalmente kubernetes lo haría automáticamente, pero como este cluster está utilizando la red del host y lo tenemos que hacer manual con los siguientes comandos:

kubectl scale deployment ingress-nginx-controller -n ingress-nginx --replicas 0

kubectl scale deployment ingress-nginx-controller -n ingress-nginx --replicas 1

Ahora hay que verificar denuevo la conectividad a los sitios web, esto se hará revisando que nos podamos conectar a los puertos 80 y 443 del servidor:

C:\Users\DTana>ncat -v -z scrapykoko.ml 80
Ncat: Version 7.92 ( https://nmap.org/ncat )
Ncat: Connected to 20.213.61.249:80.
Ncat: 0 bytes sent, 0 bytes received in 0.28 seconds.

C:\Users\DTana>ncat -v -z scrapykoko.ml 443
Ncat: Version 7.92 ( https://nmap.org/ncat )
Ncat: Connected to 20.213.61.249:443.
Ncat: 0 bytes sent, 0 bytes received in 0.30 seconds.

C:\Users\DTana>nmap -v -p 80 scrapykoko.ml
Starting Nmap 7.92 ( https://nmap.org ) at 2022-06-19 20:39 Hora de verano central (MÚxico)
Initiating Ping Scan at 20:39
Scanning scrapykoko.ml (20.213.61.249) [4 ports]
Completed Ping Scan at 20:39, 0.38s elapsed (1 total hosts)
Initiating Parallel DNS resolution of 1 host. at 20:39
Completed Parallel DNS resolution of 1 host. at 20:39, 0.16s elapsed
Initiating SYN Stealth Scan at 20:39
Scanning scrapykoko.ml (20.213.61.249) [1 port]
Discovered open port 80/tcp on 20.213.61.249
Completed SYN Stealth Scan at 20:39, 0.21s elapsed (1 total ports)
Nmap scan report for scrapykoko.ml (20.213.61.249)
Host is up (0.20s latency).

PORT   STATE SERVICE
80/tcp open  http

Read data files from: C:\Program Files (x86)\Nmap
Nmap done: 1 IP address (1 host up) scanned in 1.58 seconds
           Raw packets sent: 5 (196B) | Rcvd: 2 (88B)

C:\Users\DTana>nmap -v -p 443 scrapykoko.ml
Starting Nmap 7.92 ( https://nmap.org ) at 2022-06-19 20:39 Hora de verano central (MÚxico)
Initiating Ping Scan at 20:39
Scanning scrapykoko.ml (20.213.61.249) [4 ports]
Completed Ping Scan at 20:39, 0.36s elapsed (1 total hosts)
Initiating Parallel DNS resolution of 1 host. at 20:39
Completed Parallel DNS resolution of 1 host. at 20:39, 0.00s elapsed
Initiating SYN Stealth Scan at 20:39
Scanning scrapykoko.ml (20.213.61.249) [1 port]
Discovered open port 443/tcp on 20.213.61.249
Completed SYN Stealth Scan at 20:39, 0.21s elapsed (1 total ports)
Nmap scan report for scrapykoko.ml (20.213.61.249)
Host is up (0.20s latency).

PORT    STATE SERVICE
443/tcp open  https

Read data files from: C:\Program Files (x86)\Nmap
Nmap done: 1 IP address (1 host up) scanned in 1.40 seconds
           Raw packets sent: 5 (196B) | Rcvd: 2 (88B)

Luego tenemos que revisar el certificado SSL, para ello haremos una conectividad ejecutando openssl s_client en el equipo local:

DTana@DESKTOP-CQ25PN9 ~ openssl s_client -tls1_2 -showcerts -connect scrapykoko.ml:443 < /dev/null
CONNECTED(00000004)
depth=2 C = US, O = Internet Security Research Group, CN = ISRG Root X1
verify return:1
depth=1 C = US, O = Let's Encrypt, CN = R3
verify return:1
depth=0 CN = scrapykoko.ml
verify return:1
---
Certificate chain
 0 s:CN = scrapykoko.ml
   i:C = US, O = Let's Encrypt, CN = R3
-----BEGIN CERTIFICATE-----
MIIFMTCCBBmgAwIBAgISAzKYDgcryilGEZgoSff4mXcIMA0GCSqGSIb3DQEBCwUA
MDIxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQD
EwJSMzAeFw0yMjA2MDgwMDU5NDZaFw0yMjA5MDYwMDU5NDVaMBgxFjAUBgNVBAMT
DXNjcmFweWtva28ubWwwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC4
rE0x5dVtYldkfWaOyHBw5xD4epK+Bo1YGEZkk6X/eg9EFfynUTHnhqMNRaZtP8zL
wmf71kh1bdKi95wxVHlY1B68xBUfQF+DZSt1IQvoMrCwlJ4TgtIeoEQgS74mVKZq
6iODl/PAwTuqaRMi1JRE3LEy1x+WZ2Qmgpx0lVVBGZuT9B4hJ2fLC/boHcvA9ft7
Kqik0+dlE8UxphNwgsXNs5LBPi5NjVgFSgLIge0qedEhTm7rIbENG3JIPstt2GJy
Mxs/mx0GoxiopYZrrdA69P1gM4TtPXhOiueGEBdZesQmmFDeNCF7yf+Yb/NjTUXK
PsvLypEGWZGWM8Mh6RWfAgMBAAGjggJZMIICVTAOBgNVHQ8BAf8EBAMCBaAwHQYD
VR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAwGA1UdEwEB/wQCMAAwHQYDVR0O
BBYEFI2NWlIxADzzr7r7aJG0Z7x6N5zXMB8GA1UdIwQYMBaAFBQusxe3WFbLrlAJ
QOYfr52LFMLGMFUGCCsGAQUFBwEBBEkwRzAhBggrBgEFBQcwAYYVaHR0cDovL3Iz
Lm8ubGVuY3Iub3JnMCIGCCsGAQUFBzAChhZodHRwOi8vcjMuaS5sZW5jci5vcmcv
MCkGA1UdEQQiMCCCDyouc2NyYXB5a29rby5tbIINc2NyYXB5a29rby5tbDBMBgNV
HSAERTBDMAgGBmeBDAECATA3BgsrBgEEAYLfEwEBATAoMCYGCCsGAQUFBwIBFhpo
dHRwOi8vY3BzLmxldHNlbmNyeXB0Lm9yZzCCAQQGCisGAQQB1nkCBAIEgfUEgfIA
8AB2AN+lXqtogk8fbK3uuF9OPlrqzaISpGpejjsSwCBEXCpzAAABgUEKDekAAAQD
AEcwRQIgIk2sa1p8UMb+fDzAyKD9/DzbX67mg4LHTuD8wkIKiI0CIQCzTaPnjiC6
QqrXp8K6JveP8YODbvDuqnZB6xUU/KNhUAB2ACl5vvCeOTkh8FZzn2Old+W+V32c
YAr4+U1dJlwlXceEAAABgUEKDd0AAAQDAEcwRQIhAODSm/4rcP8SXGIufPvLO1Uu
UeanjVl6cphOBzrBJ4aJAiB04mOIo0+oCzc5QxzuWGiJp+4a85LV2ahu9HXnENWC
mjANBgkqhkiG9w0BAQsFAAOCAQEAh7lUy0kgz50KQ3Wb+eKeRTpCxC3yP9XCTVfA
SVkwxr6y2UQ8gBnWEfesh2FPIbAEs4A/Jq2marVCAN+QdL+ogDpgPKLpGl68iiXn
c9ixYHiulij7WiQ4ywHmDfk+WPZyZV3QUG4BLmPzLi7QD9vNhf/LSIvhVdyVkcqk
WiyfpYKj8KnjUNV1t8utS4et2Nx86Zp5YuRSxJdjlioM32R4ewFI7uyvEZtBOyvT
ukuRDbtfv6rk0ndh/3a/lLWHSzuCbiIKRuze5mXjA5NtImJ0Vh0dmi8eZ1E9GeXu
llTuBo3cplHhSJNcAJVgwpLk0Ena09FuCks8TOZdADcqn2hPAA==
-----END CERTIFICATE-----
 1 s:C = US, O = Let's Encrypt, CN = R3
   i:C = US, O = Internet Security Research Group, CN = ISRG Root X1
-----BEGIN CERTIFICATE-----
MIIFFjCCAv6gAwIBAgIRAJErCErPDBinU/bWLiWnX1owDQYJKoZIhvcNAQELBQAw
TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh
cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMjAwOTA0MDAwMDAw
WhcNMjUwOTE1MTYwMDAwWjAyMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNTGV0J3Mg
RW5jcnlwdDELMAkGA1UEAxMCUjMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
AoIBAQC7AhUozPaglNMPEuyNVZLD+ILxmaZ6QoinXSaqtSu5xUyxr45r+XXIo9cP
R5QUVTVXjJ6oojkZ9YI8QqlObvU7wy7bjcCwXPNZOOftz2nwWgsbvsCUJCWH+jdx
sxPnHKzhm+/b5DtFUkWWqcFTzjTIUu61ru2P3mBw4qVUq7ZtDpelQDRrK9O8Zutm
NHz6a4uPVymZ+DAXXbpyb/uBxa3Shlg9F8fnCbvxK/eG3MHacV3URuPMrSXBiLxg
Z3Vms/EY96Jc5lP/Ooi2R6X/ExjqmAl3P51T+c8B5fWmcBcUr2Ok/5mzk53cU6cG
/kiFHaFpriV1uxPMUgP17VGhi9sVAgMBAAGjggEIMIIBBDAOBgNVHQ8BAf8EBAMC
AYYwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMBMBIGA1UdEwEB/wQIMAYB
Af8CAQAwHQYDVR0OBBYEFBQusxe3WFbLrlAJQOYfr52LFMLGMB8GA1UdIwQYMBaA
FHm0WeZ7tuXkAXOACIjIGlj26ZtuMDIGCCsGAQUFBwEBBCYwJDAiBggrBgEFBQcw
AoYWaHR0cDovL3gxLmkubGVuY3Iub3JnLzAnBgNVHR8EIDAeMBygGqAYhhZodHRw
Oi8veDEuYy5sZW5jci5vcmcvMCIGA1UdIAQbMBkwCAYGZ4EMAQIBMA0GCysGAQQB
gt8TAQEBMA0GCSqGSIb3DQEBCwUAA4ICAQCFyk5HPqP3hUSFvNVneLKYY611TR6W
PTNlclQtgaDqw+34IL9fzLdwALduO/ZelN7kIJ+m74uyA+eitRY8kc607TkC53wl
ikfmZW4/RvTZ8M6UK+5UzhK8jCdLuMGYL6KvzXGRSgi3yLgjewQtCPkIVz6D2QQz
CkcheAmCJ8MqyJu5zlzyZMjAvnnAT45tRAxekrsu94sQ4egdRCnbWSDtY7kh+BIm
lJNXoB1lBMEKIq4QDUOXoRgffuDghje1WrG9ML+Hbisq/yFOGwXD9RiX8F6sw6W4
avAuvDszue5L3sz85K+EC4Y/wFVDNvZo4TYXao6Z0f+lQKc0t8DQYzk1OXVu8rp2
yJMC6alLbBfODALZvYH7n7do1AZls4I9d1P4jnkDrQoxB3UqQ9hVl3LEKQ73xF1O
yK5GhDDX8oVfGKF5u+decIsH4YaTw7mP3GFxJSqv3+0lUFJoi5Lc5da149p90Ids
hCExroL1+7mryIkXPeFM5TgO9r0rvZaBFOvV2z0gp35Z0+L4WPlbuEjN/lxPFin+
HlUjr8gRsI3qfJOQFy/9rKIJR0Y/8Omwt/8oTWgy1mdeHmmjk7j1nYsvC9JSQ6Zv
MldlTTKB3zhThV1+XWYp6rjd5JW1zbVWEkLNxE7GJThEUG3szgBVGP7pSWTUTsqX
nLRbwHOoq7hHwg==
-----END CERTIFICATE-----
 2 s:C = US, O = Internet Security Research Group, CN = ISRG Root X1
   i:O = Digital Signature Trust Co., CN = DST Root CA X3
-----BEGIN CERTIFICATE-----
MIIFYDCCBEigAwIBAgIQQAF3ITfU6UK47naqPGQKtzANBgkqhkiG9w0BAQsFADA/
MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT
DkRTVCBSb290IENBIFgzMB4XDTIxMDEyMDE5MTQwM1oXDTI0MDkzMDE4MTQwM1ow
TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh
cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwggIiMA0GCSqGSIb3DQEB
AQUAA4ICDwAwggIKAoICAQCt6CRz9BQ385ueK1coHIe+3LffOJCMbjzmV6B493XC
ov71am72AE8o295ohmxEk7axY/0UEmu/H9LqMZshftEzPLpI9d1537O4/xLxIZpL
wYqGcWlKZmZsj348cL+tKSIG8+TA5oCu4kuPt5l+lAOf00eXfJlII1PoOK5PCm+D
LtFJV4yAdLbaL9A4jXsDcCEbdfIwPPqPrt3aY6vrFk/CjhFLfs8L6P+1dy70sntK
4EwSJQxwjQMpoOFTJOwT2e4ZvxCzSow/iaNhUd6shweU9GNx7C7ib1uYgeGJXDR5
bHbvO5BieebbpJovJsXQEOEO3tkQjhb7t/eo98flAgeYjzYIlefiN5YNNnWe+w5y
sR2bvAP5SQXYgd0FtCrWQemsAXaVCg/Y39W9Eh81LygXbNKYwagJZHduRze6zqxZ
Xmidf3LWicUGQSk+WT7dJvUkyRGnWqNMQB9GoZm1pzpRboY7nn1ypxIFeFntPlF4
FQsDj43QLwWyPntKHEtzBRL8xurgUBN8Q5N0s8p0544fAQjQMNRbcTa0B7rBMDBc
SLeCO5imfWCKoqMpgsy6vYMEG6KDA0Gh1gXxG8K28Kh8hjtGqEgqiNx2mna/H2ql
PRmP6zjzZN7IKw0KKP/32+IVQtQi0Cdd4Xn+GOdwiK1O5tmLOsbdJ1Fu/7xk9TND
TwIDAQABo4IBRjCCAUIwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw
SwYIKwYBBQUHAQEEPzA9MDsGCCsGAQUFBzAChi9odHRwOi8vYXBwcy5pZGVudHJ1
c3QuY29tL3Jvb3RzL2RzdHJvb3RjYXgzLnA3YzAfBgNVHSMEGDAWgBTEp7Gkeyxx
+tvhS5B1/8QVYIWJEDBUBgNVHSAETTBLMAgGBmeBDAECATA/BgsrBgEEAYLfEwEB
ATAwMC4GCCsGAQUFBwIBFiJodHRwOi8vY3BzLnJvb3QteDEubGV0c2VuY3J5cHQu
b3JnMDwGA1UdHwQ1MDMwMaAvoC2GK2h0dHA6Ly9jcmwuaWRlbnRydXN0LmNvbS9E
U1RST09UQ0FYM0NSTC5jcmwwHQYDVR0OBBYEFHm0WeZ7tuXkAXOACIjIGlj26Ztu
MA0GCSqGSIb3DQEBCwUAA4IBAQAKcwBslm7/DlLQrt2M51oGrS+o44+/yQoDFVDC
5WxCu2+b9LRPwkSICHXM6webFGJueN7sJ7o5XPWioW5WlHAQU7G75K/QosMrAdSW
9MUgNTP52GE24HGNtLi1qoJFlcDyqSMo59ahy2cI2qBDLKobkx/J3vWraV0T9VuG
WCLKTVXkcGdtwlfFRjlBz4pYg1htmf5X6DYO8A4jqv2Il9DjXA6USbW1FzXSLr9O
he8Y4IWS6wY7bCkjCWDcRQJMEhg76fsO3txE+FiYruq9RUWhiF1myv4Q6W+CyBFC
Dfvp7OOGAN6dEOM4+qR9sdjoSYKEBpsr6GtPAQw4dy753ec5
-----END CERTIFICATE-----
---
Server certificate
subject=CN = scrapykoko.ml

issuer=C = US, O = Let's Encrypt, CN = R3

---
No client certificate CA names sent
Peer signing digest: SHA256
Peer signature type: RSA-PSS
Server Temp Key: X25519, 253 bits
---
SSL handshake has read 4507 bytes and written 317 bytes
Verification: OK
---
New, TLSv1.2, Cipher is ECDHE-RSA-AES128-GCM-SHA256
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : ECDHE-RSA-AES128-GCM-SHA256
    Session-ID: 71CA25C5A138C5282223D1F75BAD259D7F3C63AABD886D00DB7179128D051313
    Session-ID-ctx:
    Master-Key: 166C1B03D22534825575016B363AE8FA966ECCE7163D04AEFF76690C4DAF866B39A59895CFB4831D16E9055464F2F35B
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    Start Time: 1655583991
    Timeout   : 7200 (sec)
    Verify return code: 0 (ok)
    Extended master secret: yes
---
DONE

DTana@DESKTOP-CQ25PN9 ~

Esa fue la primera vez que lo hicimos y esta es la segunda:

 openssl s_client -showcerts -connect scrapykoko.ml:443 < /dev/null
CONNECTED(00000194)
---
Certificate chain
 0 s:CN = scrapykoko.ml
   i:C = US, O = Let's Encrypt, CN = R3
-----BEGIN CERTIFICATE-----
MIIFMTCCBBmgAwIBAgISAzKYDgcryilGEZgoSff4mXcIMA0GCSqGSIb3DQEBCwUA
MDIxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQD
EwJSMzAeFw0yMjA2MDgwMDU5NDZaFw0yMjA5MDYwMDU5NDVaMBgxFjAUBgNVBAMT
DXNjcmFweWtva28ubWwwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC4
rE0x5dVtYldkfWaOyHBw5xD4epK+Bo1YGEZkk6X/eg9EFfynUTHnhqMNRaZtP8zL
wmf71kh1bdKi95wxVHlY1B68xBUfQF+DZSt1IQvoMrCwlJ4TgtIeoEQgS74mVKZq
6iODl/PAwTuqaRMi1JRE3LEy1x+WZ2Qmgpx0lVVBGZuT9B4hJ2fLC/boHcvA9ft7
Kqik0+dlE8UxphNwgsXNs5LBPi5NjVgFSgLIge0qedEhTm7rIbENG3JIPstt2GJy
Mxs/mx0GoxiopYZrrdA69P1gM4TtPXhOiueGEBdZesQmmFDeNCF7yf+Yb/NjTUXK
PsvLypEGWZGWM8Mh6RWfAgMBAAGjggJZMIICVTAOBgNVHQ8BAf8EBAMCBaAwHQYD
VR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAwGA1UdEwEB/wQCMAAwHQYDVR0O
BBYEFI2NWlIxADzzr7r7aJG0Z7x6N5zXMB8GA1UdIwQYMBaAFBQusxe3WFbLrlAJ
QOYfr52LFMLGMFUGCCsGAQUFBwEBBEkwRzAhBggrBgEFBQcwAYYVaHR0cDovL3Iz
Lm8ubGVuY3Iub3JnMCIGCCsGAQUFBzAChhZodHRwOi8vcjMuaS5sZW5jci5vcmcv
MCkGA1UdEQQiMCCCDyouc2NyYXB5a29rby5tbIINc2NyYXB5a29rby5tbDBMBgNV
HSAERTBDMAgGBmeBDAECATA3BgsrBgEEAYLfEwEBATAoMCYGCCsGAQUFBwIBFhpo
dHRwOi8vY3BzLmxldHNlbmNyeXB0Lm9yZzCCAQQGCisGAQQB1nkCBAIEgfUEgfIA
8AB2AN+lXqtogk8fbK3uuF9OPlrqzaISpGpejjsSwCBEXCpzAAABgUEKDekAAAQD
AEcwRQIgIk2sa1p8UMb+fDzAyKD9/DzbX67mg4LHTuD8wkIKiI0CIQCzTaPnjiC6
QqrXp8K6JveP8YODbvDuqnZB6xUU/KNhUAB2ACl5vvCeOTkh8FZzn2Old+W+V32c
YAr4+U1dJlwlXceEAAABgUEKDd0AAAQDAEcwRQIhAODSm/4rcP8SXGIufPvLO1Uu
UeanjVl6cphOBzrBJ4aJAiB04mOIo0+oCzc5QxzuWGiJp+4a85LV2ahu9HXnENWC
mjANBgkqhkiG9w0BAQsFAAOCAQEAh7lUy0kgz50KQ3Wb+eKeRTpCxC3yP9XCTVfA
SVkwxr6y2UQ8gBnWEfesh2FPIbAEs4A/Jq2marVCAN+QdL+ogDpgPKLpGl68iiXn
c9ixYHiulij7WiQ4ywHmDfk+WPZyZV3QUG4BLmPzLi7QD9vNhf/LSIvhVdyVkcqk
WiyfpYKj8KnjUNV1t8utS4et2Nx86Zp5YuRSxJdjlioM32R4ewFI7uyvEZtBOyvT
ukuRDbtfv6rk0ndh/3a/lLWHSzuCbiIKRuze5mXjA5NtImJ0Vh0dmi8eZ1E9GeXu
llTuBo3cplHhSJNcAJVgwpLk0Ena09FuCks8TOZdADcqn2hPAA==
-----END CERTIFICATE-----
 1 s:C = US, O = Let's Encrypt, CN = R3
   i:C = US, O = Internet Security Research Group, CN = ISRG Root X1
-----BEGIN CERTIFICATE-----
MIIFFjCCAv6gAwIBAgIRAJErCErPDBinU/bWLiWnX1owDQYJKoZIhvcNAQELBQAw
TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh
cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMjAwOTA0MDAwMDAw
WhcNMjUwOTE1MTYwMDAwWjAyMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNTGV0J3Mg
RW5jcnlwdDELMAkGA1UEAxMCUjMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
AoIBAQC7AhUozPaglNMPEuyNVZLD+ILxmaZ6QoinXSaqtSu5xUyxr45r+XXIo9cP
R5QUVTVXjJ6oojkZ9YI8QqlObvU7wy7bjcCwXPNZOOftz2nwWgsbvsCUJCWH+jdx
sxPnHKzhm+/b5DtFUkWWqcFTzjTIUu61ru2P3mBw4qVUq7ZtDpelQDRrK9O8Zutm
NHz6a4uPVymZ+DAXXbpyb/uBxa3Shlg9F8fnCbvxK/eG3MHacV3URuPMrSXBiLxg
Z3Vms/EY96Jc5lP/Ooi2R6X/ExjqmAl3P51T+c8B5fWmcBcUr2Ok/5mzk53cU6cG
/kiFHaFpriV1uxPMUgP17VGhi9sVAgMBAAGjggEIMIIBBDAOBgNVHQ8BAf8EBAMC
AYYwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMBMBIGA1UdEwEB/wQIMAYB
Af8CAQAwHQYDVR0OBBYEFBQusxe3WFbLrlAJQOYfr52LFMLGMB8GA1UdIwQYMBaA
FHm0WeZ7tuXkAXOACIjIGlj26ZtuMDIGCCsGAQUFBwEBBCYwJDAiBggrBgEFBQcw
AoYWaHR0cDovL3gxLmkubGVuY3Iub3JnLzAnBgNVHR8EIDAeMBygGqAYhhZodHRw
Oi8veDEuYy5sZW5jci5vcmcvMCIGA1UdIAQbMBkwCAYGZ4EMAQIBMA0GCysGAQQB
gt8TAQEBMA0GCSqGSIb3DQEBCwUAA4ICAQCFyk5HPqP3hUSFvNVneLKYY611TR6W
PTNlclQtgaDqw+34IL9fzLdwALduO/ZelN7kIJ+m74uyA+eitRY8kc607TkC53wl
ikfmZW4/RvTZ8M6UK+5UzhK8jCdLuMGYL6KvzXGRSgi3yLgjewQtCPkIVz6D2QQz
CkcheAmCJ8MqyJu5zlzyZMjAvnnAT45tRAxekrsu94sQ4egdRCnbWSDtY7kh+BIm
lJNXoB1lBMEKIq4QDUOXoRgffuDghje1WrG9ML+Hbisq/yFOGwXD9RiX8F6sw6W4
avAuvDszue5L3sz85K+EC4Y/wFVDNvZo4TYXao6Z0f+lQKc0t8DQYzk1OXVu8rp2
yJMC6alLbBfODALZvYH7n7do1AZls4I9d1P4jnkDrQoxB3UqQ9hVl3LEKQ73xF1O
yK5GhDDX8oVfGKF5u+decIsH4YaTw7mP3GFxJSqv3+0lUFJoi5Lc5da149p90Ids
hCExroL1+7mryIkXPeFM5TgO9r0rvZaBFOvV2z0gp35Z0+L4WPlbuEjN/lxPFin+
HlUjr8gRsI3qfJOQFy/9rKIJR0Y/8Omwt/8oTWgy1mdeHmmjk7j1nYsvC9JSQ6Zv
MldlTTKB3zhThV1+XWYp6rjd5JW1zbVWEkLNxE7GJThEUG3szgBVGP7pSWTUTsqX
nLRbwHOoq7hHwg==
-----END CERTIFICATE-----
 2 s:C = US, O = Internet Security Research Group, CN = ISRG Root X1
   i:O = Digital Signature Trust Co., CN = DST Root CA X3
-----BEGIN CERTIFICATE-----
MIIFYDCCBEigAwIBAgIQQAF3ITfU6UK47naqPGQKtzANBgkqhkiG9w0BAQsFADA/
MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT
DkRTVCBSb290IENBIFgzMB4XDTIxMDEyMDE5MTQwM1oXDTI0MDkzMDE4MTQwM1ow
TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh
cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwggIiMA0GCSqGSIb3DQEB
AQUAA4ICDwAwggIKAoICAQCt6CRz9BQ385ueK1coHIe+3LffOJCMbjzmV6B493XC
ov71am72AE8o295ohmxEk7axY/0UEmu/H9LqMZshftEzPLpI9d1537O4/xLxIZpL
wYqGcWlKZmZsj348cL+tKSIG8+TA5oCu4kuPt5l+lAOf00eXfJlII1PoOK5PCm+D
LtFJV4yAdLbaL9A4jXsDcCEbdfIwPPqPrt3aY6vrFk/CjhFLfs8L6P+1dy70sntK
4EwSJQxwjQMpoOFTJOwT2e4ZvxCzSow/iaNhUd6shweU9GNx7C7ib1uYgeGJXDR5
bHbvO5BieebbpJovJsXQEOEO3tkQjhb7t/eo98flAgeYjzYIlefiN5YNNnWe+w5y
sR2bvAP5SQXYgd0FtCrWQemsAXaVCg/Y39W9Eh81LygXbNKYwagJZHduRze6zqxZ
Xmidf3LWicUGQSk+WT7dJvUkyRGnWqNMQB9GoZm1pzpRboY7nn1ypxIFeFntPlF4
FQsDj43QLwWyPntKHEtzBRL8xurgUBN8Q5N0s8p0544fAQjQMNRbcTa0B7rBMDBc
SLeCO5imfWCKoqMpgsy6vYMEG6KDA0Gh1gXxG8K28Kh8hjtGqEgqiNx2mna/H2ql
PRmP6zjzZN7IKw0KKP/32+IVQtQi0Cdd4Xn+GOdwiK1O5tmLOsbdJ1Fu/7xk9TND
TwIDAQABo4IBRjCCAUIwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw
SwYIKwYBBQUHAQEEPzA9MDsGCCsGAQUFBzAChi9odHRwOi8vYXBwcy5pZGVudHJ1
c3QuY29tL3Jvb3RzL2RzdHJvb3RjYXgzLnA3YzAfBgNVHSMEGDAWgBTEp7Gkeyxx
+tvhS5B1/8QVYIWJEDBUBgNVHSAETTBLMAgGBmeBDAECATA/BgsrBgEEAYLfEwEB
ATAwMC4GCCsGAQUFBwIBFiJodHRwOi8vY3BzLnJvb3QteDEubGV0c2VuY3J5cHQu
b3JnMDwGA1UdHwQ1MDMwMaAvoC2GK2h0dHA6Ly9jcmwuaWRlbnRydXN0LmNvbS9E
U1RST09UQ0FYM0NSTC5jcmwwHQYDVR0OBBYEFHm0WeZ7tuXkAXOACIjIGlj26Ztu
MA0GCSqGSIb3DQEBCwUAA4IBAQAKcwBslm7/DlLQrt2M51oGrS+o44+/yQoDFVDC
5WxCu2+b9LRPwkSICHXM6webFGJueN7sJ7o5XPWioW5WlHAQU7G75K/QosMrAdSW
9MUgNTP52GE24HGNtLi1qoJFlcDyqSMo59ahy2cI2qBDLKobkx/J3vWraV0T9VuG
WCLKTVXkcGdtwlfFRjlBz4pYg1htmf5X6DYO8A4jqv2Il9DjXA6USbW1FzXSLr9O
he8Y4IWS6wY7bCkjCWDcRQJMEhg76fsO3txE+FiYruq9RUWhiF1myv4Q6W+CyBFC
Dfvp7OOGAN6dEOM4+qR9sdjoSYKEBpsr6GtPAQw4dy753ec5
-----END CERTIFICATE-----
---
Server certificate
subject=CN = scrapykoko.ml

issuer=C = US, O = Let's Encrypt, CN = R3

---
No client certificate CA names sent
Peer signing digest: SHA256
Peer signature type: RSA-PSS
Server Temp Key: X25519, 253 bits
---
SSL handshake has read 4589 bytes and written 395 bytes
Verification: OK
---
New, TLSv1.3, Cipher is TLS_AES_256_GCM_SHA384
Server public key is 2048 bit
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
Early data was not sent
Verify return code: 0 (ok)
---
---
Post-Handshake New Session Ticket arrived:
SSL-Session:
    Protocol  : TLSv1.3
    Cipher    : TLS_AES_256_GCM_SHA384
    Session-ID: CC8539718AF5E3C67509E8558FE9325D2887979FD81C28456416D4D438486131
    Session-ID-ctx:
    Resumption PSK: 75F8D2629AC0F23872CFF2B55B24ECF00D569C3108B16094BFEFE7D0973CF1A8364DB7B93C318F9DA80206D6D90202AD
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    TLS session ticket lifetime hint: 600 (seconds)
    TLS session ticket:
    0000 - 48 8b 6f 89 ae 6e c9 34-60 2e d7 9e 7f 66 0a 73   H.o..n.4`....f.s
    0010 - 99 f6 55 1f 45 d6 5a b8-9c 96 a4 92 be 42 01 d9   ..U.E.Z......B..

    Start Time: 1655689561
    Timeout   : 7200 (sec)
    Verify return code: 0 (ok)
    Extended master secret: no
    Max Early Data: 0
---
read R BLOCK
---
Post-Handshake New Session Ticket arrived:
SSL-Session:
    Protocol  : TLSv1.3
    Cipher    : TLS_AES_256_GCM_SHA384
    Session-ID: 81FD5707C531A98171DA02D89D44EA5092BC9D709E30BFB7064D9B463C76EA50
    Session-ID-ctx:
    Resumption PSK: E5E3949047AE72182896CC55A1015D68DDFEE3734929EA084BAB21B64C2B3D5AF84E9042B581F7E67D6C390A8644BE2D
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    TLS session ticket lifetime hint: 600 (seconds)
    TLS session ticket:
    0000 - e0 6f 45 73 d9 15 44 67-84 ab fa df 67 e7 49 53   .oEs..Dg....g.IS
    0010 - 52 b0 12 65 53 bd b9 dd-1f b7 14 d6 73 07 fa 9f   R..eS.......s...

    Start Time: 1655689561
    Timeout   : 7200 (sec)
    Verify return code: 0 (ok)
    Extended master secret: no
    Max Early Data: 0
---
read R BLOCK
depth=2 C = US, O = Internet Security Research Group, CN = ISRG Root X1
verify return:1
depth=1 C = US, O = Let's Encrypt, CN = R3
verify return:1
depth=0 CN = scrapykoko.ml
verify return:1
DONE

Lo hicimos dos veces ya que la primera vez tuvimos un problema con la máquina de windows y no detectaba bien el TLSv1.3, por eso en la primera se usó la TLSv1.2, pero todos modos lo volvimos a intentar después y funcionó.

Luego revisamos https://scrapykoko.ml/ para ver que el certificado sea válido:

Revisión del Certificado

Y ahora tenemos que hacer la revisión de poder alcanzar los servicios:

  • Host default

Primero se corrió el siguiente comando:

curl -v# 'https://scrapykoko.ml/' | egrep '</?title>'
*   Trying 20.213.61.249:443...
* Connected to scrapykoko.ml (20.213.61.249) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
*  CAfile: /etc/ssl/certs/ca-certificates.crt
*  CApath: /etc/ssl/certs
} [5 bytes data]
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
} [512 bytes data]
* TLSv1.3 (IN), TLS handshake, Server hello (2):
{ [122 bytes data]
* TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8):
{ [19 bytes data]
* TLSv1.3 (IN), TLS handshake, Certificate (11):
{ [4042 bytes data]
* TLSv1.3 (IN), TLS handshake, CERT verify (15):
{ [264 bytes data]
* TLSv1.3 (IN), TLS handshake, Finished (20):
{ [52 bytes data]
* TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1):
} [1 bytes data]
* TLSv1.3 (OUT), TLS handshake, Finished (20):
} [52 bytes data]
* SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384
* ALPN, server accepted to use h2
* Server certificate:
*  subject: CN=scrapykoko.ml
*  start date: Jun  8 00:59:46 2022 GMT
*  expire date: Sep  6 00:59:45 2022 GMT
*  subjectAltName: host "scrapykoko.ml" matched cert's "scrapykoko.ml"
*  issuer: C=US; O=Let's Encrypt; CN=R3
*  SSL certificate verify ok.
* Using HTTP2, server supports multi-use
* Connection state changed (HTTP/2 confirmed)
* Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0
} [5 bytes data]
* Using Stream ID: 1 (easy handle 0x56098badf5c0)
} [5 bytes data]
> GET / HTTP/2
> Host: scrapykoko.ml
> user-agent: curl/7.74.0
> accept: */*
>
{ [5 bytes data]
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
{ [57 bytes data]
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
{ [57 bytes data]
* old SSL session ID is stale, removing
{ [5 bytes data]
* Connection state changed (MAX_CONCURRENT_STREAMS == 128)!
} [5 bytes data]
< HTTP/2 200
< date: Sat, 18 Jun 2022 20:56:36 GMT
< content-type: text/html
< content-length: 610
< last-modified: Sat, 18 Jun 2022 18:38:27 GMT
< etag: "62ae1ba3-262"
< accept-ranges: bytes
< strict-transport-security: max-age=15724800; includeSubDomains
<
{ [610 bytes data]
######################################################################################### 100.0%* Connection #0 to host scrapykoko.ml left intact
    <title>Práctica 8 - Redes 2022-2</title>

Y luego se visitaron a:

https://scrapykoko.ml/
https://scrapykoko.ml/.well-known/acme-challenge/
  • Sitio de la documentación del kernel de linux

Primero se corrió el siguiente comando:

curl -v# 'https://kernel.scrapykoko.ml/' | egrep '</?title>'
*   Trying 20.213.61.249:443...
* Connected to kernel.scrapykoko.ml (20.213.61.249) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
*  CAfile: /etc/ssl/certs/ca-certificates.crt
*  CApath: /etc/ssl/certs
} [5 bytes data]
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
} [512 bytes data]
* TLSv1.3 (IN), TLS handshake, Server hello (2):
{ [122 bytes data]
* TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8):
{ [19 bytes data]
* TLSv1.3 (IN), TLS handshake, Certificate (11):
{ [4042 bytes data]
* TLSv1.3 (IN), TLS handshake, CERT verify (15):
{ [264 bytes data]
* TLSv1.3 (IN), TLS handshake, Finished (20):
{ [52 bytes data]
* TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1):
} [1 bytes data]
* TLSv1.3 (OUT), TLS handshake, Finished (20):
} [52 bytes data]
* SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384
* ALPN, server accepted to use h2
* Server certificate:
*  subject: CN=scrapykoko.ml
*  start date: Jun  8 00:59:46 2022 GMT
*  expire date: Sep  6 00:59:45 2022 GMT
*  subjectAltName: host "kernel.scrapykoko.ml" matched cert's "*.scrapykoko.ml"
*  issuer: C=US; O=Let's Encrypt; CN=R3
*  SSL certificate verify ok.
* Using HTTP2, server supports multi-use
* Connection state changed (HTTP/2 confirmed)
* Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0
} [5 bytes data]
* Using Stream ID: 1 (easy handle 0x559a443db5c0)
} [5 bytes data]
> GET / HTTP/2
> Host: kernel.scrapykoko.ml
> user-agent: curl/7.74.0
> accept: */*
>
{ [5 bytes data]
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
{ [57 bytes data]
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
{ [57 bytes data]
* old SSL session ID is stale, removing
{ [5 bytes data]
* Connection state changed (MAX_CONCURRENT_STREAMS == 128)!
} [5 bytes data]
< HTTP/2 200
< date: Sat, 18 Jun 2022 20:59:52 GMT
< content-type: text/html
< content-length: 145412
< last-modified: Thu, 09 Jun 2022 21:37:36 GMT
< etag: "62a26820-23804"
< accept-ranges: bytes
< strict-transport-security: max-age=15724800; includeSubDomains
<
{ [3853 bytes data]
  <title>The Linux Kernel documentation &mdash; The Linux Kernel  documentation</title>
######################################################################################### 100.0%* Connection #0 to host kernel.scrapykoko.ml left intact

Y luego se visitó a:

https://kernel.scrapykoko.ml/
  • Sitio web de tareas de la materia

Primero se corrió el siguiente comando:

curl -v# 'https://tareas.scrapykoko.ml/' | egrep '</?title>'
*   Trying 20.213.61.249:443...
* Connected to tareas.scrapykoko.ml (20.213.61.249) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
*  CAfile: /etc/ssl/certs/ca-certificates.crt
*  CApath: /etc/ssl/certs
} [5 bytes data]
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
} [512 bytes data]
* TLSv1.3 (IN), TLS handshake, Server hello (2):
{ [122 bytes data]
* TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8):
{ [19 bytes data]
* TLSv1.3 (IN), TLS handshake, Certificate (11):
{ [4042 bytes data]
* TLSv1.3 (IN), TLS handshake, CERT verify (15):
{ [264 bytes data]
* TLSv1.3 (IN), TLS handshake, Finished (20):
{ [52 bytes data]
* TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1):
} [1 bytes data]
* TLSv1.3 (OUT), TLS handshake, Finished (20):
} [52 bytes data]
* SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384
* ALPN, server accepted to use h2
* Server certificate:
*  subject: CN=scrapykoko.ml
*  start date: Jun  8 00:59:46 2022 GMT
*  expire date: Sep  6 00:59:45 2022 GMT
*  subjectAltName: host "tareas.scrapykoko.ml" matched cert's "*.scrapykoko.ml"
*  issuer: C=US; O=Let's Encrypt; CN=R3
*  SSL certificate verify ok.
* Using HTTP2, server supports multi-use
* Connection state changed (HTTP/2 confirmed)
* Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0
} [5 bytes data]
* Using Stream ID: 1 (easy handle 0x55a81b4465c0)
} [5 bytes data]
> GET / HTTP/2
> Host: tareas.scrapykoko.ml
> user-agent: curl/7.74.0
> accept: */*
>
{ [5 bytes data]
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
{ [57 bytes data]
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
{ [57 bytes data]
* old SSL session ID is stale, removing
{ [5 bytes data]
* Connection state changed (MAX_CONCURRENT_STREAMS == 128)!
} [5 bytes data]
< HTTP/2 200
< date: Sat, 18 Jun 2022 21:00:46 GMT
< content-type: text/html
< content-length: 15221
< last-modified: Fri, 17 Jun 2022 02:33:26 GMT
< etag: "62abe7f6-3b75"
< accept-ranges: bytes
< strict-transport-security: max-age=15724800; includeSubDomains
<
{ [3923 bytes data]
        <title>Redes - Tareas 2022-2</title>
######################################################################################### 100.0%*
Connection #0 to host tareas.scrapykoko.ml left intact

Y luego se visitó a:

https://tareas.scrapykoko.ml/

Archivos solicitados#

Archivos de configuración:#

Archivos de bitácora#

  • Estos se fueron incluyendo mientras se explicaba todo lo que fuimos haciendo en el proyecto.

Archivos de datos#

Recursos Kubernetes#

  • Archivo log del comando:
kubectl get all --all-namespaces > recursos-kubernetes.log
  • Archivo yaml del comando:
kubectl get all --all-namespaces -o yaml > recursos-kubernetes.yaml

Mismo archivo solo que después de pasarle neat

  • Archivo configmap yaml del comando:
kubectl get configmap index-equipo-amj-gab-tpkl -n default -o yaml

Mismo archivo solo que después de pasarle neat

  • Archivo deployment/root-nginx yaml del comando:
kubectl get deployment/root-nginx -n default -o yaml

Mismo archivo solo que después de pasarle neat

  • Archivo deployment/linux-doc yaml del comando:
kubectl get deployment/linux-doc -n default -o yaml

Mismo archivo solo que después de pasarle neat

  • Archivo deployment/tareas-redes yaml del comando:
kubectl get deployment/tareas-redes -n default -o yaml

Mismo archivo solo que después de pasarle neat

  • Archivo secret/nginx-ingress-tls yaml del comando:
kubectl get secret/nginx-ingress-tls -n default -o yaml

Mismo archivo solo que después de pasarle neat

  • Archivo ingress ingress-nginx yaml del comando:
kubectl get ingress ingress-nginx -n default -o yaml

Mismo archivo solo que después de pasarle neat

  • Archivo deployment/ingress-nginx-controller yaml

Mismo archivo solo que después de pasarle neat

Campos no necesarios que quita neat#

deployment#

Se quitaron los campos:

-  creationTimestamp: "2022-06-18T17:41:56Z"
-  generation: 7
-  resourceVersion: "47431"
-  uid: 2c8e991b-011e-4830-bfb8-4e17f2094d91
-  resources: {}
-  securityContext: {}
- status:
   availableReplicas: 1
   conditions:
   - lastTransitionTime: "2022-06-18T17:41:56Z"
     lastUpdateTime: "2022-06-18T18:38:07Z"
     message: ReplicaSet "root-nginx-787f7b4d49" has successfully progressed.
     reason: NewReplicaSetAvailable
     status: "True"
     type: Progressing
   - lastTransitionTime: "2022-06-18T18:38:31Z"
     lastUpdateTime: "2022-06-18T18:38:31Z"
     message: Deployment has minimum availability.
     reason: MinimumReplicasAvailable
     status: "True"
     type: Available
   observedGeneration: 7
   readyReplicas: 1
   replicas: 1
   updatedReplicas: 1

Se quitan los metadatos como (creationTimestamp, generation), también quita identificadores internos como (resourceVersion, uid), además quita la información del estado (status) eso quiere decir que quita todas las líneas que contenga en este caso:

   availableReplicas: 1
   conditions:
   - lastTransitionTime: "2022-06-18T17:41:56Z"
     lastUpdateTime: "2022-06-18T18:38:07Z"
     message: ReplicaSet "root-nginx-787f7b4d49" has successfully progressed.
     reason: NewReplicaSetAvailable
     status: "True"
     type: Progressing
   - lastTransitionTime: "2022-06-18T18:38:31Z"
     lastUpdateTime: "2022-06-18T18:38:31Z"
     message: Deployment has minimum availability.
     reason: MinimumReplicasAvailable
     status: "True"
     type: Available
   observedGeneration: 7
   readyReplicas: 1
   replicas: 1
   updatedReplicas: 1

Y también quita los atributos que fueron llenados con valores predeterminados como (resources y securityContext).

Además también se puede dar el caso como con el archivo de deployment/ingress-nginx-controller que se quite lo siguiente:

-  kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"apps/v1","kind":"Deployment","metadata":{"annotations":{},"labels":{"app.kubernetes.io/component":"controller","app.kubernetes.io/instance":"ingress-nginx","app.kubernetes.io/name":"ingress-nginx","app.kubernetes.io/part-of":"ingress-nginx","app.kubernetes.io/version":"1.2.0"},"name":"ingress-nginx-controller","namespace":"ingress-nginx"},"spec":{"minReadySeconds":0,"revisionHistoryLimit":10,"selector":{"matchLabels":{"app.kubernetes.io/component":"controller","app.kubernetes.io/instance":"ingress-nginx","app.kubernetes.io/name":"ingress-nginx"}},"template":{"metadata":{"labels":{"app.kubernetes.io/component":"controller","app.kubernetes.io/instance":"ingress-nginx","app.kubernetes.io/name":"ingress-nginx"}},"spec":{"containers":[{"args":["/nginx-ingress-controller","--publish-service=$(POD_NAMESPACE)/ingress-nginx-controller","--election-id=ingress-controller-leader","--controller-class=k8s.io/ingress-nginx","--ingress-class=nginx","--configmap=$(POD_NAMESPACE)/ingress-nginx-controller","--validating-webhook=:8443","--validating-webhook-certificate=/usr/local/certificates/cert","--validating-webhook-key=/usr/local/certificates/key"],"env":[{"name":"POD_NAME","valueFrom":{"fieldRef":{"fieldPath":"metadata.name"}}},{"name":"POD_NAMESPACE","valueFrom":{"fieldRef":{"fieldPath":"metadata.namespace"}}},{"name":"LD_PRELOAD","value":"/usr/local/lib/libmimalloc.so"}],"image":"k8s.gcr.io/ingress-nginx/controller:v1.2.0@sha256:d8196e3bc1e72547c5dec66d6556c0ff92a23f6d0919b206be170bc90d5f9185","imagePullPolicy":"IfNotPresent","lifecycle":{"preStop":{"exec":{"command":["/wait-shutdown"]}}},"livenessProbe":{"failureThreshold":5,"httpGet":{"path":"/healthz","port":10254,"scheme":"HTTP"},"initialDelaySeconds":10,"periodSeconds":10,"successThreshold":1,"timeoutSeconds":1},"name":"controller","ports":[{"containerPort":80,"name":"http","protocol":"TCP"},{"containerPort":443,"name":"https","protocol":"TCP"},{"containerPort":8443,"name":"webhook","protocol":"TCP"}],"readinessProbe":{"failureThreshold":3,"httpGet":{"path":"/healthz","port":10254,"scheme":"HTTP"},"initialDelaySeconds":10,"periodSeconds":10,"successThreshold":1,"timeoutSeconds":1},"resources":{"requests":{"cpu":"100m","memory":"90Mi"}},"securityContext":{"allowPrivilegeEscalation":true,"capabilities":{"add":["NET_BIND_SERVICE"],"drop":["ALL"]},"runAsUser":101},"volumeMounts":[{"mountPath":"/usr/local/certificates/","name":"webhook-cert","readOnly":true}]}],"dnsPolicy":"ClusterFirst","nodeSelector":{"kubernetes.io/os":"linux"},"serviceAccountName":"ingress-nginx","terminationGracePeriodSeconds":300,"volumes":[{"name":"webhook-cert","secret":{"secretName":"ingress-nginx-admission"}}]}}}}

Ya que también quita los atributos adicionales que fueron creados por el sistema como (kubectl.kubernetes.io/last-applied-configuration)

configmap#

Se quitaron los campos:

- creationTimestamp: "2022-06-18T17:41:24Z"
- resourceVersion: "45877"
- uid: 4fce6650-c271-43c5-a59a-51901592fc50

Se quitan los metadatos como (creationTimestamp), también quita identificadores internos como (resourceVersion, uid).

secret#

Se quitaron los campos:

- creationTimestamp: "2022-06-18T19:43:27Z"
- resourceVersion: "48892"
- uid: af549c17-490b-4610-b6ec-d835d7a4e473

Se quitan los metadatos como (creationTimestamp), también quita identificadores internos como (resourceVersion, uid).

ingress#

Se quitan los siguientes campos:

-  kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"networking.k8s.io/v1","kind":"Ingress","metadata":{"annotations":{"ingress.kubernetes.io/rewrite-target":"/","nginx.ingress.kubernetes.io/rewrite-target":"/","nginx.ingress.kubernetes.io/ssl-redirect":"false"},"name":"ingress-nginx","namespace":"default"},"spec":{"ingressClassName":"nginx","rules":[{"http":{"paths":[{"backend":{"service":{"name":"root-nginx","port":{"number":80}}},"path":"/","pathType":"Prefix"}]}},{"host":"kernel.scrapykoko.ml","http":{"paths":[{"backend":{"service":{"name":"linux-doc","port":{"number":80}}},"path":"/","pathType":"Prefix"}]}},{"host":"tareas.scrapykoko.ml","http":{"paths":[{"backend":{"service":{"name":"tareas-redes","port":{"number":80}}},"path":"/","pathType":"Prefix"}]}}],"tls":[{"hosts":["*.scrapykoko.ml","kernel.scrapykoko.ml","tareas.scrapykoko.ml"],"secretName":"nginx-ingress-tls"}]},"status":{"loadBalancer":{}}}


- creationTimestamp: "2022-06-18T18:12:19Z"
- generation: 2
- resourceVersion: "49002"
- uid: 108a236f-62e7-4d3c-9d84-a8e3068ca662
- status:
    loadBalancer: {}

Se quitan los metadatos como (creationTimestamp, generation), también quita identificadores internos como (resourceVersion, uid), además quita la información del estado (status) eso quiere decir que quita todas las líneas que contenga en este caso:

   loadBalancer: {}

Y también quita los atributos adicionales que fueron creados por el sistema como (kubectl.kubernetes.io/last-applied-configuration).