Acceder a un repository de imágenes con autenticación desde Kubernetes

Leonardo Micheloni · March 1, 2022

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: {}

Dejo los ejemplos por acá

Y listo, nos leemos en la próxima.

Twitter, Facebook