Ejercicios Docker, Kubernetes, OpenShift

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 31

Ejercicios Docker, Kubernetes,

OpenShift
1. Intro con Docker labs 3

2. Instalación de Docker en Windows 4

3. Creación de una página web 7

4. Lanzar una configuración de Compose con stack 8

5. Lanzar una configuración de Compose con Dockerfile 9

6. Crear una imagen con Docker e instanciarla 10

7. Guia paso a paso con kubectl 12


Precondición con Docker 12
Precondición con Minikube 13
Pasos 14
Google Cloud Registry 15

8. Creación de un pod desde github 15

9. Comprobar la resiliciencia del orquestador 15

10. Caso completo con Kubernetes 16

11. Escalado dinamico con Kubernetes (no require instalacion) 16

12. Autoescalado en local con Kubernetes 16

13. Registro con Openshift 16

14. Instanciar a partir de plantillas del catálogo 19

15. Despliegue con ficheros de configuración desde GitHub 22

16. Openshift CLI 25

17. Vulnerabilidades en Docker 25

Anexo I. resultado de un docker compose con Dockerfile 26

Anexo II. Chuletas de comandos 30

Anexo III. Fallo de docker en algunos Windows 30

Anexo IV. Instalación de kubernetes en Linux 30


1. Intro con Docker labs
1. Accede a https://www.docker.com/play-with-docker
2. Visita el lab environment y crea una cuenta de docker si no la tienes ya
3. Deberias acabar en https://labs.play-with-docker.com/
4. Crea una instancia

5. Introduce el comando docker run hello-world


6. Introduce solo docker y obten el listado de sub-comandos, algunos se usan a menudo
○ docker volume ...
○ docker image ...
○ docker ps
○ docker top ...
7. El laboratorio se mantiene varias horas, mantenlo abierto y aprovecha para ir probando
comandos que comentemos en teoría como docker run ubuntu

8. Observa que este run no saca ningún texto de salida, el hello-world sí lo hacía.
9. Prueba a lanzar docker image ls y observa el listado de imágenes disponibles

2. Instalación de Docker en Windows


El software que estamos instalando tiene numerosas dependencias, habrá que reiniciar varias
veces.

Actualización Agosto 2020: El primer paso de


descargar la VM ya no es necesario ni siquiera en
Windows 10 HOME Edition.

1. Descargar la VM de Windows
https://developer.microsoft.com/en-us/windows/downloads/virtual-machines/
a. Antes de arrancar subirle la memoria a 4GB y ponerle un par de cores
b. Al ejecutarla instalar Chrome y desanclar Internet Edge de la barra de tareas
2. Instalar Docker
a. Puede ser necesario habilitar virtualización en la bios del ordenador y en las
opciones del visor de la VM
b. Después de instalar Docker se debe instalar WSL2 Linux Kernel y requiere otro
reinicio. Si nos sale el segundo pantallazo antes de reiniciar hay que seguir el
link y pulsar en el primer link, descargar un exe e instalarlo:

3. Al arrancar Docker Desktop deberíamos ver un icono en la parte inferior derecha de una
ballena con contenedores encima

4. Y después de un rato veremos esta pantalla


5. No es necesario hacer “Sign in” para usar Docker en local. Necesitaremos git para
poder ejecutar el tutorial que nos guiará por el proceso de descarga e instalación
a. Durante la instalación de git recomiendo instalar Notepad++ cuando os pregunte
b. El resto de opciones se pueden dejar con el valor por defecto
6. Ya podemos ejecutar comandos de PowerShell
7. En el siguiente link se explican algunos de los parámetros básicos de Docker Desktop,
simplifica mucho empezar a trabajar con contenedores, acceso por CMD a los mismos y
volúmenes.
a. https://docs.docker.com/docker-for-windows/

3. Creación de una página web


La mayoría de la documentación que nos permite trabajar con Docker está en formato GitHub
(páginas web con archivos de compilación, construcción y empaquetado).
https://github.com/docker/labs/blob/master/beginner/chapters/webapps.md (solo hasta el
2.2 incluido)

4. Lanzar una configuración de Compose con stack


Los siguientes links son interesantes como editores si no teneis ningun IDE específico para
Compose
● Editor simple: https://codebeautify.org/yaml-validator/cbccd63a
● Editor con tutorial: https://www.composerize.com/

