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

  1. 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.
  2. Service: Una forma abstracta de exponer una aplicación que se ejecuta en un conjunto de Pods como un servicio de red.
  3. Volume: Tiene una funcionalidad similar al de Docker Volume, donde se busca persistencia de datos luego de el reinicio de un contenedor.
  4. Namespace: Nos permite aislar recursos para el uso de los distintos usuarios del cluster.
  5. 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.

  1. 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.
  2. 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.
  3. StatefulSet: Un StatefulSet es el objeto de la API workload que se usa para gestionar aplicaciones con estado.
  4. 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.
  5. 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

Artículos K3s

  1. K3s - Parte 1
  2. K3s - Parte 2
  3. K3s - Parte 3
  4. K3s - Parte 4

Referencias

Traducciones: