演習 - AKS クラスターで Kubernetes 用の Azure Policy を構成する
Kubernetes 用の Azure Policy は、組織がガバナンスおよび法的要件を満たし、ベスト プラクティスを実施し、クラウド環境向けの組織の規約を確立するのに役立ちます。
開発プラットフォームとして Azure Kubernetes Service (AKS) があなたの会社の開発チームで採用されました。 あなたは、コストを管理する最善の方法は、ワークロードリソースの制限を定義するビジネス ルールを適用することだと認識します。 特定の制限内の CPU およびメモリしか割り当てられないワークロードのみを開発者がデプロイできるようにしたいと考えています。 システムで、それらの制限を超えるワークロードが実行されないようにする必要があります。
この演習では、クラスター上の AKS に対して Azure Policy を有効にし、Kubernetes クラスター コンテナーの CPU とメモリ リソース制限が指定した上限を超えてはいけないというポリシーを追加します。 そして、ポリシーが、ポリシーのリソース パラメーターを超えるワークロードのスケジュールを拒否するかをテストします。
ContainerService および PolicyInsights リソース プロバイダーを有効にする
自分の Azure アカウントで Azure Cloud Shell にサインインします。 Bash バージョンの Cloud Shell を選択します。
AKS 用の Azure Policy には、1.14 以上のクラスター バージョンが必要です。 お使いの AKS クラスターのバージョンを検証するには、次のスクリプトを実行します。
az aks list
報告されるクラスターのバージョンが 1.14 以上であることを確認します。
az provider register
コマンドを実行して、Azure Kubernetes Service プロバイダーを登録します。az provider register --namespace Microsoft.ContainerService
az provider register
コマンドを実行して、Azure Policy プロバイダーを登録します。az provider register --namespace Microsoft.PolicyInsights
az feature register
コマンドを実行して、アドオンのインストールを有効にします。az feature register --namespace Microsoft.ContainerService --name AKS-AzurePolicyAutoApprove
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 のプレビュー オンボード ウィンドウで登録プロセスを追跡できます。
feature-list クエリ コマンドで 'Registered' と表示されることを確認した後、
az provider register
コマンドを実行して更新を反映させます。az provider register -n Microsoft.ContainerService
クラスター上で Azure Policy を有効にする
お使いのクラスターで
azure-policy
アドオンを有効にするには、az aks enable-addons
コマンドを実行します。az aks enable-addons \ --addons azure-policy \ --name $AKS_CLUSTER_NAME \ --resource-group $RESOURCE_GROUP
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 ...
最後に、
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 の [ポリシー] サービスを使用します。
Azure portal にサインインします。
Azure portal で [ポリシー] サービスを見つけます。 これを行うには、ポータルの上部にある検索バーで、''ポリシー'' を検索して選択します。
次の例のように、サービスの一覧から [ポリシー] サービスを選択します。
割り当てられている自分のすべてのポリシー、リソースの状態、およびそれらに対するポリシーの影響の概要が、開いた [ポリシー] ダッシュボードに表示されます。 ポリシーをまだ割り当てていない場合、ダッシュボードは空です。
左側のメニュー ペインの [作成] で、[割り当て] を選択します。
ポリシーの割り当てを作成する場合、イニシアチブまたはポリシーを割り当てる 2 つのオプションがあることを前に説明したことを思い出してください。 上部のメニュー バーで、[ポリシーの割り当て] を選択します。
[ポリシーの割り当て] ペインが表示されます。
[基本] タブで、各設定に次の値を入力してポリシーを作成します。
設定 値 スコープ Scope 省略記号ボタンを選択します。 [スコープ] ペインが表示されます。 [サブスクリプション] で、自分のリソース グループが保持されているサブスクリプションを選択します。 [リソース グループ] では、[rg-akscostsaving] を選択してから、[選択] ボタンを選択します。 除外 空のままにします。 基本操作 ポリシー定義 省略記号ボタンを選択します。 [使用可能な定義] ペインが表示されます。 [検索] ボックスに、「CPU」と入力して選択項目を絞り込みます。 [ポリシー定義] タブで、[Kubernetes クラスター コンテナーの CPU およびメモリ リソースの制限が、指定された制限を超えないようにする必要がある] を選択してから、[追加] を選択します。 割り当て名 既定値をそのまま使用します。 Description 空のままにします。 ポリシーの適用 このオプションが [有効] に設定されていることを確認します。 割り当て担当者 既定値をそのまま使用します。 完了した [基本] タブの例を次に示します。
[パラメーター] タブを選択して、ポリシーのパラメーターを指定します。
各パラメーター設定に次の値を設定します。
設定 値 許可される CPU ユニットの最大数 値を 200m に設定します。 この値は、ポリシーにより、ワークロードのマニフェスト ファイルに指定した、ワークロードのリソース要求値とワークロードの制限値の両方に照合されます。 許可されるメモリの最大バイト数 値を 256Mi に設定します。 この値は、ポリシーにより、ワークロードのマニフェスト ファイルに指定した、ワークロードのリソース要求値とワークロードの制限値の両方に照合されます。 完了した [パラメーター] タブの例を次に示します。
[修復] タブを選択します。このタブでは、新しいポリシーによる既存のリソースへの影響を選択できます。 既定では、新しいポリシーは新しく作成されたリソースのみをチェックします。 標準の既定の構成をそのまま使用します。
完了した [修復] タブの例を次に示します。
[確認 + 作成] タブを選択します。選択した値を確認し、[作成] を選択します。
重要
既存の AKS クラスターを使用している場合、ポリシーの割り当てが適用されるまでに約 15 分かかることがあります。
リソース要求をテストする
最後の手順では、新しいポリシーをテストします。 新しいポリシーに違反するリソース要求と制限でテスト ワークロードをデプロイします。 すべてが正しく設定されていれば、サーバーはポリシーによって拒否されたことを示すエラーを返します。
必ず Bash バージョンの Cloud Shell を選択し、Azure Cloud Shell を開きます。
統合エディターを使用し、Kubernetes デプロイ用のマニフェスト ファイルを作成します。 ファイル
test-policy.yaml
を呼び出します。code test-policy.yaml
ヒント
Cloud Shell には、統合ファイル エディターが含まれています。 Cloud Shell エディターでは、言語の強調表示、コマンド パレット、エクスプローラーなどの機能がサポートされています。 ファイルを簡単に作成および編集するには、Cloud Shell ターミナルで
code .
を実行してエディターを起動します。 この操作により、ターミナルでアクティブな作業ディレクトリが設定された状態でエディターが開きます。 迅速に編集するには、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: 500m memory: 256Mi limits: cpu: 1000m memory: 500Mi
Ctrl + S キーを押してファイルを保存してから、Ctrl + Q キーを押してエディターを閉じます。
次のように、
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
でポッドをスケジュールする要求がどのように拒否されたかに着目してください。マニフェスト ファイルを開き、リソース要求を修正します。
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
Ctrl + S キーを押してファイルを保存してから、Ctrl + Q キーを押してエディターを閉じます。
次のように、
kubectl apply
コマンドを実行して構成を適用し、costsavings
名前空間にアプリケーションをデプロイします。kubectl apply \ --namespace costsavings \ -f test-policy.yaml
次の出力が得られます。
pod/nginx created
costsavings
名前空間で新しく作成されたポッドのポッドを取得します。kubectl get pods --namespace costsavings
数秒以内に、ポッドが
Running
状態に遷移します。NAME READY STATUS RESTARTS AGE nginx 1/1 Running 0 50s
ポッドが実行されているのを確認したら、Ctrl+C キーを押して監視を止めます。