Vamos a reproducir el siguiente ejercicio:


https://github.com/docker/labs/blob/master/beginner/chapters/votingapp.md

Empezamos bajando archivos que van a contener varios recursos necesarios para el ejercicio

Ahora lo correcto es analizar con detalle cada carpeta buscando archivos relevantes para el
curso (dockerfiles, compose.yaml,...), encontramos un dockerfile en la carpeta vote

Y en la carpeta raíz tenemos ficheros de compose


Windows-1809 hace alusión a una versión de Windows (dentro de Windows 10)

Seguimos con el proceso de construcción.

Vemos que se emplea un comando de Swarm, nos facilitará un entorno de ejecución


configurado por defecto para ejecutar nuestro Compose y a continuación lanzamos uno de los
Compose existentes

Probar el acceso a la web y modificar el yaml según el tutorial de github

5. Lanzar una configuración de Compose con


Dockerfile
Vamos a reproducir este ejercicio

https://docs.docker.com/compose/gettingstarted/

Seguramente al usar una maquina windows os pase este problema con las extensiones ocultas
Finalmente debería ejecutar correctamente (cuidado con tener el puerto 5000 abierto de
ejercicios anteriores, si arrancasteis con swarm, el swarm os reiniciara los contenedores al
apagarlos)

6. Crear una imagen con Docker e instanciarla


Creamos un fichero Dockerfile, en este caso basado en Tomcat, vamos a instalar un
HelloWorld. Como mi perfil es de Java voy a crear una instalación trivial con Tomcat, si
prefieres hacerlo con una pila Python o PHP también es muy sencillo (con .NET no es tan
trivial)

FROM tomcat
MAINTAINER raullapeira
RUN apt-get update && apt-get -y upgrade
WORKDIR /usr/local/tomcat
COPY HelloWorld.war /usr/local/tomcat/webapps/HelloWorld.war
EXPOSE 8080

Tendremos que copiar también el fichero war en la raíz de la instalación.

Creamos la imagen, nos debería descargar primero las imágenes de las capas que forman la
imagen de Tomcat y después construirla

PS C:\sw\imagenTomcat> docker build .


Sending build context to Docker daemon 839.2kB
Step 1/6 : FROM tomcat
---> f796d3d2c195
Step 2/6 : MAINTAINER raullapeira
---> Using cache
---> a3cc4ba7d9d2
Step 3/6 : RUN apt-get update && apt-get -y upgrade
---> Using cache
---> b2b6435b2fb8
Step 4/6 : WORKDIR /usr/local/tomcat
---> Using cache
---> b3aebbc34c63
Step 5/6 : COPY HelloWorld.war /usr/local/tomcat/webapps/HelloWorld.war
---> 3e280f4b5c26
Step 6/6 : EXPOSE 8080
---> Running in 3854e9d85457
Removing intermediate container 3854e9d85457
---> a4200b2a841b
Successfully built a4200b2a841b
SECURITY WARNING: You are building a Docker image from Windows against a non-Windows Docker
host. All files and directories added to build context will have '-rwxr-xr-x' permissions. It
is recommended to double check and reset permissions for sensitive files and directories.

A continuación lanzamos un nuevo contenedor a partir del id de la imagen

PS C:\sw\imagenTomcat> docker run a4200b2a841b


NOTE: Picked up JDK_JAVA_OPTIONS:
--add-opens=java.base/java.lang=ALL-UNNAMED
--add-opens=java.base/java.io=ALL-UNNAMED
--add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED
03-Oct-2020 06:20:33.450 INFO [main]
org.apache.catalina.startup.VersionLoggerListener.log Server version
name: Apache Tomcat/9.0.38
03-Oct-2020 06:20:33.491 INFO [main]
org.apache.catalina.startup.VersionLoggerListener.log Server built:
Sep 10 2020 08:20:30 UTC
03-Oct-2020 06:20:33.491 INFO [main]
org.apache.catalina.startup.VersionLoggerListener.log Server version
number: 9.0.38.0
03-Oct-2020 06:20:33.491 INFO [main]
org.apache.catalina.startup.VersionLoggerListener.log OS Name:
Linux
[...]
org.apache.jasper.servlet.TldScanner.scanJars At least one JAR was
scanned for TLDs yet contained no TLDs. Enable debug logging for this
logger for a complete list of JARs that were scanned but no TLDs were
found in them. Skipping unneeded JARs during scanning can improve
startup time and JSP compilation time.
03-Oct-2020 06:20:37.092 INFO [main]
org.apache.catalina.startup.HostConfig.deployWAR Deployment of web
application archive [/usr/local/tomcat/webapps/HelloWorld.war] has
finished in [1,356] ms
03-Oct-2020 06:20:37.096 INFO [main]
org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler
["http-nio-8080"]
03-Oct-2020 06:20:37.197 INFO [main]
org.apache.catalina.startup.Catalina.start Server startup in [1888]
milliseconds

