Ćwiczenie — bezpieczne przechowywanie zmiennych w sekretach

Ukończone

Utwórz grupę zasobów i klaster usługi AKS

Notatka

To ćwiczenie jest opcjonalne. Jeśli chcesz wykonać to ćwiczenie, przed rozpoczęciem musisz utworzyć subskrypcję platformy Azure. Jeśli nie masz konta platformy Azure lub nie chcesz go tworzyć w tej chwili, możesz zapoznać się z instrukcjami, aby zrozumieć prezentowane informacje.

  1. Utwórz zmienne środowiskowe dla grupy zasobów, klastra, strefy DNS i lokalizacji. Upewnij się, że zmienna LOCATION jest aktualizowana z regionem najbliżej Ciebie, na przykład eastus.

    export RESOURCE_GROUP=rg-ship-manager
    export CLUSTER_NAME=ship-manager-cluster
    export ZONE_NAME=ship-$RANDOM.com
    export LOCATION={location}
    
  2. Uruchom następujące polecenie, aby wyświetlić wartości zmiennych środowiskowych i zanotować je do późniejszego użycia.

    echo "RESOURCE_GROUP:" $RESOURCE_GROUP
    echo "CLUSTER_NAME:"$CLUSTER_NAME
    echo "ZONE_NAME:" $ZONE_NAME
    echo "LOCATION:"$LOCATION
    
  3. Utwórz grupę zasobów przy użyciu polecenia az group create.

    az group create --location $LOCATION --name $RESOURCE_GROUP
    
  4. Utwórz klaster AKS przy użyciu polecenia 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. Włącz dodatek routingu aplikacji za pomocą następującego polecenia.

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

    Notatka

    Jeśli zostanie wyświetlony komunikat z prośbą o zainstalowanie rozszerzenia aks-preview, wprowadź Y, aby go zainstalować i kontynuować.

  6. Utwórz strefę DNS przy użyciu polecenia az network dns zone create.

    az network dns zone create -g $RESOURCE_GROUP -n $ZONE_NAME
    
  7. Pobierz identyfikator strefy DNS i użyj go w ramach polecenia , aby dodać strefę do klastra na potrzeby routingu aplikacji.

    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. Pobierz poświadczenia dla klastra przy użyciu polecenia az aks get-credentials.

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

Utwórz tajemnicę

Notatka

W dokumentacji aplikacji widać, że ta aplikacja ma dwie części: fronton i zaplecze. Tylko zaplecze musi używać sekretu, ponieważ ma ciąg połączenia MongoDB jako zmienną środowiskową.

  1. Wdróż bazę danych MongoDB, aby obsługiwać aplikację przy użyciu polecenia az cosmosdb create.

    export DATABASE_NAME=contoso-ship-manager-$RANDOM && \
    az cosmosdb create \
     -n $DATABASE_NAME \
     -g $RESOURCE_GROUP \
     --kind MongoDB
    
  2. Po utworzeniu bazy danych pobierz parametry połączenia przy użyciu polecenia az cosmosdb keys list i skopiuj wartość wyjściową.

    az cosmosdb keys list \
      --type connection-strings \
      -g $RESOURCE_GROUP \
      -n $DATABASE_NAME \
      -o tsv \
      --query "connectionStrings[0].connectionString"
    
  3. Utwórz nowy plik YAML o nazwie backend-secret.yaml i wklej następujący kod, aby utworzyć specyfikację Secret. Pamiętaj, aby zastąpić ciąg znaków symbolu zastępczego ciągiem połączenia z poprzedniego wyniku.

    apiVersion: v1
    kind: Secret
    metadata:
      name: ship-manager-database
      namespace: default
    type: Opaque
    stringData:
      database_mongodb_uri: "<paste the connection string here>"
    
  4. Zapisz i zamknij plik.

  5. Zastosuj sekret, używając polecenia kubectl apply.

    kubectl apply -f backend-secret.yaml
    
  6. Sprawdź wynik, wykonując zapytanie o tajemnicę przy użyciu polecenia kubectl get secret.

    kubectl get secret ship-manager-database
    

    Powinny zostać wyświetlone dane wyjściowe podobne do następującego przykładu:

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

Tworzenie aplikacji

  1. Utwórz nowy plik YAML o nazwie backend-application.yaml i wklej następujący kod, aby utworzyć specyfikację wdrożenia.

    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
    

    Zwróć uwagę, że w sekcji env używamy valueFrom i kluczy secretKeyRef. Kolejność tych kluczy informuje wdrożenie o użyciu wartości z key obecnej w kluczu tajnym zdefiniowanym w kluczu name.

  2. Dodaj trzy kreski poniżej ostatniego wiersza w pliku backend-application.yaml, aby oddzielić następną sekcję.

    # 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. Pod trzema myślnikami wklej następujący kod, aby utworzyć specyfikację Ingress.

    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. Zmień strefę DNS w host: tak, by pasowała do nazwy Twojej strefy DNS. Użyj wartości utworzonej wcześniej zmiennej ZONE_NAME.

  5. Zapisz i zamknij plik.

  6. Zastosuj zmiany do klastra przy użyciu polecenia kubectl apply.

    kubectl apply -f backend-application.yaml