練習 - 在 AKS 叢集上設定適用於 Kubernetes 的 Azure 原則

已完成

適用於 Kubernetes 的 Azure 原則可協助組織符合治理和法律需求、實作最佳做法,以及建立雲端環境的組織慣例。

貴公司的開發小組正採用 Azure Kubernetes Service (AKS) 作為開發平台。 您瞭解管理成本的最佳方式是強制執行定義工作負載資源限制的商務規則。 您想要確保開發人員只能在特定 CPU 和記憶體配置限制內部署工作負載。 系統必須防止超過那些限制的工作負載。

在此練習中,您會為叢集上的 AKS 啟用 Azure 原則,並新增 Kubernetes 叢集容器 CPU 和記憶體資源限制不應超過指定的限制原則。 然後,您將測試原則是否拒絕排程超過原則資源參數的工作負載。

啟用 ContainerService 和 PolicyInsights 資源提供者

  1. 使用 Azure 帳戶登入 Azure Cloud Shell。 選取 Cloud Shell 的 Bash 版本。

  2. 適用於 AKS 的 Azure 原則要求叢集版本必須是 1.14 或更新版本。 執行下列指令碼來驗證 AKS 叢集版本:

    az aks list
    

    確定回報的叢集版本為 1.14 或更新版本。

  3. 執行 az provider register 命令以註冊 Azure Kubernetes Service 提供者:

    az provider register --namespace Microsoft.ContainerService
    
  4. 執行 az provider register 命令以註冊 Azure 原則提供者:

    az provider register --namespace Microsoft.PolicyInsights
    
  5. 執行 az feature register 命令來開啟附加元件安裝:

    az feature register --namespace Microsoft.ContainerService --name AKS-AzurePolicyAutoApprove
    
  6. 藉由查詢功能清單數據表,檢查註冊是否成功。 使用 az feature list 命令來執行查詢。 此功能的註冊可能需要幾分鐘的時間才能完成,因此您必須定期檢查結果。

    az feature list -o table --query "[?contains(name, 'Microsoft.ContainerService/AKS-AzurePolicyAutoApprove')].   {Name:name,State:properties.state}"
    

    如果 Cloud Shell 工作階段逾時,您可以透過 Azure 入口網站,使用預覽上線窗格來追蹤註冊程序。

  7. 當您確認 feature-list 查詢命令顯示 'Registered' 之後,請執行 az provider register 命令以散佈更新:

    az provider register -n Microsoft.ContainerService
    

在您的叢集上啟用 Azure 原則

  1. 執行 az aks enable-addons 命令,以針對叢集啟用 azure-policy 附加元件:

    az aks enable-addons \
        --addons azure-policy \
        --name $AKS_CLUSTER_NAME \
        --resource-group $RESOURCE_GROUP
    
  2. 確認 azure-policy Pod 已安裝於 kube-system 命名空間中,而且 Gatekeeper Pod 已安裝於 gatekeeper-system 命名空間中。 若要這樣做,請執行下列 kubectl get pods 命令:

    kubectl get pods -n kube-system
    

    您的輸出看起來應該如下所示:

    NAME                                    READY   STATUS    RESTARTS   AGE
    azure-policy-78c8d74cd4-7fqn2           1/1     Running   0          12m
    azure-policy-webhook-545c898766-gsjrc   1/1     Running   0          12m
    ...
    
    kubectl get pods -n gatekeeper-system
    

    您的輸出看起來應該如下所示:

    NAME                                            READY   STATUS    RESTARTS   AGE
    gatekeeper-controller-manager-d5cd87796-5tmhq   1/1     Running   0          15m
    ...
    
  3. 最後,執行 az aks show 命令來確認是否已安裝最新的附加元件。 此命令會擷取叢集的設定資訊。

    az aks show \
     --resource-group $RESOURCE_GROUP\
     --name $AKS_CLUSTER_NAME \
     -o table --query "addonProfiles.azurepolicy"
    

    您的輸出看起來應該如下所示:

    {
        "config": null,
        "enabled": true,
        "identity": null
    }
    

    您現在已準備好切換至 Azure 入口網站,以設定名為 [Kubernetes 叢集容器 CPU 和記憶體資源限制不得超過指定的限制] 的原則。