No podemos acceder al contenedor por el 8080 porque no lo hemos mapeado al host al


arrancar el contenedor ¿como habríamos expuesto y mapeado el puerto en el docker run?

7. Guia paso a paso con kubectl

Precondición con Docker


Esta guía se reproduce en cloud pero si queremos reproducir algún paso en Docker Desktop se
debe habilitar kubernetes para poder usarlo
Precondición con Minikube
Para algunas versiones de Docker en Windows puede ser necesario bajar el minikube de 64
bits, renombrarlo a minikube.exe, ponerlo en una carpeta de Windows y meter dicha ruta en el
path. Después hay que reabrir powershell para que se pille el cambio en el path.

https://kubernetes.io/es/docs/tasks/tools/install-minikube/
Pasos
Vamos a usar esta guía paso a paso para ver el proceso completo

https://kubernetes.io/docs/tutorials/kubernetes-basics/create-cluster/cluster-interactive/

La guía consta de cinco pasos

Espera a que los comandos devuelvan el prompt y comprueba el resultado de los componentes
que vamos arrancando
Google Cloud Registry
El google cloud registry tiene un dominio de alias en gcr.io de manera que

gcr.io/google-samples/kubernetes-bootcamp

Te redirecciona al registro de imágenes del cloud de google

8. Creación de un pod desde github


La creación de un pod a partir de un yaml disponible en github o un servicio hosteado es
habitual

https://kubernetes.io/docs/tutorials/stateless-application/guestbook/

Es importante comprobar el estado de cada comando y dar tiempo para su terminación

9. Comprobar la resiliciencia del orquestador


Si usamos docker swarm en un ejercicio anterior posiblemente ya observamos que un
orquestador va a controlar el ciclo de vida de nuestros contenedores. Vamos a reproducir desde
el paso 4 el siguiente proceso para ver un resultado similar en kubernetes
https://birthday.play-with-docker.com/kubernetes-docker-desktop/

10. Caso completo con Kubernetes


https://kubernetes.io/docs/concepts/services-networking/connect-applications-service/

11. Escalado dinamico con Kubernetes (no require


instalacion)
https://kubernetes.io/docs/tutorials/kubernetes-basics/scale/scale-interactive/

Extensión: Reproducir la práctica en local con Docker for Windows

12. Autoescalado en local con Kubernetes


https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough/

13. Registro con Openshift


Crea una cuenta de developer en openshift → try

Pulsa en “Developer Sandbox”, el “Managed Service” se hospeda en clouds de AWS o Azure


que tu debes proporcionar, pero es más versátil (para este curso el Developer Sandbox es más
que suficiente).
Después de un par de links deberiamos ver el siguiente link:

Nos pedirá una cuenta de registro pero no debería solicitar tarjeta de crédito.

Como parte de este proceso deberíamos recibir un email de registro:


El procedimiento de registro tiene varios pasos de identificación (SMS, aceptar acuerdo y
demás). Una vez dentro podemos “skip” el “Guided tour”.

Sabemos que estamos en el sitio correcto si vemos los siguiente:


14. Instanciar a partir de plantillas del catálogo
En el portal de OpenShift, modo Developer, accedemos al catálogo de plantillas

Seleccionamos la siguiente de Tomcat:


Pulsamos “Instanciar plantilla”

En la configuración vemos varios parámetros:


En los anteriores parámetros identificamos que va a instanciar esta ruta:

https://github.com/jboss-openshift/openshift-quickstarts/tree/master/tomcat-websocket-chat

