El propósito de este documento es ofrecer una descripción general de la tecnología de Kubernetes, abordando conceptos básicos incluyendo prácticas de laboratorio esenciales para el entendimiento de un entorno de Kubernetes.
2. Uso básico Kubernetes| Moisés E. Araya
[1]
Instalación y uso básico
de Kubernetes
Moisés Elías Araya
2021
3. Uso básico Kubernetes| Moisés E. Araya
[2]
Tabla de contenido
Introducción. ....................................................................................................................... 3
¿Qué es Kubernetes?............................................................................................................... 4
Componentes Kubernetes.................................................................................................. 5
Objetos en Kubernetes. .................................................................................................... 6
Instalación Kubernetes. ....................................................................................................... 7
Instalar Minikube. .............................................................................................................. 8
Procedimiento................................................................................................................ 8
Primeros pasos con minikube.............................................................................................. 8
Instalar kubectl. ...............................................................................................................10
Procedimiento...............................................................................................................10
Primeros comandos con kubectl. ........................................................................................11
Desplegar primera aplicación en Kubernetes utilizando kubectl. .................................................12
Uso de archivos en formato YAML. .........................................................................................16
ReplicaSet....................................................................................................................16
Deployment..................................................................................................................18
Eliminar las configuraciones..............................................................................................20
Archivos de ejemplo. ......................................................................................................20
Instalar Dashboard.............................................................................................................21
Procedimiento...............................................................................................................21
Lista de comandos utilizados................................................................................................25
Alternativas a Kubernetes....................................................................................................26
Anexo A – Google Kubernetes Engine. .....................................................................................27
Parte 1- Crear Clúster utilizando la consola web de GCP. ..........................................................27
Parte 2 - Desplegar una aplicación NGINX en el clúster. ............................................................31
Parte 3 – Exponer la aplicación. .........................................................................................33
Parte 4 - Borrar el Clúster. ...............................................................................................34
Anexo B - Kubernetes Windows 10..........................................................................................35
Comandos Kubernetes. ....................................................................................................36
Anexo C - Instalar VirtualBox en CentOs V8...............................................................................37
Procedimiento...............................................................................................................37
Conclusión. .....................................................................................................................39
Referencias. ....................................................................................................................39
4. Uso básico Kubernetes| Moisés E. Araya
[3]
Introducción.
El propósito de este documento es ofrecer una descripción general de la tecnología de Kubernetes, abordando
conceptos básicos incluyendo prácticas de laboratorio esenciales para el entendimiento de un entorno de
Kubernetes.
Este documento se divide en 4 partes principales;
• En la primera parte de describe que es Kubernetes, sus componentes principales y sus objetos más
usados.
• En la segunda parte se realiza la instalación de las herramientas minikube y kubectl para luego
realizar prácticas de creación de despliegues y exponer un servicio utilizando la línea de comandos y
archivos yaml.
• En la tercera parte se describe la instalación del Dashboard de Kubernetes como también el listado de
comandos usados y las alternativas que tenemos para Kubernetes.
• Finalmente, en la última parte se ofrecen una serie de anexos de apoyo a esta obra tales como; crear
un cluster de Kubernetes (GKE) utilizando la consola web de Google Cloud, habilitar Kubernetes en un
entorno Windows por medio de Docker Desktop y la instalación de Oracle VirtualBox en CentOS que
prerrequisito para el uso de la herramienta minikube.
Este documento requiere conocimientos básicos de contenedores, entornos cloud y Linux.
5. Uso básico Kubernetes| Moisés E. Araya
[4]
¿Qué es Kubernetes?
Kubernetes es una plataforma de código abierto que es
utilizada para la administración, escalado e implementación
de aplicaciones en contenedores, en palabras más simples, es
un orquestador de contenedores que está escrito en el
lenguaje Go, fue creado por Google en 2014 y actualmente es
mantenido por la CNCF (Cloud Native Computing Foundation).
Kubernetes viene del griego κυβερνήτης (pronunciado “koo-
burr-NET-eez”) y es el equivalente a piloto o timonel (pilot o
helmsman en inglés), K8S es su abreviación.
Algunas características y ventajas:
• Planificación automatizada.
• Capacidad de auto-reparación.
• Actualizaciones y rollbacks automáticos.
• Balanceo de carga y escalado horizontal.
• Simplifica el despliegue de aplicaciones.
• Auto escalado/expansión de los Pods.
• Replicación de instancias de la aplicación.
• Proporciona autenticación y autorización.
• Nombrado y descubrimiento de servicios.
• Posee un ecosistema en crecimiento.
Que no es Kubernetes.
• No es un PaaS.
• No limita el tipo de aplicación.
• No despliega código fuente ni crea aplicaciones.
• No es una solución de monitoreo ni de alertas ni de logging.
• No provee servicios de middleware, bases de datos ni otros servicios.
¿Dónde puede ser utilizado?
• Servidores físicos (Bare Metal)
• Máquinas virtuales On premise.
• Nubes públicas.
¿Porque Kubernetes?
El desarrollo de aplicaciones actuales está fuertemente marcado por el uso de microservicios, una aplicación
puede constar de varios microservicios, normalmente estos microservicios van insertos en contenedores y en
los entornos productivos cuentan con varios de ellos (cientos o miles), si este número crece en nuestro
sistema, se puede volver tediosa la administración de demasiados contenedores dado que se precisa coordinar
despliegues, rollbacks, escalado automático, administración de los servicios, etc, acá es donde entra
Kubernetes. Kubernetes posee las características de gestión de contenedores a gran escala.
6. Uso básico Kubernetes| Moisés E. Araya
[5]
Componentes Kubernetes.
Componentes de Kubernetes.
En Kubernetes existen dos tipos de nodos; el nodo máster y el nodo worker, el nodo máster es el encargado de
gestionar todo el clúster de K8S mientras que el nodo worker se encarga de ejecutar todos los trabajos que
son recepcionados por el clúster, puede ser una máquina virtual o una maquina física.
Máster contiene:
• API server: Permite interactuar con el clúster, toda la comunicación en el clúster utiliza esta API.
• Scheduler: Posiciona los pod en nodos con suficientes recursos para ser creados/ejecutados.
• Controller Manager: Contiene: controlador de nodos/replicas/enlaces/identidad de servicios y
token/administrador de controlador de proveedores de la nube.
• etcd: Base de datos de clave-valor, es donde se almacenan todos los datos/configuración/información
de kubernetes.
Nodo contiene:
• Kubelet: Agente principal, existe en todos los nodos y nos asegura que todos los componentes están
operativos.
• Kubernetes Proxy: Permite la conexión de red y enruta las conexiones al pod o servicios necesarios.
• Container Engine: Ejecuta los contenedores (docker/crio/containerd).
Puertos TCP utilizados por Kubernetes.
Todos: Solicitudes API, Nodos Worker y usuarios finales.
Componente Puerto Utilizado por
API 6443 *Todos
Kubelet 10250 Kubelet API
Scheduler 10251 kube-scheduler
Controller Manager 10252 kube-controller-manager
etcd 2379-2380 API/etcd
NodePort 30000-32767 Aplicaciones de consumo externas
7. Uso básico Kubernetes| Moisés E. Araya
[6]
Objetos en Kubernetes.
De acuerdo con la documentación oficial de Kubernetes, los objetos:
“Son entidades persistentes en el sistema de Kubernetes, Kubernetes usa estas entidades para
representar el estado de su clúster. Específicamente, ellos pueden describir que aplicaciones corren en
contenedores (y en que nodos), los recursos disponibles para dichas aplicaciones y las políticas acerca de
cómo dichas aplicaciones se comportan, como reiniciar políticas, actualizaciones y tolerancia a fallos”.
A continuación, se van a describir los objetos más importantes o utilizados en K8S.
• Pod (vaina): La unidad más pequeña y básica que se puede crear y administrar en K8S, contiene uno o
más contenedores, comparten la red y el almacenamiento, ejecutan una aplicación o un componente
de ella. Los pods son volátiles, es decir, cuando se destruyen pierden toda la información.
• Controladores: Agrupación de objetos que permiten desplegar, mantener y atender los recursos
deseados en un clúster, kubernetes dispone de los siguientes controladores:
o ReplicaSets: Asegura que un número determinado de pods siempre se están ejecutando en
todo momento.
o Replication Controller: Realiza la misma labor que ReplicaSet pero no admite selectores.
o Deployments: Permite actualizaciones declarativas para Pods y ReplicaSets, controlar el
número de replicas, automatizar despliegues y hacer rollbacks de aplicaciones.
o StatefulSets: Se diferencia del Deployment por gestionar aplicaciones persistentes y utilizar
identificadores únicos.
o Demon Sets: Asegura que todos los nodos ejecuten un pod especifico.
o Jobs: Crea uno o más pods y se asegura que completa su ejecución completamente.
o Cron Jobs: Es un Job que se ejecuta de forma programada.
• Servicios: Permite agrupar los pods y establecer un punto de acceso común para acceder/conectar a
las aplicaciones desplegadas en ellos, sirve de balanceador de carga para el acceso interno/externo,
los tipos de servicios básicos disponibles son:
o ClusterIP: Es el tipo de servicio predeterminado que expone una dirección IP dentro del
clúster.
o NodePort: Asigna un puerto estático en los pods para el reenvío del tráfico hacia el exterior.
o LoadBalancer: Crea un balanceador de cargas que reenvía todo el tráfico al servicio, es el
tipo de servicio que usualmente se utiliza para exponer un servicio en Internet.
Según la documentación oficial de Kubernetes un servicio es: “Es una forma abstracta de exponer una
aplicación que se ejecuta en un conjunto de pods como un servicio de red".
• Namespaces (Espacio de nombres): Permite la creación de clústeres lógicos y aislar los recursos para
separar/agrupar y trabajar en distintos proyectos, se pueden definir cuotas, reglas y políticas de
acceso. Normalmente existen 3 namespaces:
o default: sitio por defecto donde se ejecutan los recursos.
o kube-system: Donde se ejecutan todos los recursos esenciales del sistema y administrador por
Kubernetes.
o kube-public: Sirve para guardar datos públicos donde usuarios autenticados y no puedan
acceder.
Otros objetos disponibles en Kubernetes son: Ingress, NetworkPolicy, PersistenVolume,
PersistentVolumeClaim, StorageClass, ConfigMap y Secrets.
8. Uso básico Kubernetes| Moisés E. Araya
[7]
Instalación Kubernetes.
K8S puede ser instalado en distintas modalidades, en esta oportunidad se utilizará el modo AIO (minikube)
donde todos los componentes se ejecutan en un solo nodo, esto es útil para tareas de aprendizaje, desarrollo
y pruebas.
Arquitectura local.
Minikube es una versión resumida de Kubernetes escrita en lenguaje GO que permite crear un clúster local en
un solo nodo.
Minikube soporta las siguientes características de Kubernetes:
• DNS.
• NodePorts.
• ConfigMaps and Secrets.
• Dashboards.
• Container Runtime: Docker, CRI-O y containerd.
• Enabling CNI (Container Network Interface)
• Ingress.
• PersistentVolumes of type hostPath.
Entorno utilizado.
• Máquina Virtual Centos V8 5GB RAM/2CPU.
• Docker V19 instalado en MV.
• Virtual Box V6 instalado en MV.
Prerrequisitos.
• En Hypervisor de máquina virtual, activar virtualización y aumentar a 2 Cores.
Después de iniciar MV, verificar que esta activa la virtualización ejecutando el comando:
[root@centos8 ~]# sort -u <<<$(egrep -o -i --color "vmx|svm" /proc/cpuinfo)
vmx
9. Uso básico Kubernetes| Moisés E. Araya
[8]
Instalar Minikube.
Procedimiento.
• Descargar minikube.
• Modificar permisos.
• Crear directorio.
• Mover a directorio.
• Instalar.
• Verificar versión.
[root@centos8 ~]# wget https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
--2020-08-31 22:04:55-- https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
Resolviendo storage.googleapis.com (storage.googleapis.com)... 172.217.192.128, 2800:3f0:4003:c02::80
Conectando con storage.googleapis.com (storage.googleapis.com)[172.217.192.128]:443... conectado.
Petición HTTP enviada, esperando respuesta... 200 OK
Longitud: 58633547 (56M) [application/octet-stream]
Grabando a: “minikube-linux-amd64”
minikube-linux-amd64
100%[============================================================================>] 55,92M 2,37MB/s en 21s
2020-08-31 22:05:16 (2,71 MB/s) - “minikube-linux-amd64” guardado [58633547/58633547]
[root@centos8 ~]# chmod +x minikube-linux-amd64
[root@centos8 ~]# mkdir -p /usr/local/bin/
[root@centos8 ~]# mv minikube-linux-amd64 minikube
[root@centos8 ~]# install minikube /usr/local/bin/
[root@centos8 ~]# minikube versión
minikube version: v1.12.3
commit: 2243b4b97c131e3244c5f014faedca0d846599f5-dirty
Primeros pasos con minikube.
# Cambiar de usuario e iniciar servicio.
[dockerusr@centos8 ~]$ minikube start
* minikube v1.12.3 en Centos 8.1.1911
* Automatically selected the docker driver
* Starting control plane node minikube in cluster minikube
* Pulling base image ...
* Downloading Kubernetes v1.18.3 preload ...
> preloaded-images-k8s-v5-v1.18.3-docker-overlay2-amd64.tar.lz4: 510.91 MiB
* Creating docker container (CPUs=2, Memory=2200MB) ...
* Preparando Kubernetes v1.18.3 en Docker 19.03.8...
* Verifying Kubernetes components...
* Enabled addons: default-storageclass, storage-provisioner
* Done! kubectl is now configured to use "minikube"
Al iniciar el servicio por primera vez, Minikube descarga una imagen para ejecutarla en el hypervisor
instalado.
Revisar estado de Minikube.
[dockerusr@centos8 ~]$ minikube status
minikube
type: Control Plane
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured
10. Uso básico Kubernetes| Moisés E. Araya
[9]
Ver las opciones de comando para Minikube.
[dockerusr@centos8 ~]$ minikube
minikube provisions and manages local Kubernetes clusters optimized for development workflows.
Basic Commands:
start Starts a local Kubernetes cluster
status Gets the status of a local Kubernetes cluster
stop Stops a running local Kubernetes cluster
delete Deletes a local Kubernetes cluster
dashboard Access the Kubernetes dashboard running within the minikube cluster
pause pause Kubernetes
unpause unpause Kubernetes
Images Commands:
docker-env Configure environment to use minikube's Docker daemon
podman-env Configure environment to use minikube's Podman service
cache Add, delete, or push a local image into minikube
Configuration and Management Commands:
addons Enable or disable a minikube addon
config Modify persistent configuration values
[. . . Salida omitida . . .]
Mostrar las URLS de los servicios del clúster local.
[dockerusr@centos8 ~]$ minikube service list
|-------------|------------|--------------|-----|
| NAMESPACE | NAME | TARGET PORT | URL |
|-------------|------------|--------------|-----|
| default | kubernetes | No node port |
| kube-system | kube-dns | No node port |
|-------------|------------|--------------|-----|
Mostrar los valores seteados en archivo de configuración de Minikube.
[dockerusr@centos8 ~]$ minikube config view
- driver: virtualbox
- vm-driver: virtualbox
Iniciar sesión en el entorno de Minikube y listar contenedores en ejecución.
[dockerusr@centos8 ~]$ minikube ssh
docker@minikube:~$ hostname
minikube
docker@minikube:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
NAMES
1e997e1f532b 9c3ca9f065bb "/storage-provisioner" 16 minutes ago Up 16 minutes
k8s_storage-provisioner_storage-provisioner_kube-system_7af6ddf0-8827-48bb-a42f-0fbfdf25c05a_0
f8266d95b580 k8s.gcr.io/pause:3.2 "/pause" 16 minutes ago Up 16 minutes
k8s_POD_storage-provisioner_kube-system_7af6ddf0-8827-48bb-a42f-0fbfdf25c05a_0
a2c09c1ec682 67da37a9a360 "/coredns -conf /etc…" 17 minutes ago Up 17 minutes
k8s_coredns_coredns-66bff467f8-7sbpt_kube-system_67e07ae0-4b7f-4399-a6a7-0622e80e9c08_0
5b7295405fcc k8s.gcr.io/pause:3.2 "/pause" 17 minutes ago Up 17 minutes
k8s_POD_coredns-66bff467f8-7sbpt_kube-system_67e07ae0-4b7f-4399-a6a7-0622e80e9c08_0
[. . . Salida omitida . . .]
docker@minikube:~$ exit
logout
11. Uso básico Kubernetes| Moisés E. Araya
[10]
Detener y eliminar Minikube.
[dockerusr@centos8 ~]$ minikube stop
* Stopping node "minikube" ...
* Apagando "minikube" mediante SSH...
* 1 nodes stopped.
[dockerusr@centos8 ~]$ minikube delete
* Eliminando "minikube" en docker...
* Deleting container "minikube" ...
* Eliminando /home/dockerusr/.minikube/machines/minikube...
* Removed all traces of the "minikube" cluster.
[dockerusr@centos8 ~]$ minikube status
* There is no local cluster named "minikube"
- To fix this, run: "minikube start"
Si se quiere eliminar por completo Minikube del sistema, eliminar los archivos presentes en los directorios;
.minikube/, /usr/local/bin/ y .kube/
[dockerusr@centos8 ~]$ ls .minikube/
addons ca.crt ca.pem certs files last_update_check machines proxy-client-ca.crt
cache ca.key cert.pem config key.pem logs profiles proxy-client-ca.key
[dockerusr@centos8 ~]$ ls /usr/local/bin/
docker-compose docker-machine docker-machine-driver-kvm2 kubectl minikube
[dockerusr@centos8 ~]$ ls .kube/
cache config
Instalar kubectl.
Kubectl es una herramienta de línea de comandos para la administración de Kubernetes, con ella se pueden
realizar tareas de creación, actualización, inspección y eliminación de componentes.
Procedimiento.
• Descargar kubectl.
• Modificar permisos.
• Crear directorio.
• Mover a directorio.
• Instalar.
• Verificar versión.
[root@centos8 ~]# curl -LO "https://storage.googleapis.com/kubernetes-release/release/$(curl -s
https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl"
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 41.0M 100 41.0M 0 0 3012k 0 0:00:13 0:00:13 --:--:-- 3492k
[root@centos8 ~]# chmod +x kubectl
[root@centos8 ~]# mv kubectl /usr/local/bin/
[root @centos8 ~]$ kubectl version
Client Version: version.Info{Major:"1", Minor:"19", GitVersion:"v1.19.0",
GitCommit:"e19964183377d0ec2052d1f1fa930c4d7575bd50", GitTreeState:"clean", BuildDate:"2020-08-26T14:30:33Z",
GoVersion:"go1.15", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.3",
GitCommit:"2e7996e3e2712684bc73f0dec0200d64eec7fe40", GitTreeState:"clean", BuildDate:"2020-05-20T12:43:34Z",
GoVersion:"go1.13.9", Compiler:"gc", Platform:"linux/amd64"}
12. Uso básico Kubernetes| Moisés E. Araya
[11]
Se muestran la versión cliente y servidor.
[root@centos8 ~]# kubectl version --client -o json
{
"clientVersion": {
"major": "1",
"minor": "19",
"gitVersion": "v1.19.0",
"gitCommit": "e19964183377d0ec2052d1f1fa930c4d7575bd50",
"gitTreeState": "clean",
"buildDate": "2020-08-26T14:30:33Z",
"goVersion": "go1.15",
"compiler": "gc",
"platform": "linux/amd64"
}
}
Alternativa para ver la versión de kubectl en formato json.
Primeros comandos con kubectl.
Ver la información del clúster y su estado.
[dockerusr@centos8 ~]$ kubectl cluster-info
Kubernetes master is running at https://192.168.99.100:8443
KubeDNS is running at https://192.168.99.100:8443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
Mostrar la configuración actual de kubectl.
[dockerusr@centos8 ~]$ kubectl config view
apiVersion: v1
clusters:
- cluster:
certificate-authority: /home/dockerusr/.minikube/ca.crt
server: https://192.168.99.100:8443
name: minikube
contexts:
- context:
cluster: minikube
user: minikube
name: minikube
current-context: minikube
kind: Config
preferences: {}
users:
- name: minikube
user:
client-certificate: /home/dockerusr/.minikube/profiles/minikube/client.crt
client-key: /home/dockerusr/.minikube/profiles/minikube/client.key
Mostrar los nodos disponibles.
[dockerusr@centos8 ~]$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
minikube Ready master 16m v1.18.3
[dockerusr@centos8 ~]$ kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION
CONTAINER-RUNTIME
minikube Ready master 33d v1.18.3 192.168.99.100 <none> Buildroot 2019.02.11 4.19.114
docker://19.3.12
El resultado arroja uno solo, también se muestra una alternativa del comando extendido, el nodo está listo
para desplegar aplicaciones.
13. Uso básico Kubernetes| Moisés E. Araya
[12]
Desplegar primera aplicación en Kubernetes utilizando kubectl.
Desplegar aplicación NGINX utilizando el comando kubectl create deployment, se necesita el nombre del
despliegue y la ubicación de la imagen, en este caso se utiliza el repositorio de Docker Hub.
[dockerusr@centos8 ~]$ kubectl create deployment nginx-lab --image=nginx:alpine
deployment.apps/nginx-lab created
Listar los despliegues.
[dockerusr@centos8 ~]$ kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-lab 1/1 1 1 13s
Como resultado tenemos solo 1 despliegue ejecutándose en una instancia (única).
Listar los pods existentes y su versión ampliada del comando.
[dockerusr@centos8 ~]$ kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-lab-5dc48c9776-v2mjk 1/1 Running 0 4m39s
[dockerusr@centos8 ~]$ kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE
READINESS GATES
nginx-lab-5dc48c9776-v2mjk 1/1 Running 0 5m7s 172.17.0.5 minikube <none> <none>
Como resultado tenemos solo 1 pod ejecutándose.
14. Uso básico Kubernetes| Moisés E. Araya
[13]
Mostrar detalles del pod.
[dockerusr@centos8 ~]$ kubectl describe pod nginx-lab
Name: nginx-lab-5dc48c9776-v2mjk
Namespace: default
Priority: 0
Node: minikube/192.168.99.100
Start Time: Tue, 06 Oct 2020 16:15:35 -0300
Labels: app=nginx-lab
pod-template-hash=5dc48c9776
Annotations: <none>
Status: Running
IP: 172.17.0.5
IPs:
IP: 172.17.0.5
Controlled By: ReplicaSet/nginx-lab-5dc48c9776
Containers:
nginx:
Container ID: docker://61c0355ae0254beb3cbfd6ff034a6740743a9970e1d4dea656c5b63107fb356f
Image: nginx:alpine
Image ID: docker-
pullable://nginx@sha256:5fcbe9a6b09b6525651d1e5d5a2df373eec1a13c75f0eaa724a369f43ce589f4
Port: <none>
Host Port: <none>
State: Running
Started: Tue, 06 Oct 2020 16:15:36 -0300
Ready: True
Restart Count: 0
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from default-token-hcjlc (ro)
Conditions:
Type Status
Initialized True
Ready True
ContainersReady True
PodScheduled True
Volumes:
default-token-hcjlc:
Type: Secret (a volume populated by a Secret)
SecretName: default-token-hcjlc
Optional: false
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 5m38s default-scheduler Successfully assigned default/nginx-lab-5dc48c9776-v2mjk to
minikube
Normal Pulled 5m37s kubelet, minikube Container image "nginx:alpine" already present on machine
Normal Created 5m37s kubelet, minikube Created container nginx
Normal Started 5m37s kubelet, minikube Started container nginx
La salida del comando describe muestra detalles como; direcciones IP, puertos utilizados y una lista de
eventos relacionados con el ciclo de vida del pod.
Ver logs del contenedor.
[dockerusr@centos8 ~]$ kubectl logs nginx-lab-5dc48c9776-v2mjk
/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: Getting the checksum of /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: 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: Configuration complete; ready for start up
172.17.0.1 - - [06/Oct/2020:19:25:42 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.61.1" "127.0.0.1, 192.168.99.1"
15. Uso básico Kubernetes| Moisés E. Araya
[14]
Ejecutar un comando en el contenedor.
[dockerusr@centos8 ~]$ kubectl exec nginx-lab-5dc48c9776-v2mjk env
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] --
[COMMAND] instead.
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=nginx-lab-5dc48c9776-v2mjk
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
KUBERNETES_SERVICE_HOST=10.96.0.1
KUBERNETES_SERVICE_PORT=443
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT=tcp://10.96.0.1:443
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
NGINX_VERSION=1.19.3
NJS_VERSION=0.4.4
PKG_RELEASE=1
HOME=/root
Se muestran las variables de entorno existentes en el pod.
Utilizar un servicio para exponer la aplicación creada en el puerto 80.
[dockerusr@centos8 ~]$ kubectl expose deployment nginx-lab --type=NodePort --port=80
service/nginx-lab exposed
Listar los servicios.
[dockerusr@centos8 ~]$ kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 163m
nginx-lab NodePort 10.110.0.219 <none> 80:30974/TCP 5s
[dockerusr@centos8 ~]$ kubectl get services -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 166m <none>
nginx-lab NodePort 10.110.0.219 <none> 80:30974/TCP 3m26s app=nginx-lab
Se muestra el servicio nginx-lab recién creado, también se muestra una variante extendida del comando.
16. Uso básico Kubernetes| Moisés E. Araya
[15]
Mostrar información detallada del servicio.
[dockerusr@centos8 ~]$ kubectl describe service nginx-lab
Name: nginx-lab
Namespace: default
Labels: app=nginx-lab
Annotations: <none>
Selector: app=nginx-lab
Type: NodePort
IP: 10.110.0.219
Port: <unset> 80/TCP
TargetPort: 80/TCP
NodePort: <unset> 30974/TCP
Endpoints: 172.17.0.5:80
Session Affinity: None
External Traffic Policy: Cluster
Events: <none>
Obtener dirección IP interna de Minikube para realizar prueba de servicio.
[dockerusr@centos8 ~]$ minikube service nginx-lab --url
http://192.168.99.100:30974
Prueba de conexión al servicio web de NGINX.
[dockerusr@centos8 ~]$ curl http://192.168.99.100:30974
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
Método alternativo para realizar la misma prueba:
curl $(minikube ip):30974
17. Uso básico Kubernetes| Moisés E. Araya
[16]
Uso de archivos en formato YAML.
Los objetos de Kubernetes se pueden crear de dos formas: directamente desde la línea de comandos (como se
ha visto anteriormente) o por medio de archivos de manifiesto de tipo Yaml. A este tipo de configuración se le
conoce con el nombre de declarativa y el de comandos como imperativo.
ReplicaSet.
Ahora ¿qué sucede si un pod falla?, en un clúster se necesita ejecutar varias instancias de un solo pod, esto se
logra con un controlador llamado replica set, este controlador permite escalar y mantener el estado del
clúster deseado, por ejemplo, si un pod falla automáticamente lanza otro, por lo tanto, este RS (replica set)
entrega capacidad de alta disponibilidad al clúster.
Archivo replicaset de ejemplo.
Crear y guardar el siguiente archivo como replicaset.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: nginx-lab-rs
labels:
tier: frontend
spec:
selector:
matchLabels:
app: nginx-lab
tier: frontend
replicas: 3
template:
metadata:
name: nginx-lab
labels:
app: nginx-lab
tier: frontend
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
El selector indica que pod el RS debe estar monitoreando/administrando y el template le indica al RS que tipo
de pod debe ser lanzando cuando hay una falla.
Crear un replicaset por medio de un archivo yaml
[dockerusr@centos8 ~]$ kubectl apply -f replicaset.yml
replicaset.apps/nginx-lab created
# Para aplicar se puede utilizar el comando apply o el comando create, el primero crea y/o aplica las diferencias (si las
hubiera) y el segundo borra y crea.
Listar replicasets existentes.
[dockerusr@centos8 ~]$ kubectl get replicaset
NAME DESIRED CURRENT READY AGE
nginx-lab 3 3 2 10s
nginx-lab-5dc48c9776 1 1 1 168m
[dockerusr@centos8 ~]$ kubectl get replicaset -o wide
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
nginx-lab 3 3 3 9m37s nginx nginx app=nginx-
lab,tier=frontend
nginx-lab-5dc48c9776 1 1 1 177m nginx nginx:alpine app=nginx-lab,pod-
template-
hash=5dc48c9776
18. Uso básico Kubernetes| Moisés E. Araya
[17]
Listar pods
[dockerusr@centos8 ~]$ kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-lab-5dc48c9776-v2mjk 1/1 Running 0 168m
nginx-lab-7j5v8 1/1 Running 0 33s
nginx-lab-qllrt 1/1 Running 0 33s
nginx-lab-r57vd 1/1 Running 0 33s
Borrar un pod para validar funcionamiento del RS.
[dockerusr@centos8 ~]$ kubectl delete pod nginx-lab-7j5v8
pod "nginx-lab-7j5v8" deleted
[dockerusr@centos8 ~]$ kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-lab-5dc48c9776-2nx8c 1/1 Running 0 10m
nginx-lab-ftfjw 0/1 ContainerCreating 0 5s
nginx-lab-qllrt 1/1 Running 0 11m
nginx-lab-r57vd 1/1 Running 0 11m
[dockerusr@centos8 ~]$ kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-lab-5dc48c9776-2nx8c 1/1 Running 0 10m
nginx-lab-ftfjw 1/1 Running 0 9s
nginx-lab-qllrt 1/1 Running 0 11m
nginx-lab-r57vd 1/1 Running 0 11m
Al borrar un pod, automáticamente se crea otro para reemplazar y mantener la cantidad deseada
Escalar un pod.
[dockerusr@centos8 ~]$ kubectl scale replicaset nginx-lab --replicas=4
replicaset.apps/nginx-lab scaled
[dockerusr@centos8 ~]$ kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-lab-5dc48c9776-2nx8c 1/1 Running 0 13m
nginx-lab-ftfjw 1/1 Running 0 3m20s
nginx-lab-kdt6t 0/1 ContainerCreating 0 3s
nginx-lab-qllrt 1/1 Running 0 14m
nginx-lab-r57vd 1/1 Running 0 14m
[dockerusr@centos8 ~]$ kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-lab-5dc48c9776-2nx8c 1/1 Running 0 13m
nginx-lab-ftfjw 1/1 Running 0 3m30s
nginx-lab-kdt6t 1/1 Running 0 13s
nginx-lab-qllrt 1/1 Running 0 14m
nginx-lab-r57vd 1/1 Running 0 14m
Algo similar sucede cuando se escala un pod, se crea el numero indicado en la cantidad de replicas, en este
caso habían 3 por lo que se crea solo uno.
Hacer un scale-down de los pods.
[dockerusr@centos8 ~]$ kubectl scale replicaset nginx-lab --replicas=2
replicaset.apps/nginx-lab scaled
[dockerusr@centos8 ~]$ kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-lab-5dc48c9776-2nx8c 1/1 Running 0 16m
nginx-lab-ftfjw 0/1 Terminating 0 6m19s
nginx-lab-qllrt 1/1 Running 0 17m
nginx-lab-r57vd 1/1 Running 0 17m
19. Uso básico Kubernetes| Moisés E. Araya
[18]
[dockerusr@centos8 ~]$ kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-lab-5dc48c9776-2nx8c 1/1 Running 0 16m
nginx-lab-qllrt 1/1 Running 0 17m
nginx-lab-r57vd 1/1 Running 0 17m
En este caso se disminuye la cantidad de pods de 4 a 2.
Deployment.
¿Qué sucede ahora si tenemos esa misma aplicación, pero aparte de instalar la necesitamos actualizar (Rolling
update) y si falla que ejecute una restauración? (rollback), esto se puede lograr con el uso del objeto llamado
Deployment.
Para esto se usa otro archivo yml que contiene la definición completa del servicio, el tipo (kind) cambia a
Deployment y si bien es parecido al contenido del objeto ReplicaSet, este agrega las características de
Rolling update y Rollback.
Archivo deployment de ejemplo.
Crear y guardar el siguiente archivo como deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-lab-deployment
labels:
tier: frontend
spec:
selector:
matchLabels:
app: nginx-lab
tier: frontend
replicas: 3
template:
metadata:
name: nginx-lab
labels:
app: nginx-lab
tier: frontend
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
Descripción rápida del archivo:
• apiVersion: Es la versión API del recurso que estamos utilizando, no todos los recursos usan las
mismas APIs.
• kind: Tipo de recurso, en este caso un Deployment.
• metadata: Nombre al recurso, etiquetas (útiles para clasificar el servicio o aplicación), también se
pueden agregar otras para agrupar o clasificar.
• spec: Contiene la especificación del despliegue a realizar.
o Selector: Agrupa recursos inferiores dentro del despliegue
o Replicas: Cantidad de contenedores a lanzar.
o Plantilla: Contiene medatatos, nombre, etiquetas y nombre de aplicación.
o Especificación del contenedor
▪ Nombre, imagen y puerto TCP.
20. Uso básico Kubernetes| Moisés E. Araya
[19]
Crear un deployment por medio de un archivo yaml
[dockerusr@centos8 ~]$ kubectl apply -f deployment.yml
deployment.apps/nginx-lab-deployment created
Al ejecutar el archivo, se crea un despliegue, los pods y un replicaset.
Listar despliegues, pods y replicaset.
[dockerusr@centos8 ~]$ kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-lab-deployment 1/3 3 1 8s
[dockerusr@centos8 ~]$ kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-lab-deployment-549c9f75fb-494wl 1/1 Running 0 46s
nginx-lab-deployment-549c9f75fb-vnf5x 1/1 Running 0 46s
nginx-lab-deployment-549c9f75fb-xzml6 1/1 Running 0 46s
[dockerusr@centos8 ~]$ kubectl get replicaset
NAME DESIRED CURRENT READY AGE
nginx-lab-deployment-549c9f75fb 3 3 3 49s
Actualizar contenedor del deployment (despliegue).
Para actualizar el deployment, utilizar el comando kubectl set image, le indicamos al despliegue que
actualice la versión de nginx a la 1.9.1 por medio del siguiente comando:
kubectl set image deployment/nginx-lab-deployment nginx=nginx:1.9.1
[dockerusr@centos8 ~]$ kubectl set image deployment/nginx-lab-deployment nginx=nginx:1.9.1
deployment.apps/nginx-lab-deployment image updated
Listar las versiones disponibles.
Usar la opción rollout para ver las versiones disponibles, se muestran dos, una es el resultado del primer
despliegue y el segundo es debido a la actualización de nginx.
[dockerusr@centos8 ~]$ kubectl rollout history deployment/nginx-lab-deployment
deployment.apps/nginx-lab-deployment
REVISION CHANGE-CAUSE
1 <none>
2 <none>
Mostrar la versión de nginx aplicada.
Utilizar la opción describe para obtener la versión y otra información importante como el número de revisión.
[dockerusr@centos8 ~]$ kubectl describe deployment nginx-lab-deployment
Name: nginx-lab-deployment
Namespace: default
CreationTimestamp: Tue, 06 Oct 2020 19:48:30 -0300
Labels: tier=frontend
Annotations: deployment.kubernetes.io/revision: 2
Selector: app=nginx-lab,tier=frontend
Replicas: 3 desired | 3 updated | 3 total | 3 available | 0 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
Pod Template:
Labels: app=nginx-lab
tier=frontend
Containers:
nginx:
Image: nginx:1.9.1
Port: 80/TCP
Host Port: 0/TCP
[. . . Salida omitida . . .]
21. Uso básico Kubernetes| Moisés E. Araya
[20]
[dockerusr@centos8 ~]$ kubectl describe deployment nginx-lab-deployment |grep "Image*"
Image: nginx:1.9.1
#Tambien podemos iniciar una sesión interactiva en uno de los pods del deployment y ejecutar el comando
nginx -v
Forzar error de un despliegue.
[dockerusr@centos8 ~]$ kubectl set image deployment/nginx-lab-deployment nginx=echoserver:1.10
deployment.apps/nginx-lab-deployment image updated
[dockerusr@centos8 ~]$ kubectl rollout status deployment/nginx-lab-deployment
Waiting for deployment "nginx-lab-deployment" rollout to finish: 1 out of 3 new replicas have been updated...
[dockerusr@centos8 ~]$ kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-lab-deployment-579458cf85-gjg2b 1/1 Running 0 36m
nginx-lab-deployment-579458cf85-jk7bn 1/1 Running 0 36m
nginx-lab-deployment-579458cf85-qcxjs 1/1 Running 0 36m
nginx-lab-deployment-7f87694c4-cdmfz 0/1 ImagePullBackOff 0 56s
En comando inicial se indica un contenedor distinto para que entregue un error, se revisa el estado de este y
no termina por lo que se induce que tenemos un problema, se revisa el estado del despliegue y se confirma
que tenemos un pod con error.
Ejecutar un rollback (vuelta atrás).
[dockerusr@centos8 ~]$ kubectl rollout undo deployment/nginx-lab-deployment
deployment.apps/nginx-lab-deployment rolled back
[dockerusr@centos8 ~]$ kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-lab-deployment-579458cf85-gjg2b 1/1 Running 0 37m
nginx-lab-deployment-579458cf85-jk7bn 1/1 Running 0 37m
nginx-lab-deployment-579458cf85-qcxjs 1/1 Running 0 37m
Para volver la aplicación a la última versión estable, se ejecuta el comando rollout undo, esto hace que los
pods con error sean eliminados y recreados.
Eliminar las configuraciones.
Para finalizar, se deben eliminar todos los objetos y recursos creados para dejar el ambiente limpio.
Eliminar pods, deployments, replicasets y verificar que no quede nada.
[dockerusr@centos8 ~]$ kubectl delete --all pods --namespace=default
pod "nginx-lab-5dc48c9776-jl4ws" deleted
[dockerusr@centos8 ~]$ kubectl delete --all deployments --namespace=default
deployment.apps "nginx-lab" deleted
[dockerusr@centos8 ~]$ kubectl delete --all replicasets --namespace=default
replicaset.apps "nginx-lab-5dc48c9776" deleted
[dockerusr@centos8 ~]$ kubectl get all
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 4h43m
Archivos de ejemplo.
Los archivos ReplicaSet.yaml y Deployment.yaml están disponibles en el siguiente repositorio de GitHub:
https://github.com/EliasGH/kubernetesexamples
22. Uso básico Kubernetes| Moisés E. Araya
[21]
Instalar Dashboard.
Kubernetes dispone de una interfaz web que, si bien no posee todas las características, nos sirve para
monitorear algún clúster de prueba o similar.
Procedimiento.
Aplicar la definición yaml que contiene la configuración recomendada del dashboard.
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.4/aio/deploy/recommended.yaml
[dockerusr@centos8 ~]$ kubectl apply -f
https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.4/aio/deploy/recommended.yaml
namespace/kubernetes-dashboard created
serviceaccount/kubernetes-dashboard created
service/kubernetes-dashboard created
secret/kubernetes-dashboard-certs created
secret/kubernetes-dashboard-csrf created
secret/kubernetes-dashboard-key-holder created
configmap/kubernetes-dashboard-settings created
role.rbac.authorization.k8s.io/kubernetes-dashboard created
clusterrole.rbac.authorization.k8s.io/kubernetes-dashboard created
rolebinding.rbac.authorization.k8s.io/kubernetes-dashboard created
clusterrolebinding.rbac.authorization.k8s.io/kubernetes-dashboard created
deployment.apps/kubernetes-dashboard created
service/dashboard-metrics-scraper created
deployment.apps/dashboard-metrics-scraper created
El dashboard se crea correctamente.
Agregar cuenta de servicio para acceder.
Crear archivo del tipo yaml con dos contenidos; ServiceAccount y ClusterRoleBinding.
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kubernetes-dashboard
23. Uso básico Kubernetes| Moisés E. Araya
[22]
Aplicar archivo.
[dockerusr@centos8 ~]$ kubectl apply -f userdashboard.yaml
serviceaccount/admin-user created
clusterrolebinding.rbac.authorization.k8s.io/admin-user created
Se crea y se agregan permisos a esa cuenta de servicio.
Obtener token.
Para hacer el login se necesita un token de autenticación, copiar y pegar el siguiente comando para obtener
el token:
[dockerusr@centos8 ~]$ kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get
secret | grep admin-user | awk '{print $1}' )
Name: admin-user-token-6zc29
Namespace: kubernetes-dashboard
Labels: <none>
Annotations: kubernetes.io/service-account.name: admin-user
kubernetes.io/service-account.uid: c44c2bf2-4500-4c1a-afe5-2164162b4510
Type: kubernetes.io/service-account-token
Data
====
ca.crt: 1066 bytes
namespace: 20 bytes
token:
eyJhbGciOiJSUzI1NiIsImtpZCI6ImNuNlRMYnQzRk16aEdSUzRsLTNmM3FMMjBheXpPNWtRRERxdWllSTM5WGsifQ.eyJpc3MiOiJrdWJlcm5ldG
VzL3NlcnZpY2VhY2NvdW50Iiwia
3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZW
FjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c
2VyLXRva2VuLTZ6YzI5Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdW
Jlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3Nlc
nZpY2UtYWNjb3VudC51aWQiOiJjNDRjMmJmMi00NTAwLTRjMWEtYWZlNS0yMTY0MTYyYjQ1MTAiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bn
Q6a3ViZXJuZXRlcy1kYXNoYm9hcmQ6YWRtaW4td XNlciJ9.RU5T1ak9EIzjYYl5NXxj-
zVZkby7CsiD074gvRVr_RXrczKmylts8XJOiHLKG1PWiu1EYgw23HrtBTbDOx0s0frZ7KME3jiHhCLbVbkgUDLBcTsskSwLxeZZ7VwImEkjAr-
rucJLJQ9Djp02 uh2UtMuPf6F6tV3XD4jR_kr17pvLp7weOKSXdZv7JLqOgCd_pdT7CHWs7iz941IU0ApEfEynert4FIDj7xOdp9WJ-
O9eaOXNAGFewYE0Db8bNrc3rdw0XEEQhbA8TiYO5NKk01BnWpBUoYyTX7Sa5CCa Lyi_kM47NSiAlULvB5qliF4l4YGvAC5XuQAIqUb95w9pFg
Conectarse al clúster.
Abre una conexión privada.
dockerusr@centos8 ~]$ kubectl proxy
Starting to serve on 127.0.0.1:8001
Acceder a URL, pegar el token y acceder.
http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/
Se pueden todos los componentes de todos los namespaces existentes; deployments, nodos, pods, replicaset,
etc.
24. Uso básico Kubernetes| Moisés E. Araya
[23]
Vista general.
Vista Pods.
Vista Replica Sets.
25. Uso básico Kubernetes| Moisés E. Araya
[24]
Crear objetos directamente desde la consola.
Existen 3 formas de creación; ingresar archivo yaml/json con las definiciones de Kubernetes, seleccionar
archivo remoto y crear directamente desde un formulario.
Pod creado.
26. Uso básico Kubernetes| Moisés E. Araya
[25]
Lista de comandos utilizados.
minikube version Verificar instalación
minikube start Iniciar el clúster
minikube status Verificar estado
minikube service list Muestra las URLS de servicio del clúster
minikube config view Mostrar valores seteados en configuración
minikube ssh Iniciar sesión en entorno minikube
minikube stop Detener servicios
minikube delete Eliminar servicio
kubectl version Verificar instalación
kubectl version --client -0 json Mostrar versión cliente en formato JSON
kubectl config view Muestra la configuración actual
kubectl cluster-info Ver detalles del clúster
kubectl get nodes Ver los nodos del clúster
kubectl get nodes -o wide Ver nodos en modo extendido
kubectl get all Mostrar todas las configuraciones existentes
kubectl create deployment NAME IMAGE_PATH Crear despliegue
kubectl get deployments Listar los despliegues
kubectl get pods Listar los pods
kubectl get pods -o wide Listar pods en modo extendido
kubectl describe pod POD_NAME Obtener información detallada de un pod
kubectl proxy Iniciar servidor proxy
kubectl logs POD_NAME Obtener los registros de logs de un pod
kubectl exec POD_NAME comando Ejecutar un comando en un pod
kubectl expose deployment NAME_DEPLOYMENT --
type=NodePort --port=PORT_NUMBER Exponer un despliegue
kubectl get services Listar los servicios
kubectl get services -o wide Listar los servicios en modo extendido
kubectl describe service SERVICE_NAME Obtener detalle de un servicio
kubectl apply -f YAML_FILE Aplicar una configuración utilizando un archivo yaml
kubectl get replicaset Listar los replicaset
kubectl get replicaset -o wide Listar los replicaset en modo extendido
kubectl delete pod POD_NAME Eliminar un pod
kubectl scale replicaset REPLICASET_NAME --
replicas=NUMBER Escalar un pod
kubectl set image deployment/DEPLOYMENT_NAME
IMAGEN=VERSIONDESEADA Actualizar la imagen de un contenedor de un despliegue
kubectl rollout history deployment/DEPLOYMENT_NAME Mostrar el historial de versiones de un despliegue
kubectl rollout status deployment/DEPLOYMENT_NAME Mostrar el estado de un despliegue
kubectl rollout undo deployment/DEPLOYMENT_NAME Realizar un rollback de un despliegue
kubectl delete --all pods --namespace=default
Eliminar todos los pods creados en el espacio de nombres por
defecto
kubectl delete --all deployments --namespace=default
Eliminar todos los despliegues creados en el espacio de nombres
por defecto
kubectl delete --all replicasets --namespace=default
Eliminar todos los replicasets creados en el espacio de nombres
por defecto
kubectl get all Listar los objetos creados en kubernetes
27. Uso básico Kubernetes| Moisés E. Araya
[26]
Alternativas a Kubernetes.
Docker Swarm.
• Herramienta de Docker para la administración de contenedores.
• https://docs.docker.com/engine/swarm/
Apache Mesos.
• Es un administrador de clústeres de código abierto que puede trabajar con
kubernetes.
• http://mesos.apache.org/
OpenShift.
• Plataforma PaaS de Red Hat, es de código cerrado
• https://www.openshift.com/
Algunas de las implementaciones de Kubernetes en la nube.
Azure Kubernetes Services (AKS)
• https://azure.microsoft.com/es-es/services/kubernetes-service/
Elastic Container Service for Kubernetes (EKS)
• https://aws.amazon.com/es/eks/
Google Kubernetes Engine (GKE)
• https://cloud.google.com/kubernetes-engine?hl=es
Otras son: OKE (Oracle Engine for Kubernetes) y DOKS (Digital Ocean for Kubernetes).
28. Uso básico Kubernetes| Moisés E. Araya
[27]
Anexo A – Google Kubernetes Engine.
Parte 1- Crear Clúster utilizando la consola web de GCP.
Google Kubernetes Engine (GKE) es el servicio de Google Cloud para el sistema Kubernetes, el acceso a su
consola está en: https://console.cloud.google.com
Prerrequisitos.
• Contar con una cuenta activa de Google Cloud Platform.
Procedimiento.
En la consola GCP, clic en menú Kubernetes Engine > Clusters
Clic crear clúster.
Ver e ingresar información básica del clúster.
• Nombre.
• Zona.
• Versión de Kubernetes.
• No modificar los otros valores (dejar todo por defecto).
29. Uso básico Kubernetes| Moisés E. Araya
[28]
En sección detalle de pool de Nodos, ingresar
información:
• Nombre pool.
• Versión de nodo.
• Tamaño del clúster (cantidad de nodos).
• No modificar los otros valores.
Opcionalmente podemos ver los valores que
aparecen en sección Nodos:
• Tipo de imagen: cos que es una imagen Linux
optimizada para contenedores de GCP.
• Configuración de maquina:
o Serie: E2
o Tipo de maquina: 2vCPU y 4GB RAM.
• Disco estándar: 100 GB.
Clic en crear clúster.
Comienza el aprovisionamiento del clúster y
esperamos unos minutos hasta que quede listo.
30. Uso básico Kubernetes| Moisés E. Araya
[29]
Clúster creado.
Para ver los detalles del clúster, clic en nombre.
En pestaña nodos, se muestran los 3 nodos creados.
31. Uso básico Kubernetes| Moisés E. Araya
[30]
Conectarse al clúster vía kubectl.
En pestaña principal, hacer clic en Connect, se despliega una ventana con el comando para ejecutar en la
consola Google Cloud Shell, el comando se debe copiar y luego pegar en la consola para acceder y poder
ejecutar comandos kubectl.
Luego de iniciar la consola de comandos, podemos listar los nodos:
student_01_c0ca219a11da@cloudshell:~)$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
gke-labcluster-lab-pool-676a36ee-9sfk Ready <none> 6m35s v1.16.13-gke.401
gke-labcluster-lab-pool-676a36ee-tb32 Ready <none> 6m35s v1.16.13-gke.401
gke-labcluster-lab-pool-676a36ee-znz8 Ready <none> 6m33s v1.16.13-gke.401
Diagrama referencial del clúster creado en GCP.
32. Uso básico Kubernetes| Moisés E. Araya
[31]
Parte 2 - Desplegar una aplicación NGINX en el clúster.
Para desplegar una aplicación, debemos hacer clic en la pestaña Workloads del menú Kubernetes Engine
y luego hacer clic en Deploy.
En pestaña siguiente mantener los valores presentados, clic siguiente.
Mantener los valores presentados y modificar nombre de aplicación (opcional), finalizar haciendo clic
en botón Deploy.
33. Uso básico Kubernetes| Moisés E. Araya
[32]
Creación en progreso.
Aplicación lista.
Detalles de aplicación.
Revisar estado de despliegue con kubectl.
student_01_c0ca219a11da@cloudshell:~ kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-app 3/3 3 3 4m3s
34. Uso básico Kubernetes| Moisés E. Araya
[33]
Parte 3 – Exponer la aplicación.
En apartado Workloads, clic sobre botón EXPOSE.
Ver resultados en menú Services & Ingress.
Servicio nginx-1-service listo.
Revisar estado del servicio con kubectl.
student_01_c0ca219a11da@cloudshell:~ $ kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx-app-service LoadBalancer 10.36.6.164 34.123.219.50 80:32653/TCP 6m52s
Acceder a aplicación vía web.
Copiar y pegar en un navegador el endpoint mostrado en imagen o en salida comando kubectl.
35. Uso básico Kubernetes| Moisés E. Araya
[34]
Diagrama referencial de la configuración realizada.
Parte 4 - Borrar el Clúster.
Para finalizar, se deben borrar los recursos creados.
Clic en Clústers, seleccionar y presionar el botón DELETE.
Confirmar borrado del clúster.
Clúster eliminado.
36. Uso básico Kubernetes| Moisés E. Araya
[35]
Anexo B - Kubernetes Windows 10.
Una alternativa a Minikube para entornos de prueba es instalar habilitar Kubernetes dentro de Docker para
Windows.
Requisitos:
• Windows 10 Profesional o Enterprise.
• Docker Desktop 2.0 o superior.
• Hyper-V habilitado.
Kubernetes por defecto esta desactivado, la instalación se realiza desde la interfaz de Docker activando la
casilla “Enable Kubernetes”
Nos pide confirmar para instalar.
Esperar unos minutos para que acabe la instalación
Kubernetes activo.
37. Uso básico Kubernetes| Moisés E. Araya
[36]
Comandos Kubernetes.
Kubernetes cuenta con el utilitario kubectl que sirve para iniciar, controlar, inspeccionar, gestionar,
desplegar y escalar aplicaciones en el clúster.
Algunos comandos son:
• kubectl versión.
• kubectl cluster-info.
• kubectl get componentstatuses.
También se puede obtener el listado completo de comandos disponibles ejecutando kubectl –help o -h
Como guía o ayuda para la parte de Docker pueden seguir el siguiente manual:
• https://es2.slideshare.net/mike741/instalar-docker-windows
38. Uso básico Kubernetes| Moisés E. Araya
[37]
Anexo C - Instalar VirtualBox en CentOs V8.
Procedimiento.
• Actualizar sistema y reiniciar.
• Descargar e instalar repositorio de Oracle VirtualBox.
[root@centos8 ~]# yum update -y --skip-broken --nobest
Última comprobación de caducidad de metadatos hecha hace 0:11:18, el mar 01 sep 2020 19:38:45 -04.
Dependencias resueltas.
.
.
.
¡Listo!
[root@centos8 ~]# init 6
[root@centos8 ~]# wget https://www.virtualbox.org/download/oracle_vbox.asc
--2020-09-01 19:37:47-- https://www.virtualbox.org/download/oracle_vbox.asc
Resolviendo www.virtualbox.org (www.virtualbox.org)... 137.254.60.32
Conectando con www.virtualbox.org (www.virtualbox.org)[137.254.60.32]:443... conectado.
Petición HTTP enviada, esperando respuesta... 200 OK
Longitud: 1734 (1,7K) [text/plain]
Grabando a: “oracle_vbox.asc”
oracle_vbox.asc
100%[==========================================================================>] 1,69K 10,1KB/s en 0,2s
2020-09-01 19:37:49 (10,1 KB/s) - “oracle_vbox.asc” guardado [1734/1734]
[root@centos8 ~]# rpm --import oracle_vbox.asc
[root@centos8 ~]# wget http://download.virtualbox.org/virtualbox/rpm/el/virtualbox.repo -O
/etc/yum.repos.d/virtualbox.repo
--2020-09-01 19:38:10-- http://download.virtualbox.org/virtualbox/rpm/el/virtualbox.repo
Resolviendo download.virtualbox.org (download.virtualbox.org)... 23.40.56.108
Conectando con download.virtualbox.org (download.virtualbox.org)[23.40.56.108]:80... conectado.
Petición HTTP enviada, esperando respuesta... 200 OK
Longitud: 259 [text/plain]
Grabando a: “/etc/yum.repos.d/virtualbox.repo”
/etc/yum.repos.d/virtualbox.repo
100%[==========================================================================>] 259 --.-KB/s en 0,005s
2020-09-01 19:38:11 (46,7 KB/s) - “/etc/yum.repos.d/virtualbox.repo” guardado [259/259]
[root@centos8 ~]# cat <<EOF >> /etc/yum.repos.d/virtualbox.repo
> [virtualbox]
> name=Oracle Linux / RHEL / CentOS - 8 x86_64 - VirtualBox
> baseurl=http://download.virtualbox.org/virtualbox/rpm/rhel/8/x86_64/
> enabled=1
> gpgcheck=1
> repo_gpgcheck=1
> gpgkey=https://www.virtualbox.org/download/oracle_vbox.asc
> EOF
Instalar VirtualBox desde el repositorio.
[root@centos8 ~]# yum install -y VirtualBox-6.0
Oracle Linux / RHEL / CentOS - 8 x86_64 - VirtualBox
91 B/s | 181 B 00:01
Oracle Linux / RHEL / CentOS - 8 x86_64 - VirtualBox
1.5 kB/s | 1.7 kB 00:01
Importando llave GPG 0x98AB5139:
ID usuario: "Oracle Corporation (VirtualBox archive signing key) <info@virtualbox.org>"
Huella : 7B0F AB3A 13B9 0743 5925 D9C9 5442 2A4B 98AB 5139
Desde : https://www.virtualbox.org/download/oracle_vbox.asc
Oracle Linux / RHEL / CentOS - 8 x86_64 - VirtualBox
64 kB/s | 130 kB 00:02
Dependencias resueltas.
39. Uso básico Kubernetes| Moisés E. Araya
[38]
Validar versión.
[root@centos8 ~]# VBoxManage --version
6.0.24r139119
Habilitar e iniciar servicio.
[root@centos8 ~]# systemctl enable vboxdrv
[root@centos8 ~]# systemctl start vboxdrv
[root@centos8 ~]# systemctl status vboxdrv
● vboxdrv.service - VirtualBox Linux kernel module
Loaded: loaded (/usr/lib/virtualbox/vboxdrv.sh; enabled; vendor preset: disabled)
Active: active (exited) since Fri 2020-09-25 00:06:52 -03; 1 weeks 5 days ago
Process: 964 ExecStart=/usr/lib/virtualbox/vboxdrv.sh start (code=exited, status=0/SUCCESS)
Tasks: 0 (limit: 32027)
Memory: 0B
CGroup: /system.slice/vboxdrv.service
sep 25 00:06:49 centos8.lab systemd[1]: Starting VirtualBox Linux kernel module...
sep 25 00:06:49 centos8.lab vboxdrv.sh[964]: vboxdrv.sh: Starting VirtualBox services.
sep 25 00:06:52 centos8.lab systemd[1]: Started VirtualBox Linux kernel module.
Mostrar VMS en ejecución.
[dockerusr@centos8 ~]$ vboxmanage list vms
"minikube" {04dcc81f-5787-4994-b8d0-7a6bff1d225d}
Mostrar información de la máquina virtual en ejecución.
[dockerusr@centos8 ~]$ vboxmanage showvminfo "minikube"
Name: minikube
Groups: /
Guest OS: Linux 2.6 / 3.x / 4.x (64-bit)
UUID: 04dcc81f-5787-4994-b8d0-7a6bff1d225d
Config file: /home/dockerusr/.minikube/machines/minikube/minikube/minikube.vbox
Snapshot folder: /home/dockerusr/.minikube/machines/minikube/minikube/Snapshots
Log folder: /home/dockerusr/.minikube/machines/minikube/minikube/Logs
Hardware UUID: 04dcc81f-5787-4994-b8d0-7a6bff1d225d
Memory size 2200MB
Page Fusion: disabled
VRAM size: 8MB
CPU exec cap: 100%
HPET: enabled
CPUProfile: host
Chipset: piix3
Firmware: BIOS
Number of CPUs: 2
[. . . Salida omitida . . .]
40. Uso básico Kubernetes| Moisés E. Araya
[39]
Conclusión.
En este documento se han presentado los siguientes temas:
• Presentación de Kubernetes.
• Componentes principales.
• Objetos relevantes.
• Instalación de Minikube y Kubectl.
• Prácticas de laboratorio y casos de uso prácticos.
• Presentación y uso de objetos por medio de archivos yaml.
• Instalación de Dashboard de Kubernetes.
• Repaso de comandos utilizados.
• Instalación y uso de un clúster de Kubernetes en GCP.
• Instalación de Kubernetes en Windows 10.
• Instalación de VirtualBox en CentOS.
• Tecnologías alternativas a Kubernetes.
Referencias.
• Documentación oficial.
o https://kubernetes.io
o https://kubernetes.io/docs/tasks/tools/install-kubectl/
o https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands
• Repositorio GitHub.
o https://github.com/kubernetes/kubernetes
• Documentación Minikube.
o https://minikube.sigs.k8s.io/docs/
• Dashboard Kubernetes.
o https://github.com/kubernetes/dashboard
o https://github.com/kubernetes/dashboard/blob/master/docs/user/access-control/creating-
sample-user.md
• Google Kubernetes Engine.
o https://cloud.google.com/kubernetes-engine
o https://www.qwiklabs.com
• Comandos VirtualBox
o https://www.virtualbox.org/manual/ch08.html
• Repositorio de imágenes.
o https://pixabay.com/es/