Distribuire l'applicazione Guestbook nel cluster di Tanzu Kubernetes per esplorare il criterio di sicurezza del pod per gli account di servizio, nonché per la distribuzione e la creazione del servizio.

La distribuzione dell'applicazione Guestbook è un modo comune per esplorare Kubernetes. Se si distribuiscono tutti i file YAML di Guestbook in un cluster di Tanzu Kubernetes il cui provisioning è stato eseguito dal Servizio Tanzu Kubernetes Grid, il pod dell'applicazione non viene creato correttamente. Quando si esegue il comando kubectl describe pod, viene visualizzato il seguente messaggio di errore:

“Error: container has runAsNonRoot and image will run as root”

L'applicazione Guestbook utilizza entrambe le risorse deployment e replicaset per distribuire container privilegiati nello spazio dei nomi predefinito. Poiché il controller PodSecurityPolicy è abilitato per i cluster di Tanzu Kubernetes, quando un utente del cluster tenta di creare il pod dell'applicazione Guestbook, gli account di servizio per questi controller vengono controllati rispetto a PodSecurityPolicy. Se a questi account di servizio non è associato un PSP appropriato, l'applicazione non viene distribuita.

Per impostazione predefinita, gli amministratori di Tanzu Kubernetes possono creare pod privilegiati direttamente in qualsiasi spazio dei nomi utilizzando il loro account utente. Tuttavia, l'applicazione Guestbook distribuisce container privilegiati utilizzando gli account di servizio. Un amministratore del cluster può creare distribuzioni, StatefulSet e DaemonSet nello spazio dei nomi kube-system. Tuttavia, l'applicazione Guestbook distribuisce queste risorse nello spazio dei nomi predefinito. Inoltre, gli utenti non amministrativi non possono creare pod privilegiati o non privilegiati senza il PSP e i binding appropriati.

Una soluzione consiste nel creare binding al PSP privilegiato predefinito per consentire la distribuzione dell'applicazione Guestbook. Il PodSecurityPolicy privilegiato consente pod eseguiti come radice e container privilegiati per gli account associati. È possibile creare un ClusterRoleBinding che applichi il vmware-system-privileged in tutto il cluster, ma così facendo è possibile violare il principio del privilegio minimo concedendo più autorizzazioni di quelle necessarie. Un approccio migliore consiste nel creare un RoleBinding che consenta agli account dei servizi di sistema di utilizzare il PodSecurityPolicy privilegiato nello spazio dei nomi predefinito. Per ulteriori informazioni, vedere Esempio di binding del ruolo per il criterio di sicurezza pod.

Prerequisiti

Procedura

  1. Accedere al cluster di Tanzu Kubernetes. Vedere Connessione a un cluster Tanzu Kubernetes come utente vCenter Single Sign-On.
  2. Creare lo spazio dei nomi di Guestbook.
    kubectl create namespace guestbook
    Verificare:
    kubectl get ns
  3. Creare il controllo degli accessi basato sui ruoli utilizzando il PSP privilegiato predefinito.
    kubectl create clusterrolebinding default-tkg-admin-privileged-binding --clusterrole=psp:vmware-system-privileged --group=system:authenticated
    Nota: Se è necessaria una protezione maggiore, applicare un RoleBinding allo spazio dei nomi di Guestbook. Vedere Esempio di binding del ruolo per il criterio di sicurezza pod.
  4. Verificare la classe di storage o crearne una.
    Per verificare una classe di storage esistente:
    kubectl get storageclass
    Per creare un classe di storage, vedere Esempio di classe di storage di Tanzu Kubernetes.
  5. Creare le richieste di volume persistente (PVC) che utilizzano la classe di storage.
  6. Creare i file YAML di Guestbook.
  7. Distribuire l'applicazione Guestbook nel relativo spazio dei nomi.
    kubectl apply -f . --namespace guestbook
  8. Verificare la creazione delle risorse del Guestbook.
    kubectl get all -n guestbook
    NAME                                                 READY   STATUS              RESTARTS   AGE
    pod/guestbook-frontend-deployment-56fc5b6b47-cd58r   1/1     Running             0          65s
    pod/guestbook-frontend-deployment-56fc5b6b47-fh6dp   1/1     Running             0          65s
    pod/guestbook-frontend-deployment-56fc5b6b47-hgd2b   1/1     Running             0          65s
    pod/redis-follower-deployment-6fc9cf5759-99fgw       1/1     Running             0          65s
    pod/redis-follower-deployment-6fc9cf5759-rhxf7       1/1     Running             0          65s
    pod/redis-leader-deployment-7d89bbdbcf-flt4q         1/1     Running             0          65s
    
    NAME                                 TYPE           CLUSTER-IP       EXTERNAL-IP     PORT(S)        AGE
    service/guestbook-frontend           LoadBalancer   10.10.89.59      10.19.15.99     80:31513/TCP   65s
    service/redis-follower               ClusterIP      10.111.163.189   <none>          6379/TCP       65s
    service/redis-leader                 ClusterIP      10.111.70.189    <none>          6379/TCP       65s
    
    NAME                                            READY   UP-TO-DATE   AVAILABLE   AGE
    deployment.apps/guestbook-frontend-deployment   3/3     3            3           65s
    deployment.apps/redis-follower-deployment       1/2     2            1           65s
    deployment.apps/redis-leader-deployment         1/1     1            1           65s
    
    NAME                                                       DESIRED   CURRENT   READY   AGE
    replicaset.apps/guestbook-frontend-deployment-56fc5b6b47   3         3         3       65s
    replicaset.apps/redis-follower-deployment-6fc9cf5759       2         2         1       65s
    replicaset.apps/redis-leader-deployment-7d89bbdbcf         1         1         1       65s
  9. Accedere alla pagina Web di Guestbook utilizzando l'indirizzo External-IP del bilanciamento del carico service/guestbook-frontend, che in questo esempio è 10.19.15.99.
    Viene visualizzata l'interfaccia Web di Guestbook ed è possibile immettere valori nel database di Guestbook. Se si riavvia l'applicazione, i dati vengono conservati.