Lanzamos la creación de la instancia

Al cabo de un rato termina construcción de la imagen y la despliega, puede comprobarse en la


ruta especificada en el despliegue:

http://jws-app-raullapeira-dev.apps.sandbox-m2.ll9k.p1.openshiftapps.com/websocket-chat/
Como hemos desplegado un contenedor de una imagen que solo tiene tomcat, tendría sentido
conectar nuestro contenedor de Tomcat con otro de PostgreSQL o MySQL

15. Despliegue con ficheros de configuración desde


GitHub
Vamos a crear un contenedor siguiendo un tutorial de OpenShift que emplea ficheros de
aprovisionamiento ya ubicados en GitHub para simplificar la configuración de los contenedores.
Este proceso falla por un problema de dependencias Java pero aprovechamos para analizar
cómo depurar este tipo de problemas.
Esta guía hace alusión a este git:
https://github.com/snowdrop/rest-http-example

Que contiene la configuración de OpenShift ubicada en la siguiente carpeta:

https://github.com/snowdrop/rest-http-example/tree/master/.openshiftio

Al crear la configuración en el portal de developer de Openshift , veremos que automaticamente


se detecta dicha configuración y nos evita tener que parametrizar a mano:

Le damos a create y veremos que el proceso de despliegue copia el GitHub y empieza a


compilar:
Después de un tiempo
podemos ver el resultado del
lanzamiento. En este caso
por ejemplo vemos el mapeo
de puertos de servicio a pod
funcionó bien, que la ruta de
acceso para estar ok pero
que al crear uno de los pods
se produjo un fallo. Este sí
vemos los log se trata de una
excepción provocada por una
dependencia faltante:

Caused by:
java.lang.NoClassDefFound
Error:
javax/xml/bind/JAXBExcept
ion

¿Por qué se produce este fallo? ¿es un problema de la imagen? ¿de openshift? ¿de las
librerías de la aplicación?, plantee sus dudas en clase al formador o a los compañeros.

Una vez terminemos con el ejercicio eliminamos la instancia:


En la pestaña de administración podemos comprobar el resultado a bajo nivel de las acciones
que hemos realizado:

16. Openshift CLI


https://docs.openshift.com/container-platform/4.2/cli_reference/openshift_cli/getting-started-cli.ht
ml

17. Caso final


Montar una topología de 3 capas para desarrolladores donde se contemple un servidor web, un
servidor de aplicaciones (tomcat, IIS, JBoss) y un servidor de BBDD. El objetivo es poder
provisionar entornos de programador para chavales que entran nuevos al proyecto sin que se
tengan que preocupar del setup. Las preguntas que tendremos que responder son:
● ¿Definimos nuestros propios DockerFile o usamos imágenes preexistentes? ¿Sí
usamos imagenes preexistentes como bajamos el código de github para que los
entornos de desarrollo tengan el código correcto
● ¿Vamos a usar kubernetes con pods para que el setup esté mejor “orquestado”? ¿Sí es
así vamos a usar un solo pod con los x contenedores y volúmenes que necesitemos o
vamos a usar 1 pod por contenedor?
● Vamos a usar openshift? ¿funciona realmente el servicio openshift de trial para
developers?.
● ¿Podemos desplegar nuestra solución de contenedores en cloud de AWS o Azure?
¿como?

18. Vulnerabilidades en Docker


Vamos a usar docker scan para analizar vulnerabilidades en imágenes, por defecto Docker usa
Snyk para esta labor:

Anexo I. resultado de un docker compose con


Dockerfile
PS C:\Users\User\composetest> docker-compose up
WARNING: The Docker Engine you're using is running in swarm mode.

Compose does not use swarm mode to deploy services to multiple nodes
in a swarm. All containers will be scheduled on the current node.

To deploy your application across the swarm, use `docker stack


deploy`.

