Los Pods en Kubernetes utilizan imágenes, y lo más probable es que estas imágenes estén en un registro fuera del cluster, y lo segundo más probable es que necesite autenticación. Entonces nos encontramos con la pregunta “Cómo hago para que un Pod o Deployment en Kubernetes se autentique para descargar una imagen desde un repositorio que no es público?”. Bien, es post es acerca de cómo resolver este caso en Azure Container Registry, pero podría ser cualquier otro repository.
Secrets al rescate
La respuesta es bastante sencilla, necesitamos crear un secret, pero de un tipo especial en este caso kubernetes.io/dockerconfigjson sin embargo como casi siempre con los secrets lo más adecuado es crearlos en el momento de utilizarlos y no dejar el YAML en en repository de código porque pierden un poco el sentido, el comando para crearlo sería así:
kubectl create secret docker-registry mysecreto --docker-username=username --docker-password=password --docker-server=urldemiregistro
Y el resultado es el siguiente (notemos que ya el password está encriptado)
apiVersion: v1
type: kubernetes.io/dockerconfigjson
data:
.dockerconfigjson: eyJhdXRocyI6eyJ1cmxkZW1pcmVnaXN0cm8iOnsidXNlcm5hbWUiOiJ1c2VybmFtZSIsInBhc3N3b3JkIjoicGFzc3dvcmQiLCJhdXRoIjoiZFhObGNtNWhiV1U2Y0dGemMzZHZjbVE9In19fQ==
kind: Secret
metadata:
creationTimestamp: null
name: mysecreto
¿Cómo usamos el secret para acceder en nuestro pod / deployment?
Bien, esto es relativamente sencillo, solo debemos agregar una opción a nivel de containers (que es imagepullsecrets, porque podrían ser varios)
apiVersion: v1
kind: Pod
metadata:
labels:
run: busybox
name: busybox
spec:
imagePullSecrets: # indicamos que si se necesita autenticación se utilice el user y password del secret
- name: mysecreto
containers:
- image: busybox
args: ["tail", "-f", "/dev/null"]
name: busybox
resources: {}
dnsPolicy: ClusterFirst
restartPolicy: Always
status: {}
Y listo, nos leemos en la próxima.