manifest
Por debajo de todas las acciones de kubernetes, lo que el motor entiende, son archivos manifiesto que definen el tipo de cada elemento.
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.
Obtener el manifiesto de un pod
kubectl get pods <nombre pod> -o <formato>
Existen varios formatos de salida pero los más comunes son yaml (el usado nativamente por kubernetes), json, name, go-template (para customizaciones)... https://kubernetes.io/docs/reference/kubectl/overview/#custom-columns
Definir un pod en un manifiesto
Creamos la definición de un pod de prueba que escribirá “Hello world” cada 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 con el comando:
kubectl apply -f pods.yaml
También podríamos eliminarlo usando el manifiesto con el comando:
kubectl deletec-f pods.yaml
Multiples contenedores en un pod
Podemos definir varios contenedores en un pod. En este ejemplo podemos ver el balanceo que hace kubernetes a nivel de red entre los distintos contenedores de un pod.
apiVersion: v1
kind: Pod
metadata:
name: doscont
spec:
containers:
- name: cont1
image: python:3.6-alpine
command: ['sh', '-c', 'echo "cont1 > index.html" && python -m http.server 8082']
- name: cont2
image: python:3.6-alpine
command: ['sh', '-c', 'echo "cont2 > index.html" && python -m http.server 8083']
Labels
Podemos usar etiquetas para filtrar recursos en proyectos de cierto tamaño. Por ejemplo, separando frontend de backend:
apiVersion: v1
kind: Pod
metadata:
name: podtest2
labels:
app: front
env: dev
spec:
containers:
- name: cont1
image: nginx:alpine