Building web
Step 1/10 : FROM python:3.7-alpine
3.7-alpine: Pulling from library/python
df20fa9351a1: Already exists
36b3adc4ff6f: Pull complete
4db9de03f499: Pull complete
cd38a04a61f4: Pull complete
9a3838385f13: Pull complete
Digest:
sha256:9fbee97d521b846689f4dbf0d5f2770c734d4a09e6d0a0991efc916c58970e
99
Status: Downloaded newer image for python:3.7-alpine
---> 295b051ee125
Step 2/10 : WORKDIR /code
---> Running in a66a2e0ed02b
Removing intermediate container a66a2e0ed02b
---> bc0abed17805
Step 3/10 : ENV FLASK_APP=app.py
---> Running in 46e2b2e11755
Removing intermediate container 46e2b2e11755
---> f5664bf71ee1
Step 4/10 : ENV FLASK_RUN_HOST=0.0.0.0
---> Running in 8bef14c059ff
Removing intermediate container 8bef14c059ff
---> 29451d2b01f4
Step 5/10 : RUN apk add --no-cache gcc musl-dev linux-headers
---> Running in 675cda512091
fetch
http://dl-cdn.alpinelinux.org/alpine/v3.12/main/x86_64/APKINDEX.tar.g
z
fetch
http://dl-cdn.alpinelinux.org/alpine/v3.12/community/x86_64/APKINDEX.
tar.gz
(1/13) Installing libgcc (9.3.0-r2)
(2/13) Installing libstdc++ (9.3.0-r2)
(3/13) Installing binutils (2.34-r1)
(4/13) Installing gmp (6.2.0-r0)
(5/13) Installing isl (0.18-r0)
(6/13) Installing libgomp (9.3.0-r2)
(7/13) Installing libatomic (9.3.0-r2)
(8/13) Installing libgphobos (9.3.0-r2)
(9/13) Installing mpfr4 (4.0.2-r4)
(10/13) Installing mpc1 (1.1.0-r1)
(11/13) Installing gcc (9.3.0-r2)
(12/13) Installing linux-headers (5.4.5-r1)
(13/13) Installing musl-dev (1.1.24-r9)
Executing busybox-1.31.1-r16.trigger
OK: 153 MiB in 48 packages
Removing intermediate container 675cda512091
---> e2ab9084a38f
Step 6/10 : COPY requirements.txt requirements.txt
---> 19c37364e179
Step 7/10 : RUN pip install -r requirements.txt
---> Running in 7c6fab002a1b
Collecting flask
Downloading Flask-1.1.2-py2.py3-none-any.whl (94 kB)
Collecting redis
Downloading redis-3.5.3-py2.py3-none-any.whl (72 kB)
Collecting Jinja2>=2.10.1
Downloading Jinja2-2.11.2-py2.py3-none-any.whl (125 kB)
Collecting Werkzeug>=0.15
Downloading Werkzeug-1.0.1-py2.py3-none-any.whl (298 kB)
Collecting click>=5.1
Downloading click-7.1.2-py2.py3-none-any.whl (82 kB)
Collecting itsdangerous>=0.24
Downloading itsdangerous-1.1.0-py2.py3-none-any.whl (16 kB)
Collecting MarkupSafe>=0.23
Downloading MarkupSafe-1.1.1.tar.gz (19 kB)
Building wheels for collected packages: MarkupSafe
Building wheel for MarkupSafe (setup.py): started
Building wheel for MarkupSafe (setup.py): finished with status
'done'
Created wheel for MarkupSafe:
filename=MarkupSafe-1.1.1-cp37-cp37m-linux_x86_64.whl size=16913
sha256=cf4819e501d00b066582ae405b9f28bd720b4031780639dddebf73aa84c120
e0
Stored in directory:
/root/.cache/pip/wheels/b9/d9/ae/63bf9056b0a22b13ade9f6b9e08187c1bb71
c47ef21a8c9924
Successfully built MarkupSafe
Installing collected packages: MarkupSafe, Jinja2, Werkzeug, click,
itsdangerous, flask, redis
Successfully installed Jinja2-2.11.2 MarkupSafe-1.1.1 Werkzeug-1.0.1
click-7.1.2 flask-1.1.2 itsdangerous-1.1.0 redis-3.5.3
Removing intermediate container 7c6fab002a1b
---> ef7b5b8ef2ae
Step 8/10 : EXPOSE 5000
---> Running in 23a028a72780
Removing intermediate container 23a028a72780
---> 202a371ebc4e
Step 9/10 : COPY . .
---> fb5721e8d1e1
Step 10/10 : CMD ["flask", "run"]
---> Running in 638ff8022c7c
Removing intermediate container 638ff8022c7c
---> 368847a7f67d

