From e618b48cb6b9f0e027b6d7047ec014d0bdd9f1dd Mon Sep 17 00:00:00 2001 From: Celestino Amoroso Date: Wed, 9 Jul 2025 09:37:34 +0200 Subject: [PATCH] Update Containers/docker-registry Prima bozza incompleta del capitolo 3 --- Containers/docker-registry | 216 +++++++++++++++++++++++++++++++++++++ 1 file changed, 216 insertions(+) diff --git a/Containers/docker-registry b/Containers/docker-registry index 0fac64c..1d384d6 100644 --- a/Containers/docker-registry +++ b/Containers/docker-registry @@ -412,6 +412,222 @@ fd2758d7a50e: Layer already exists amo1: digest: sha256:f8ff90f6715f4708afe556f5b708befeb5f0480c175fc369c2e59202f3374f04 size: 739 ---- +## Pod Kubernetes con immagine dal registry +Con le procedure spiegate nel capitolo precedente è stato realizzato un servizio registry per immagini Docker. In questo capitolo si esaminano le condizioni e le azioni che consentono la creazione di Pod Kubernetes che utilizzano immagini scaricate dal servizio registry creato. + +Nella prima parte di questo capitolo si mostra come definire e creare un Pod attraverso un file _manifest_. In seguito si capirà come eseguire direttamente procedere con l'esecuzione diretta di un Pod con il comando _"kubectl run ..."_. + +Di seguito i link ad alcune pagine della documentazione Kubernetes utili per il tema del capitolo. + +* https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/[Pull an Image from a Private Registry] +* https://kubernetes.io/docs/concepts/containers/images/#specifying-imagepullsecrets-on-a-pod[Specifying `imagePullSecrets` on a Pod] +* https://kubernetes.io/docs/reference/kubectl/generated/kubectl_run/[kubectl run] + +### File manifest +Un file manifest definisce le caratteristiche di un oggetto Kubernetes, ad esempio quelle di un Pod. + +L'esempio seguente specifica gli attributi di un Pod per l'esecuzione dell'applicazione _kuard_. In particolare, specifica che la sorgente dell'immagine da utilizzare per il container è quella caricata nel registry privato _hub.paas.portale-stac.it_. + +.Prima bozza del manifest per Pod kuard +[source,yaml] +---- +apiVersion: v1 +kind: Pod +metadata: + name: kuard +spec: + containers: + - image: hub.paas.portale-stac.it/kuard-amd64:amo1 + name: kuard + ports: + - containerPort: 8080 + name: http + protocol: TCP +---- + +Se si tentasse di attivare il Pod secondo la specifica di sopra, si otterrebbe l'errore _ErrImagePull_ che indica l'impossibilità di scaricare l'immagine richiesta. + +Per verificare questa situazione, registrare il manifest nel file YAML _kuard-pod.yaml_ ed eseguire le istruzioni seguenti. + +[[a_pod_activation,Attivazione Pod]] +.Tentativo di attivazione del Pod +[source,shell] +---- +# Creazione del Pod +[fedoravm]$ kubectl apply -f kuard-pod.yaml +pod/kuard created + +# Stato del Pod: ErrImagePull +[fedoravm]$ kubectl get pods +NAME READY STATUS RESTARTS AGE +kuard 0/1 ErrImagePull 0 5s + +# Distruzione del Pod +[fedoravm]$ kubectl delete pods/kuard +pod "kuard" deleted +---- + +In questo caso, la causa dell'errore risiede nel fatto che il Pod non dispone delle credenziali per accedere al registry remoto. + +Per risolvere questo problema è necessario, innanzitutto, definire un oggetto contenitore per le credenziali, detto _secret_. Poi serve associare questo oggetto al Pod che le utilizzerà. + +L'associazione di un secret ad un Pod può essere effetuata in due modi: + +* associazione diretta, con specifica del secret nel Pod manifest; +* associazione indiretta, mediante l'uso di _ServiceAccount_. + + +#### Creazione secret +I _secret_ sono oggetti che consentono ai Pod l'accesso a servizi esterni. Esistono diversi tipi di credenziali, una delle quali è quella basata su username e password per accedere ai registry delle immagini Docker. + +La pagina di riferimento nella documentazione Kubernetes è https://kubernetes.io/docs/concepts/configuration/secret/[Secret]. + +##### Copia credenziali Docker +Le credenziali Docker possono essere recuperate dal suo file di configurazione `~/.docker/config.json` nel quale sono registrate automaricamente dal comando _docker_ dopo un'operazione di login conclusa con successo. Questa modalità è appropriata per connessioni a servizi registry. + +Se non già fatto, eseguire il login al registry con il comando _docker_. + +.Login Docker al registry +[source, shell] +---- +[fedoravm]$ docker login -u camoroso https://hub.paas.portale-stac.it +Password: +Login Succeeded + +[fedoravm]$ cat ~/.docker/config.json +{ + "auths": { + "hub.paas.portale-stac.it": { + "auth": "Y2Ftb3Jvc286SHViLkFtbw==" + } + } +} +---- + +Procedere ora con la creazione del secret con le credenziali registrate dal login in `~/.docker/config.json`. + +.Creazione di un secret a partire dalla configurazione Docker +[source, shell] +---- +# Creazione secret con nome regcred +[fedoravm]$ kubectl create secret generic regcred \ + --from-file=.dockerconfigjson=${HOME}/.docker/config.json \ + --type=kubernetes.io/dockerconfigjson + +# Verifica secret +[fedoravm]$ kubectl get secret regcred --output=yaml +apiVersion: v1 +data: + .dockerconfigjson: ewoJImF1dGhzIjogewoJCSJodWIucGFhcy5wb3J0YWxlLXN0YWMuaXQiOiB7CgkJCSJhdXRoIjogIlkyRnRiM0p2YzI4NlNIVmlMa0Z0Ync9PSIKCQl9Cgl9Cn0= +kind: Secret +metadata: + creationTimestamp: "2025-07-04T20:23:17Z" + name: regcred + namespace: default + resourceVersion: "284323" + uid: 6ca08567-aa66-455d-8245-ab0e8a48d3c4 +type: kubernetes.io/dockerconfigjson + +# Eventualmente, è possibile richiedere uno specifico attributo +[fedoravm]$ kubectl get secret regcred \ + --output="jsonpath={.data.\.dockerconfigjson}" +ewoJImF1dGhzIjogewoJCSJodWIucGFhcy5wb3J0YWxlLXN0YWMuaXQiOiB7CgkJCSJhdXRoIjogIlkyRnRiM0p2YzI4NlNIVmlMa0Z0Ync9PSIKCQl9Cgl9Cn0= + +# Lista dei secrets +[fedoravm]$ kubectl get secrets +NAME TYPE DATA AGE +regcred kubernetes.io/dockerconfigjson 1 4d10h +---- + +##### Creazione esplicita di un secret Docker +#todo# + +#### Associazione del secret al Pod +L'associazione al Pod del secret creato si realizza semplicemente aggiungendo l'attributo _imagePullSecrets_ al file manifest. + +.Manifest per Pod kuard con specifica diretta delle credenziali +[source,yaml] +---- +apiVersion: v1 +kind: Pod +metadata: + name: kuard +spec: + containers: + - image: hub.paas.portale-stac.it/kuard-amd64:amo1 + name: kuard + ports: + - containerPort: 8080 + name: http + protocol: TCP + imagePullSecrets: + - name: regcred +---- + +Salvare la modifica nel file manifest ed attivare il Pod come mostrato in <>. Questa volta lo stato dovrebbe essere _Running_. + +#### Creazione di un ServiceAccount +#todo, spiegare la funzione dei ServiceAccount# + +.Creazione ServiceAccount con nome amo-sc +[source,shell] +---- +# Creazione ServiceAccount +[fedoravm]$ kubectl create serviceaccount amo-sc +serviceaccount/amo-sc created + +# Associazione del secret regcred al ServiceAccount +[fedoravm]$ kubectl patch serviceaccount amo-sc \ + -p '{"imagePullSecrets": [{"name": "regcred"}]}' +serviceaccount/amo-sc patched +---- + +#### Associazione del ServiceAccount al Pod +Anche l'associazione del ServiceAccount al Pod si esegue con l'aggiunta di un attributo, _serviceAccountName_. + +.Manifest per Pod kuard con specifica ServiceAccount +[source,yaml] +---- +apiVersion: v1 +kind: Pod +metadata: + name: kuard +spec: + containers: + - image: hub.paas.portale-stac.it/kuard-amd64:amo1 + name: kuard + ports: + - containerPort: 8080 + name: http + protocol: TCP + serviceAccountName: amo-sc +---- + +Anche in questo caso, verificare il funzionamento del Pod con i comandi di <>. + +//// +.Specifica della modalità di pull +[source,yaml] +---- +apiVersion: v1 +kind: Pod +metadata: + name: kuard +spec: + containers: + - image: hub.paas.portale-stac.it/kuard-amd64:amo1 + #imagePullPolicy: Never + name: kuard + ports: + - containerPort: 8080 + name: http + protocol: TCP + serviceAccountName: amo-sc + #imagePullSecrets: + # - name: regcred +---- +//// + //// Add ImagePullSecrets to a service account https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/#add-imagepullsecrets-to-a-service-account