演習 - AKS クラスターで Kubernetes 用の Azure Policy を構成する

完了

Kubernetes 用の Azure Policy は、組織がガバナンスおよび法的要件を満たし、ベスト プラクティスを実施し、クラウド環境向けの組織の規約を確立するのに役立ちます。

開発プラットフォームとして Azure Kubernetes Service (AKS) があなたの会社の開発チームで採用されました。 あなたは、コストを管理する最善の方法は、ワークロードリソースの制限を定義するビジネス ルールを適用することだと認識します。 特定の制限内の CPU およびメモリしか割り当てられないワークロードのみを開発者がデプロイできるようにしたいと考えています。 システムで、それらの制限を超えるワークロードが実行されないようにする必要があります。

この演習では、クラスター上の AKS に対して Azure Policy を有効にし、Kubernetes クラスター コンテナーの CPU とメモリ リソース制限が指定した上限を超えてはいけないというポリシーを追加します。 そして、ポリシーが、ポリシーのリソース パラメーターを超えるワークロードのスケジュールを拒否するかをテストします。

ContainerService および PolicyInsights リソース プロバイダーを有効にする

  1. 自分の Azure アカウントで Azure Cloud Shell にサインインします。 Bash バージョンの Cloud Shell を選択します。

  2. AKS 用の Azure Policy には、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 Policy プロバイダーを登録します。

    az provider register --namespace Microsoft.PolicyInsights
    
  5. az feature register コマンドを実行して、アドオンのインストールを有効にします。

    az feature register --namespace Microsoft.ContainerService --name AKS-AzurePolicyAutoApprove
    
  6. feature-list テーブルに対してクエリを実行して、登録が成功したことを確認します。 クエリの実行には、az feature list コマンドを使用します。 機能の登録は完了するのに数分かかる可能性があるため、定期的に結果を確認する必要があります。

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

    Cloud Shell セッションがタイムアウトした場合は、Azure portal のプレビュー オンボード ウィンドウで登録プロセスを追跡できます。

  7. feature-list クエリ コマンドで 'Registered' と表示されることを確認した後、az provider register コマンドを実行して更新を反映させます。

    az provider register -n Microsoft.ContainerService
    

クラスター上で Azure Policy を有効にする

  1. お使いのクラスターで azure-policy アドオンを有効にするには、az aks enable-addons コマンドを実行します。

    az aks enable-addons \
        --addons azure-policy \
        --name $AKS_CLUSTER_NAME \
        --resource-group $RESOURCE_GROUP
    
  2. kube-system 名前空間に azure ポリシー ポッドがインストールされていること、および 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 portal に切り替えて、[Kubernetes クラスター コンテナーの CPU およびメモリ リソースの制限は、指定された制限を超えないようにする必要がある] という名前のポリシーを構成する準備ができました。

組み込みポリシーの定義を割り当てる

新しい Azure Policy を構成するには、Azure portal の [ポリシー] サービスを使用します。

  1. Azure portal にサインインします。

  2. Azure portal で [ポリシー] サービスを見つけます。 これを行うには、ポータルの上部にある検索バーで、''ポリシー'' を検索して選択します。

  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. ポリシーの割り当てを作成する場合、イニシアチブまたはポリシーを割り当てる 2 つのオプションがあることを前に説明したことを思い出してください。 上部のメニュー バーで、[ポリシーの割り当て] を選択します。

    Screenshot that shows the new policy assignment option.

    [ポリシーの割り当て] ペインが表示されます。

  6. [基本] タブで、各設定に次の値を入力してポリシーを作成します。

    設定
    スコープ
    Scope 省略記号ボタンを選択します。 [スコープ] ペインが表示されます。 [サブスクリプション] で、自分のリソース グループが保持されているサブスクリプションを選択します。 [リソース グループ] では、[rg-akscostsaving] を選択してから、[選択] ボタンを選択します。
    除外 空のままにします。
    基本操作
    ポリシー定義 省略記号ボタンを選択します。 [使用可能な定義] ペインが表示されます。 [検索] ボックスに、「CPU」と入力して選択項目を絞り込みます。 [ポリシー定義] タブで、[Kubernetes クラスター コンテナーの CPU およびメモリ リソースの制限が、指定された制限を超えないようにする必要がある] を選択してから、[追加] を選択します。
    割り当て名 既定値をそのまま使用します。
    Description 空のままにします。
    ポリシーの適用 このオプションが [有効] に設定されていることを確認します。
    割り当て担当者 既定値をそのまま使用します。

    完了した [基本] タブの例を次に示します。

    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. 必ず Bash バージョンの Cloud Shell を選択し、Azure 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>
    

    Admission Webhook の validation.gatekeeper.sh でポッドをスケジュールする要求がどのように拒否されたかに着目してください。

  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 名前空間で新しく作成されたポッドのポッドを取得します。

    kubectl get pods --namespace costsavings
    

    数秒以内に、ポッドが Running 状態に遷移します。

    NAME    READY   STATUS    RESTARTS   AGE
    nginx   1/1     Running   0          50s
    
  10. ポッドが実行されているのを確認したら、Ctrl+C キーを押して監視を止めます。