Kubernetes (también conocido como K8s) es un sistema de orquestación de contenedores open-source para automatizar el despliegue, escalado y gestión de aplicaciones en contenedores.
Características principales:
La unidad más pequeña en Kubernetes, que puede contener uno o más contenedores.
Gestiona el ciclo de vida de los Pods y permite actualizaciones continuas.
Abstracción que define un conjunto lógico de Pods y una política para acceder a ellos.
Mecanismo para dividir recursos de un cluster entre múltiples usuarios.
Almacenan configuración y datos sensibles respectivamente.
Permite persistir datos más allá del ciclo de vida de un Pod.
# Instalar Minikube
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
# Iniciar cluster
minikube start --driver=docker
# Verificar instalación
kubectl get nodes
# Instalar kubectl
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
# Verificar instalación
kubectl version --client
Comando | Descripción |
---|---|
kubectl get <resource> |
Lista recursos (pods, services, etc.) |
kubectl describe <resource> <name> |
Muestra detalles de un recurso |
kubectl create -f archivo.yaml |
Crea recursos desde un archivo |
kubectl apply -f archivo.yaml |
Aplica cambios a recursos |
kubectl delete <resource> <name> |
Elimina un recurso |
kubectl logs <pod> |
Muestra logs de un pod |
kubectl exec -it <pod> -- /bin/bash |
Ejecuta un comando en un pod |
kubectl port-forward <pod> 8080:80 |
Redirige puertos a un pod |
kubectl rollout status deployment/<name> |
Muestra estado de un despliegue |
apiVersion: v1 # Versión de la API
kind: Pod # Tipo de recurso
metadata:
name: my-pod
labels:
app: nginx
spec:
containers:
- name: nginx-container
image: nginx:latest
ports:
- containerPort: 80
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.19
ports:
- containerPort: 80
# Crear pod desde archivo YAML
kubectl apply -f nginx-pod.yaml
# Ver pods
kubectl get pods
# Ver detalles de un pod
kubectl describe pod nginx-pod
# Eliminar pod
kubectl delete pod nginx-pod
Los Deployments gestionan el ciclo de vida de los Pods y permiten actualizaciones continuas.
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.19
ports:
- containerPort: 80
# Crear deployment
kubectl apply -f nginx-deployment.yaml
# Ver deployments
kubectl get deployments
# Escalar deployment
kubectl scale deployment nginx-deployment --replicas=5
# Actualizar imagen
kubectl set image deployment/nginx-deployment nginx=nginx:1.20
# Ver historial de actualizaciones
kubectl rollout history deployment/nginx-deployment
# Revertir a versión anterior
kubectl rollout undo deployment/nginx-deployment
Los Services permiten exponer aplicaciones dentro y fuera del cluster.
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
type: LoadBalancer
# Crear service
kubectl apply -f nginx-service.yaml
# Ver services
kubectl get services
# Exponer deployment temporalmente
kubectl expose deployment nginx-deployment --port=80 --type=NodePort
Para almacenar configuración no sensible.
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
APP_COLOR: blue
APP_MODE: prod
Para almacenar información sensible (contraseñas, tokens, etc.).
apiVersion: v1
kind: Secret
metadata:
name: app-secret
type: Opaque
data:
DB_Password: cGFzc3dvcmQxMjM= # Base64 encoded
spec:
containers:
- name: myapp
image: myapp:1.0
envFrom:
- configMapRef:
name: app-config
- secretRef:
name: app-secret
apiVersion: v1
kind: Pod
metadata:
name: pod-with-volume
spec:
containers:
- name: nginx
image: nginx
volumeMounts:
- name: html-volume
mountPath: /usr/share/nginx/html
volumes:
- name: html-volume
hostPath:
path: /data/html
type: Directory
Los namespaces permiten dividir recursos en clusters compartidos.
# Listar namespaces
kubectl get namespaces
# Crear namespace
kubectl create namespace dev
# Especificar namespace en comandos
kubectl get pods --namespace=dev
# Cambiar namespace por defecto
kubectl config set-context --current --namespace=dev
apiVersion: v1
kind: Pod
metadata:
name: nginx
namespace: dev
spec:
containers:
- name: nginx
image: nginx
# Ver logs de un pod
kubectl logs <pod-name>
# Ver logs de un contenedor específico
kubectl logs <pod-name> -c <container-name>
# Ver logs en tiempo real
kubectl logs -f <pod-name>
# Ejecutar comando en un pod
kubectl exec -it <pod-name> -- /bin/bash
# Ver métricas de recursos
kubectl top pods
kubectl top nodes
# Ver eventos del cluster
kubectl get events --sort-by='.metadata.creationTimestamp'
apiVersion: apps/v1
kind: Deployment
metadata:
name: webapp-deployment
spec:
replicas: 3
selector:
matchLabels:
app: webapp
template:
metadata:
labels:
app: webapp
spec:
containers:
- name: webapp
image: myapp:1.0
ports:
- containerPort: 8080
envFrom:
- configMapRef:
name: webapp-config
volumeMounts:
- name: config-volume
mountPath: /app/config
volumes:
- name: config-volume
configMap:
name: webapp-config
apiVersion: v1
kind: Service
metadata:
name: webapp-service
spec:
selector:
app: webapp
ports:
- protocol: TCP
port: 80
targetPort: 8080
type: LoadBalancer
Kubernetes es una plataforma poderosa para la orquestación de contenedores que ofrece:
Este manual cubre los conceptos fundamentales, pero Kubernetes tiene muchas más capacidades como:
Para aprender más, consulta la documentación oficial y explora los tutoriales disponibles.