练习 - 将变量安全地存储在机密中

已完成

创建资源组和 AKS 群集

注意

本练习为选做练习。 若要完成本练习,需要在开始之前创建 Azure 订阅。 如果没有 Azure 帐户,或者现在不想创建帐户,则可以通读说明,以便了解所提供的信息。

  1. 为资源组、群集、DNS 区域和位置创建环境变量。 确保将 LOCATION 变量更新为离你最近的区域,例如 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 区域的 ID,并将其用作命令的一部分,以将区域添加到群集进行应用路由。

    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. 使用 az cosmosdb create 命令部署 MongoDB 数据库以支持应用程序。

    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