k8s imagePullSecrets

in Architetture Software, Informatica

Kubernetes – Definire un imagePullSecrets

Reading Time: 2 minutes

All’interno dello yaml file di configurazione di un deployment attraverso imagePullSecrets è possibile indicare come reperire le informazioni di accesso al repository remoto da cui effettuare il pull dell’immagine.

Se il repository è privato, infatti, è necessario definire le credenziali che dovranno essere utilizzate per effettuare l’autenticazione.

Nel caso in cui non sia stato definito un imagePullSecrets vengono utilizzate le credenziali di accesso predefinite nel cluster nel namespace generico. Nel caso in cui non siano state definite credenziali, l’accesso al repository avviene senza l’utilizzo di credenziali.

Nella definizione di servizi all’interno di un cluster kubernetes spesso è necessario ricorrere ai namespace per poter raggruppare le varie funzionalità.

Utilizzando il comando kubectl è possibile ottenere la lista delle credenziali memorizzate, utilizzando il comando:

$> kubectl get secrets -n NAMESPACE

Le definizione delle credenziali è specifica per ogni namespace: ciò significa che è necessario impostare le credenziali all’interno di ogni singolo namespace.

Per poter creare le credenziali in uno specifico namespace è necessario utilizzare il comando:

$> kubectl create secret -n NAMESPACE docker-registry --docker-server=REMOTE_DOCKER_REPOSITORY --docker-username=USERNAME --docker-password="$PASSWORD" REGISTRY

facendo particolare attenzione ad inserire la password tra virgolette.

Un esempio di yaml file che utilizza le credenziali definite con il comando precedente:

# Create a deployment. This will deploy our app on multiple nodes.
apiVersion: apps/v1
kind: Deployment
metadata:
  name: wordpress-dpl # name of our deployment.
  namespace: wordpress-demo
spec:
  selector:
    matchLabels:
      app: wordpress-demo # we'll deploy to all pods that have this label
  replicas: 1 # Number of pods to run the app on
  template: # create pods using pod definition in this template.
    metadata:
      labels:
        app: wordpress-demo # Label of the pods created by this template.
    spec:
      containers:
        - name: wordpress-demo # name of the container
          image: REPOSITORY_DOCKER/wordpress:latest
          ports:
          - containerPort: 80 # port on which the service is running.
            protocol: TCP
          env:
          - name: WORDPRESS_DB_HOST
            value: REMOTE_DB_HOST
          - name: WORDPRESS_DB_PASSWORD
            value: REMOTE_DB_PWD
          - name: WORDPRESS_DB_NAME
            value: REMOTE_DB_NAME
          - name: WORDPRESS_DB_USER
            value: REMOTE_DB_USER
          volumeMounts:
          - name: wordpress-persistent-storage
            mountPath: /var/www/html/wp-content
      imagePullSecrets:
      - name: REGISTRY
      volumes:
      - name: wordpress-persistent-storage
        persistentVolumeClaim:
          claimName: wordpress-vol