K3s Apuntes - Parte 3
En la Parte 2 de K3s se hizo una descripción de varios conceptos que se manejan en Kubernetes, se instaló el client kubectl y se hizo pruebas de conectividad a el API de Kubernetes.
Ahora ejecutaremos tareas básicas en nuestro pequeño cluster, pero antes seguimos describiendo mas detalles de Kubernetes.
Objetos de Kubernetes
- Pod: Es un grupo de uno o más contenedores (como contenedores Docker), con almacenamiento/red compartidos, y unas especificaciones de cómo ejecutar los contenedores.
- Service: Una forma abstracta de exponer una aplicación que se ejecuta en un conjunto de Pods como un servicio de red.
- Volume: Tiene una funcionalidad similar al de Docker Volume, donde se busca persistencia de datos luego de el reinicio de un contenedor.
- Namespace: Nos permite aislar recursos para el uso de los distintos usuarios del cluster.
- Manifest: Es un archivo yaml manifiesto que contiene instrucciones que especifican como desplegar una aplicación al nodo o nodos en un cluster de Kubernetes.
Controladores Kubernetes
Kubernetes contiene abstracciónes de nivel superior llamadas Controladores. Los Controladores se basan en los objetos básicos y proporcionan funcionalidades adicionales sobre ellos.
- Replicaset: El objeto de un ReplicaSet es el de mantener un conjunto estable de réplicas de Pods ejecutándose en todo momento. Así, se usa en numerosas ocasiones para garantizar la disponibilidad de un número específico de Pods idénticos.
- Deployment: Un controlador de Deployment proporciona actualizaciones declarativas para los Pods y los ReplicaSets.Cuando describes el estado deseado en un objeto Deployment, el controlador del Deployment se encarga de cambiar el estado actual al estado deseado de forma controlada. Puedes definir Deployments para crear nuevos ReplicaSets, o eliminar Deployments existentes y adoptar todos sus recursos con nuevos Deployments.
- StatefulSet: Un StatefulSet es el objeto de la API workload que se usa para gestionar aplicaciones con estado.
- DaemonSet: Un DaemonSet garantiza que todos (o algunos) de los nodos ejecuten una copia de un Pod. Conforme se añade más nodos al clúster, nuevos Pods son añadidos a los mismos. Conforme se elimina nodos del clúster, dichos Pods se destruyen. Al eliminar un DaemonSet se limpian todos los Pods que han sido creados.
- Job: Un Job crea uno o más Pods y se asegura de que un número específico de ellos termina de forma satisfactoria. Conforme los pods terminan satisfactoriamente, el Job realiza el seguimiento de las ejecuciones satisfactorias. Cuando se alcanza un número específico de ejecuciones satisfactorias, la tarea (esto es, el Job) se completa. Al eliminar un Job se eliminan los Pods que haya creado.
Comandos Kubernetes
Algunos comandos comunes:
1# Listar los Namespace disponibles
2$ kubectl get ns
3# Listar Pods disponibles en un Namespace
4$ kubectl -n kube-system get pods
5# Listar Pods disponibles en un Namespace con mas detalles
6$ kubectl -n kube-system get pods -o wide
7# Eliminar un pod
8$ kubectl -n kube-system delete pod NAME_RUN_POD
Como detalle extra si existe algún problema con el archivo de configuración al node podemos ejecutar:
1$ export KUBECONFIG=PATH_CONFIG_FILE
Ejemplos de Archivos Yaml
1. Para nuestro primer ejemplo crearemos y aplicaremos un archivo básico:
1apiVersion: v1
2kind: Pod
3metadata:
4 name: fcch-nginx
5spec:
6 containers:
7 - name: fcch-nginx
8 image: nginx:alpine
Para ejecutar el contenido de los archivos yaml debemos conocer algunos comandos:
1$ kubectl apply -f basic_pod.yaml
Para ingresar al contenedor dentro del pod podemos ejecutar:
1$ kubectl exec -it fcch-nginx -- sh
Para eliminar los pod creados:
1$ kubectl delete pod fcch-nginx
2# Para verificar
3$ kubectl get pods
2. Para este ejemplo utilizaremos variables de entorno y asignaremos recursos.
1apiVersion: v1
2kind: Pod
3metadata:
4 name: fcch-nginx
5spec:
6 containers:
7 - name: fcch-nginx
8 image: nginx:alpine
9 env:
10 - name: NAME_VARIABLE
11 value: "fcch"
12 - name: NAME_VARIABLE_OTHER
13 value: "fcch-blog"
14 - name: DD_AGENT_HOST
15 valueFrom:
16 fieldRef:
17 fieldPath: status.hostIP
18 resources:
19 requests:
20 memory: "64Mi"
21 cpu: "200m"
22 limits:
23 memory: "128Mi"
24 cpu: "500m"
25 readinessProbe:
26 httpGet:
27 path: /
28 port: 80
29 initialDelaySeconds: 5
30 periodSeconds: 10
31 livenessProbe:
32 tcpSocket:
33 port: 80
34 initialDelaySeconds: 15
35 periodSeconds: 20
36 ports:
37 - containerPort: 80
Si deseamos verificar el archivo yaml que se ejecuto podemos ejecutar:
1$ kubectl get pod fcch-nginx -o yaml
Si se necesita ver los detalles de un pod:
1$ kubectl describe pod fcch-nginx
3. En este ejemplo utilizaremos volumenes, el tipo será StatefulSet y utlizaremos replicas.
Un detalle antes de continuar, PVC: Persistent Volume Clain.
1apiVersion: apps/v1
2kind: StatefulSet
3metadata:
4 name: app-test
5spec:
6 selector:
7 matchLabels:
8 app: apppod
9 serviceName: "first-frontend"
10 replicas: 2
11 template:
12 metadata:
13 labels:
14 app: apppod
15 spec:
16 containers:
17 - name: first-frontend
18 image: busybox
19 args:
20 - sleep
21 - infinity
22 volumeMounts:
23 - mountPath: "/data"
24 name: app-pvc
25 volumeClaimTemplates:
26 - metadata:
27 name: app-pvc
28 spec:
29 accessModes:
30 - ReadWriteOnce
31 resources:
32 requests:
33 storage: 5Gi
34 storageClassName: do-block-storage
Para trabajar con Volumenes podemos ejecutar los siguientes comandos:
1# Listar volumenes
2$ kubectl get pvc
3# Mostrar detalles del PVC
4$ kubectl describe pvc app-pvc-app-test-0
5# Listar Pods de tipo StatefulSet
6$ kubectl get statefulsets
7# Listar Pods de tipo StatefulSet
8$ kubectl get stss
9# Eliminar Pod de tipo StatefulSet
10$ kubectl delete sts app-test
11# Eliminar PVC
12$ kubectl delete pvc app-pvc-app-test-0
Algunos comandos que nos pueden servir:
1# Listado completo
2$ kubectl get all
3# Listar servicios
4$ kubectl get svc
5# Detalle del servicio
6$ kubectl describe svc kubernetes