Conceptos básicos y kubectl
En este capítulo vamos a ver como configurar nuestro kubectl para que pueda comunicarse con nuestro cluster de kubernetes y cómo definir manifiestos para poder aplicarlos de forma sencilla.
Dentro vídeo: https://youtu.be/cOFcLadQa70
Conceptos básicos
Para empezar, tenemos que tener claro que en kubernetes todo es un recurso o objeto. Un recurso es cualquier cosa que se pueda definir en un cluster de kubernetes, como un pod, un deployment, un service, etc. Cada recurso es de un tipo y tiene unas propiedades y atributos que lo definen. Estos recursos se pueden definir en archivos manifiesto que se aplican al cluster para que se creen o modifiquen.
Esquema de recursos en kubernetes
El pod es el recurso más básico de kubernetes, el cuál es a su vez un grupo de uno o varios contenedores. Los pods no suele crearse directamente, sino que se suelen crear a través de otros recursos como deployments, statefulsets, etc. Estos recursos son los que se encargan de gestionar los pods y asegurarse de que siempre haya el número de pods que se ha definido en el cluster.
Ademas de los pods, hay otros recursos que se pueden definir en kubernetes, como los services, que se encargan de exponer los pods al exterior, los volumes, que se encargan de almacenar datos de forma persistente, los namespaces, que se encargan de agrupar recursos, etc.
Iremos profundizando en cada uno de estos recursos a lo largo del curso, pero es importante tener claro que todo en kubernetes es un recurso y que se definen en archivos manifiesto que se aplican al cluster para que se creen o modifiquen.
Manifiestos
Por debajo de todas las acciones de kubernetes, lo que el motor entiende, son archivos manifiesto que definen el tipo de cada elemento. Pueden ser escritos en formato yaml o json. Aunque kubernetes los procesa finalmente en formato json, lo más normal para los humanos es escribirlos en yaml.
Cuando se coge cierta experiencia se dejan de usar comandos para usar manifiestos y poder aplicar varios a la vez, haciendo el proceso menos tedioso.
Además, un manifiesto nos puede servir para versionar la configuración de los recursos de nuestro cluster en un repositorio git, por ejemplo. También, no solo sirven para crearlos, también podemos coger cualquier recursos existente en un cluster y obtener su manifiesto para guardarlo o modificarlo. Esto facilita mucho la gestión de los recursos en un cluster.
¿Cómo se estructura un manifiesto?
Un manifiesto de kubernetes se compone de 3 partes:
- apiVersion: Versión de la API de kubernetes que se va a usar.
- kind: Tipo de recurso que se va a definir.
- metadata: Información adicional del recurso (nombre, etiquetas, etc).
- spec: Especificación del recurso (contenedores, volúmenes, etc).
Ejemplo de un manifiesto
apiVersion: v1
kind: Pod
metadata:
name: podtest
spec:
containers:
- name: cont1
image: nginx:alpine
Esto sería un ejemplo muy sencillo, pero en un manifiesto podemos definir cualquier tipo de recurso de kubernetes, como pods, deployments, services, etc.
Definir un pod en un manifiesto
Vamos a ponerlo en práctica.
Creamos la definición de un pod de prueba que escribirá “Hello world” y se quedará en ejecución durante 1 hora.:
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
labels:
app: myapp
spec:
containers:
- name: myapp-container
image: busybox
command: ['sh', '-c', 'echo Hello World!; sleep 3600']
Luego podríamos crear el elemento o aplicar cualquier manifiesto con el comando:
kubectl apply -f <manifiesto.yaml>
En nuestro caso, sería:
kubectl apply -f pod.yaml
También podríamos eliminarlo usando el manifiesto con el comando:
kubectl delete -f pod.yaml
Kubectl
Kubectl es la herramienta de línea de comandos que nos permite interactuar con nuestro cluster de kubernetes. Con ella podemos crear, modificar, eliminar y ver los recursos de nuestro cluster. Además, también nos permite ver logs, ejecutar comandos en los contenedores, etc.
Configurar kubectl
En la creación del cluster de kubernetes se nos proporcionó un archivo de configuración que nos permite conectarnos a él. Este se encuentra en el nodo maestro ( o controlplane) en la ruta /etc/kubernetes/admin.conf
. Para poder usarlo en nuestro equipo local, lo copiaremos a la carpeta ~/.kube/config
de nuestro equipo local.
Kubectl busca por defecto en la carpeta ~/.kube/config
para encontrar la configuración del cluster. Si queremos usar otro archivo de configuración, podemos usar la variable de entorno KUBECONFIG
para indicarle a kubectl donde buscar.
export KUBECONFIG=/ruta/al/archivo.conf
Kubeconfig
Este fichero de configuración, contiene la ruta del API del clúster, el certificado de seguridad, el token de acceso y el contexto de kubectl.
apiVersion: v1
kind: Config
clusters:
- name: mi-cluster
cluster:
server: https://192.168.1.100:6443
certificate-authority: /ruta/ca.crt # Certificado del clúster
users:
- name: mi-usuario
user:
client-certificate: /ruta/client.crt
client-key: /ruta/client.key
contexts:
- name: mi-contexto
context:
cluster: mi-cluster
user: mi-usuario
current-context: mi-contexto
Kubectl config y contextos
El comando kubectl config
nos permite gestionar la configuración de kubectl. Algunos comandos útiles son:
kubectl config view
: Muestra la configuración actual.kubectl config get-contexts
: Muestra los contextos disponibles.kubectl config use-context <nombre-contexto>
: Cambia el contexto actual.
También podemos añadir nuevos contextos con el comando kubectl config set-context <nombre-contexto> --cluster=<nombre-cluster> --user=<nombre-usuario>
y no tener que modificar el archivo de configuración manualmente.
Resumen
Ya iremos profunfizando, con tener claro el funcionamiento general y como configurar kubectl es suficiente para empezar a trabajar con kubernetes.
A lo largo del curso veremos todos los objetos que podemos definir en kubernetes y las distintas etiquetas, atributos y propiedades que podemos usar para definirlos en estos manifiestos.
- Lista de vídeos en Youtube: Curso Kubernetes