Successfully built 368847a7f67d


Successfully tagged composetest_web:latest
WARNING: Image for service web was built because it did not already
exist. To rebuild this image you must use `docker-compose build` or
`docker-compose up --build`.
Pulling redis (redis:alpine)...
alpine: Pulling from library/redis
Digest:
sha256:4015d7a6a0901920a3adfae3a538bf8489325738153948f95ca2b637944bdf
e5
Status: Downloaded newer image for redis:alpine
Creating composetest_redis_1 ...
Creating composetest_web_1 ...
Creating composetest_web_1 ... error

Creating composetest_redis_1 ... done


9fca4850e642830ccbd1c8f9a7): Error starting userland proxy: listen
tcp 0.0.0.0:5000: bind: address already in use

ERROR: for web Cannot start service web: driver failed programming
external connectivity on endpoint composetest_web_1
(8002e568dfdb15fafb37eb91737576c29d4dc09fca4850e642830ccbd1c8f9a7):
Error starting userland proxy: listen tcp 0.0.0.0:5000: bind: address
already in use
ERROR: Encountered errors while bringing up the project.

** apagamos el contenedor que colisiona y volvemos a lanzar sin el


Swarm mode **

PS C:\Users\User\composetest> docker-compose up
Creating composetest_redis_1 ... done
Creating composetest_web_1 ... done
Attaching to composetest_redis_1, composetest_web_1
redis_1 | 1:C 24 Sep 2020 09:38:49.713 # oO0OoO0OoO0Oo Redis is
starting oO0OoO0OoO0Oo
redis_1 | 1:C 24 Sep 2020 09:38:49.713 # Redis version=6.0.8,
bits=64, commit=00000000, modified=0, pid=1, just started
redis_1 | 1:C 24 Sep 2020 09:38:49.713 # Warning: no config file
specified, using the default config. In order to specify a config
file use redis-server /path/to/redis.conf
redis_1 | 1:M 24 Sep 2020 09:38:49.716 * Running mode=standalone,
port=6379.
redis_1 | 1:M 24 Sep 2020 09:38:49.716 # WARNING: The TCP backlog
setting of 511 cannot be enforced because
/proc/sys/net/core/somaxconn is set to the lower value of 128.
redis_1 | 1:M 24 Sep 2020 09:38:49.716 # Server initialized
redis_1 | 1:M 24 Sep 2020 09:38:49.716 # WARNING overcommit_memory
is set to 0! Background save may fail under low memory condition. To
fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and
then reboot or run the command 'sysctl vm.overcommit_memory=1' for
this to take effect.
redis_1 | 1:M 24 Sep 2020 09:38:49.716 # WARNING you have
Transparent Huge Pages (THP) support enabled in your kernel. This
will create latency and memory usage issues with Redis. To fix this
issue run the command 'echo madvise >
/sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to
your /etc/rc.local in order to retain the setting after a reboot.
Redis must be restarted after THP is disabled (set to 'madvise' or
'never').
redis_1 | 1:M 24 Sep 2020 09:38:49.716 * Ready to accept connections
web_1 | * Serving Flask app "app.py"
web_1 | * Environment: production
web_1 | WARNING: This is a development server. Do not use it in
a production deployment.
web_1 | Use a production WSGI server instead.
web_1 | * Debug mode: off
web_1 | * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)

Anexo II. Chuletas de comandos

docker update --restart=no Hacer que los contenedores no se reinicien


$(docker ps -a -q) automáticamente
docker stop $(docker ps -a -q) Parar todos los contenedores

docker rm $(docker ps -a -q) Eliminar todos los contenedores

docker update --restart=no restart no para un contenedor en concreto


d539d3b5b358

docker swarm leave --force Salir del swarm cuando es el manager


Anexo III. Fallo de docker en algunos Windows
https://github.com/docker/for-win/issues/7154

Anexo IV. Instalación de kubernetes en Linux


● Voy al gestor de paquetes para simplificar la instalación, resulta fácil siguiendo estos
pasos
○ https://ubuntu.com/kubernetes/install
● Para instalar los binarios seguimos estos pasos:
○ https://kubernetes.io/docs/tasks/tools/install-kubectl/

También podría gustarte