練習 - 將變數安全地儲存在祕密中

已完成

建立資源群組和 AKS 叢集

注意

此練習為選擇性項目。 如果想要完成此練習,您必須先建立 Azure 訂用帳戶,再開始進行。 如果您沒有 Azure 帳戶,或者目前不想建立帳戶,您可以閱讀相關指示,以了解所呈現的資訊。

  1. 針對您的資源群組、叢集、DNS 區域和位置建立環境變數。 請確定您使用最靠近您的地區更新位置變數,例如:eastus

    export RESOURCE_GROUP=rg-ship-manager
    export CLUSTER_NAME=ship-manager-cluster
    export ZONE_NAME=ship-$RANDOM.com
    export LOCATION={location}
    
  2. 執行下列命令以檢視環境變數的值,並記下它們以供稍後使用。

    echo "RESOURCE_GROUP:" $RESOURCE_GROUP
    echo "CLUSTER_NAME:"$CLUSTER_NAME
    echo "ZONE_NAME:" $ZONE_NAME
    echo "LOCATION:"$LOCATION
    
  3. 使用 az group create 命令建立資源群組。

    az group create --location $LOCATION --name $RESOURCE_GROUP
    
  4. 使用 az aks create 命令建立 AKS 叢集。

    az aks create \
     -g $RESOURCE_GROUP \
     -n $CLUSTER_NAME \
     --location $LOCATION \
     --node-count 1 \
     --node-vm-size Standard_B2s \
     --generate-ssh-keys
    
  5. 使用下列命令啟用應用程式路由附加元件。

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

    注意

    如果您看到訊息要求您安裝 aks-preview 延伸模組,請輸入 Y,即可進行安裝並繼續。

  6. 使用 az network dns zone create 命令建立 DNS 區域。

    az network dns zone create -g $RESOURCE_GROUP -n $ZONE_NAME
    
  7. 擷取 DNS 區域的識別碼,並將其用作命令的一部分,將區域新增至叢集以進行應用程式路由。

    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. 使用 az aks get-credentials 命令取得叢集的認證。

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

建立祕密

注意

應用程式文件 中,您可以看到此應用程式有兩個部分:前端和後端。 只有後端需要使用秘密,因為它具有 MongoDB 連接字串的環境變數。

  1. 部署 MongoDB 資料庫以支援使用 az cosmosdb create 命令的應用程式。

    export DATABASE_NAME=contoso-ship-manager-$RANDOM && \
    az cosmosdb create \
     -n $DATABASE_NAME \
     -g $RESOURCE_GROUP \
     --kind MongoDB
    
  2. 建立資料庫之後,請使用 az cosmosdb keys list 命令取得連接字串,並複製輸出值。

    az cosmosdb keys list \
      --type connection-strings \
      -g $RESOURCE_GROUP \
      -n $DATABASE_NAME \
      -o tsv \
      --query "connectionStrings[0].connectionString"
    
  3. 建立檔案名稱為 backend-secret.yaml 的新 YAML 檔案,並貼上下列程式碼以建立祕密規格。請務必將預留位置字串取代為先前輸出中的連接字串。

    apiVersion: v1
    kind: Secret
    metadata:
      name: ship-manager-database
      namespace: default
    type: Opaque
    stringData:
      database_mongodb_uri: "<paste the connection string here>"
    
  4. 儲存並關閉檔案。

  5. 使用 kubectl apply 命令套用祕密。

    kubectl apply -f backend-secret.yaml
    
  6. 使用 kubectl get secret 命令查詢秘密以檢查結果。

    kubectl get secret ship-manager-database
    

    您應該會看到類似以下範例的輸出:

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

建立應用程式

  1. 建立檔案名稱為 backend-application.yaml 的新 YAML 檔案,並貼上下列程式碼以建立部署規格。

    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
    

    請注意,在 env 區段中,我們使用 valueFromsecretKeyRef 索引鍵。 這些索引鍵的順序會告知部署使用 name 金鑰中所定義的秘密中出現的 key 值。

  2. backend-application.yaml 檔案的最後一行下方新增三條虛線,以分隔下一節。

    # 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. 在三條虛線下方,貼上下列程式碼以建立輸入規格。

    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. 變更 host: 中的 DNS 區域,以和 DNS 區域的名稱相符。 使用您稍早建立的 ZONE_NAME 變數的值。

  5. 儲存並關閉檔案。

  6. 使用 kubectl apply 命令將變更套用至叢集。

    kubectl apply -f backend-application.yaml