指派內建原則定義

若要設定新的 Azure 原則,請使用 Azure 入口網站中的原則服務。

  1. 登入 Azure 入口網站

  2. 在 Azure 入口網站中,找出 [原則] 服務。 若要這樣做,請在入口網站頂端的搜尋列中,搜尋並選取 [原則]

  3. 從服務清單中選取 [原則] 服務,如下所示:

    Screenshot of the general Azure portal search box with a result that shows the Azure Policy service.

    [原則] 儀表板隨即開啟,其中顯示您所有已指派的原則、資源狀態,以及原則會對其產生何種影響的概觀。 如果您尚未指派任何原則,儀表板會是空的。

  4. 在左側功能表窗格中,選取 [製作] 下的 [指派]

    Screenshot of the Policy service navigation panel that shows the location of the Assignments option.

  5. 回想一下先前的描述,其中提到您有兩個建立原則指派的選項:您可以指派方案或是指派原則。 在頂端功能表列中,選取 [指派原則]

    Screenshot that shows the new policy assignment option.

    [指派原則] 窗格隨即出現。

  6. 在 [基本] 索引標籤上,為每個設定輸入下列值以建立原則。

    設定
    範圍
    範圍 選取省略符號按鈕。 [範圍] 窗格隨即出現。 在 [訂用帳戶] 下,選取保存您資源群組的訂用帳戶。 針對 [資源群組],選取 [rg-akscostsaving],然後選取 [ 選取 ] 按鈕。
    排除項目 保留空白。
    基本概念
    原則定義 選取省略符號按鈕。 [可用定義] 窗格隨即出現。 在 [搜尋] 方塊中,輸入 CPU 以篩選選取範圍。 在 [原則 定義 ] 索引卷標上 ,選取 Kubernetes 叢集容器 CPU 和記憶體資源限制不應超過指定的限制,然後選取 [ 新增]。
    指派名稱 接受預設值。
    描述 保留空白。
    強制執行原則 確定此選項設定為 [已啟用]
    指派者 接受預設值。

    以下是已完成 [基本] 索引標籤的範例:

    Screenshot that shows the information captured in the Basics tab.

  7. 選取 [參數] 索引標籤,以指定原則的參數。

  8. 針對每個參數設定,設定下列值:

    設定
    允許的 CPU 單位上限 將值設定為 200m。 原則會將此值與工作負載資訊清單檔中所指定的工作負載資源要求值和工作負載限制值進行比對。
    允許的記憶體位元組數上限 將值設定為 256Mi。 原則會將此值與工作負載資訊清單檔中所指定的工作負載資源要求值和工作負載限制值進行比對。

    以下是已完成 [參數] 索引標籤的範例:

    Screenshot that shows the information captured in the Parameters tab.

  9. 選取 [ 補救] 索引標籤。在此索引標籤中,您將選取新原則如何影響已經存在的資源。 根據預設,新原則只會檢查新建立的資源。 保留標準預設設定。

    以下是已完成 [補救] 索引標籤的範例:

    Screenshot that shows the information captured in the Remediation tab.

  10. 選取 [ 檢閱 + 建立] 索引標籤。檢閱您選擇的值,然後選取 [ 建立]。

重要

如果您使用現有的 AKS 叢集,原則指派可能需要大約 15 分鐘的時間才能套用。

測試資源要求

