Esercizio - Archiviare in modo sicuro le variabili nei segreti

Completato

Creare un gruppo di risorse e un cluster del servizio Azure Kubernetes

Nota

Questo esercizio è facoltativo. Per completare questo esercizio, sarà necessario creare una sottoscrizione di Azure prima di iniziare. Se non si dispone di un account Azure o non si vuole crearne uno in questo momento, è possibile leggere le istruzioni per avere un'idea delle informazioni contenute.

  1. Creare variabili di ambiente per il gruppo di risorse, il cluster, la zona DNS e la posizione. Assicurarsi di aggiornare la variabile LOCATION con l'area più vicina, ad esempio eastus.

    export RESOURCE_GROUP=rg-ship-manager
    export CLUSTER_NAME=ship-manager-cluster
    export ZONE_NAME=ship-$RANDOM.com
    export LOCATION={location}
    
  2. Esegui il comando seguente per visualizzare i valori delle variabili di ambiente e prendere nota di essi per usarli in un secondo momento.

    echo "RESOURCE_GROUP:" $RESOURCE_GROUP
    echo "CLUSTER_NAME:"$CLUSTER_NAME
    echo "ZONE_NAME:" $ZONE_NAME
    echo "LOCATION:"$LOCATION
    
  3. Creare un gruppo di risorse usando il comando az group create.

    az group create --location $LOCATION --name $RESOURCE_GROUP
    
  4. Creare un cluster del servizio Azure Kubernetes usando il comando az aks create.

    az aks create \
     -g $RESOURCE_GROUP \
     -n $CLUSTER_NAME \
     --location $LOCATION \
     --node-count 1 \
     --node-vm-size Standard_B2s \
     --generate-ssh-keys
    
  5. Abilita il componente aggiuntivo di routing dell'applicazione con il comando seguente.

    az aks approuting enable -g $RESOURCE_GROUP -n $CLUSTER_NAME
    

    Nota

    Se visualizzi un messaggio che chiede di installare l'estensione aks-preview, immetti Y per installarla e continuare.

  6. Crea una zona DNS usando il comando az network dns zone create.

    az network dns zone create -g $RESOURCE_GROUP -n $ZONE_NAME
    
  7. Recupera l'ID della zona DNS e usalo come parte del comando per aggiungere la zona al cluster per il routing delle app.

    ZONEID=$(az network dns zone show -g $RESOURCE_GROUP -n $ZONE_NAME --query "id" --output tsv)
    az aks approuting zone add -g $RESOURCE_GROUP -n $CLUSTER_NAME --ids=${ZONEID} --attach-zones
    
  8. Ottieni le credenziali per il cluster usando il comando az aks get-credentials.

    az aks get-credentials -n $CLUSTER_NAME -g $RESOURCE_GROUP
    

Creare un segreto

Nota

Nella documentazione dell'applicazione, è possibile notare che questa applicazione include due parti: il front-end e il back-end. Solo il back-end deve usare un segreto, perché ha la stringa di connessione MongoDB come variabile di ambiente.

  1. Distribuire un database MongoDB per supportare l'applicazione usando il comando az cosmosdb create.

    export DATABASE_NAME=contoso-ship-manager-$RANDOM && \
    az cosmosdb create \
     -n $DATABASE_NAME \
     -g $RESOURCE_GROUP \
     --kind MongoDB
    
  2. Dopo aver creato il database, ottenere la stringa di connessione usando il comando az cosmosdb keys list e copiare il valore di output.

    az cosmosdb keys list \
      --type connection-strings \
      -g $RESOURCE_GROUP \
      -n $DATABASE_NAME \
      -o tsv \
      --query "connectionStrings[0].connectionString"
    
  3. Creare un nuovo file YAML denominato backend-secret.yaml e incollare il codice seguente per creare la specifica di segreto. Assicurarsi di sostituire la stringa segnaposto con la stringa di connessione dell'output precedente.

    apiVersion: v1
    kind: Secret
    metadata:
      name: ship-manager-database
      namespace: default
    type: Opaque
    stringData:
      database_mongodb_uri: "<paste the connection string here>"
    
  4. Salva e chiudi il file.

  5. Applicare il segreto usando il comando kubectl apply.

    kubectl apply -f backend-secret.yaml
    
  6. Controllare il risultato eseguendo una query sul segreto usando il comando kubectl get secret.

    kubectl get secret ship-manager-database
    

    L'output dovrebbe essere simile all'esempio seguente:

    NAME                    TYPE     DATA   AGE
    ship-manager-database   Opaque   1      5s
    

Creare l'applicazione

  1. Creare un nuovo file YAML denominato backend-application.yaml e incollare il codice seguente per creare la specifica di distribuzione.

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: ship-manager-backend
      namespace: default
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: ship-manager-backend
      template:
        metadata:
          labels:
            app: ship-manager-backend
        spec:
          containers:
            - image: mcr.microsoft.com/mslearn/samples/contoso-ship-manager:backend
              name: ship-manager-backend
              ports:
                - containerPort: 3000
                  name: http
              env:
                - name: DATABASE_MONGODB_URI
                  valueFrom:
                    secretKeyRef:
                      key: database_mongodb_uri
                      name: ship-manager-database
                - name: DATABASE_MONGODB_DBNAME
                  value: ship_manager
    

    Nella sezione env vengono usate le chiavi valueFrom e secretKeyRef. L'ordine di queste chiavi indica alla distribuzione di utilizzare il valore dell’elemento key presente nel segreto definito nella chiave name.

  2. Aggiungere tre trattini sotto l'ultima riga del file backend-application.yaml per separare la sezione successiva.

    # Previous lines from the deployment
    value: ship_manager
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: ship-manager-backend
      namespace: default
    spec:
      selector:
        app: ship-manager-backend
      ports:
        - name: http
          port: 80
          targetPort: 3000
    ---
    
  3. Sotto i tre trattini incollare il codice seguente per creare la specifica in ingresso.

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: ship-manager-backend
      namespace: default
      annotations:
        spec.ingressClassName: webapprouting.kubernetes.azure.com
    spec:
      rules:
        - host: ship-manager-backend.<paste the ZONE_NAME here>
          http:
            paths:
              - path: /
                pathType: Prefix
                backend:
                  service:
                    name: ship-manager-backend
                    port:
                      name: http
    
  4. Modifica la zona DNS in host: in modo che corrisponda al nome della zona DNS. Usa il valore della variabile ZONE_NAME creata in precedenza.

  5. Salva e chiudi il file.

  6. Applicare le modifiche al cluster usando il comando kubectl apply.

    kubectl apply -f backend-application.yaml