最後一個步驟是測試新原則。 使用違反新原則的資源要求和限制來部署測試工作負載。 如果一切正確,伺服器會傳回錯誤,指出原則拒絕。

  1. 開啟 Azure Cloud Shell,並確定選取 Bash 版本的 Cloud Shell。

  2. 使用整合式編輯器,為 Kubernetes 部署建立資訊清單檔。 呼叫 test-policy.yaml 檔案:

    code test-policy.yaml
    

    提示

    Cloud Shell 包含整合式檔案編輯器 \(部分機器翻譯\)。 Cloud Shell 編輯器支援語言醒目提示、命令選擇區,以及檔案總管等功能。 針對簡易的檔案建立和編輯,在 Cloud Shell 終端中執行 code . 以啟動編輯器。 這項動作會開啟編輯器,並在終端機中設為您目前正在使用的工作目錄。 若要直接開啟您的資訊清單檔以進行快速編輯,請執行 code test-policy.yaml。 此命令會在沒有檔案總管的情況下開啟編輯器。

  3. 將下列文字貼入檔案:

    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx
      labels:
        env: test
    spec:
      containers:
      - name: nginx
        image: nginx
        imagePullPolicy: IfNotPresent
        resources:
          requests:
            cpu: 500m
            memory: 256Mi
          limits:
            cpu: 1000m
            memory: 500Mi
    
  4. Ctrl+S 儲存盤案,然後按 Ctrl+Q 以關閉編輯器。

  5. 執行 kubectl apply 命令以套用設定,並在 costsavings 命名空間中部署應用程式:

    kubectl apply \
    --namespace costsavings \
    -f test-policy.yaml
    

    您的輸出應該如下所示:

    Error from server (
    [denied by azurepolicy-container-limits-52f2942767eda208f8ac3980dc04b548c4a18a2d1f7b0fd2cd1a7c9e50a92674] container <nginx> memory limit <500Mi> is higher than the maximum allowed of <256Mi>
    [denied by azurepolicy-container-limits-52f2942767eda208f8ac3980dc04b548c4a18a2d1f7b0fd2cd1a7c9e50a92674] container <nginx> cpu limit <1> is higher than the maximum allowed of <200m>)
     : error when creating "test-deploy.yml"
     : admission webhook "validation.gatekeeper.sh" denied the request: 
    [denied by azurepolicy-container-limits-52f2942767eda208f8ac3980dc04b548c4a18a2d1f7b0fd2cd1a7c9e50a92674] container <nginx> memory limit <500Mi> is higher than the maximum allowed of <256Mi>
    [denied by azurepolicy-container-limits-52f2942767eda208f8ac3980dc04b548c4a18a2d1f7b0fd2cd1a7c9e50a92674] container <nginx> cpu limit <1> is higher than the maximum allowed of <200m>
    

    請注意,許可 Webhook validation.gatekeeper.sh 如何拒絕排程 Pod 的要求。

  6. 開啟資訊清單檔,並修正資源要求:

    code test-policy.yaml
    

    以下欄文字取代文字:

    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx
      labels:
        env: test
    spec:
      containers:
      - name: nginx
        image: nginx
        imagePullPolicy: IfNotPresent
        resources:
          requests:
            cpu: 200m
            memory: 256Mi
          limits:
            cpu: 200m
            memory: 256Mi
    
  7. Ctrl+S 儲存盤案,然後按 Ctrl+Q 以關閉編輯器。

  8. 執行 kubectl apply 命令以套用設定,並在 costsavings 命名空間中部署應用程式:

    kubectl apply \
    --namespace costsavings \
    -f test-policy.yaml
    

    您將取得下列輸出:

    pod/nginx created
    
  9. 取得 costsavings 命名空間中新建立 Pod 的 Pod。

    kubectl get pods --namespace costsavings
    

    在幾秒鐘內,Pod 會轉換至 Running 狀態。

    NAME    READY   STATUS    RESTARTS   AGE
    nginx   1/1     Running   0          50s
    
  10. 一旦您看到 Pod 正在執行,請按 Ctrl+C 以停止監看。