次の方法で共有


デプロイ セーフガードを使用して Azure Kubernetes Service (AKS) 内でベスト プラクティスを適用する (プレビュー)

この記事では、デプロイ セーフガードを使用して Azure Kubernetes Service (AKS) クラスターでベスト プラクティスを適用する方法を説明します。

概要

開発ライフサイクル全体を通じて、Kubernetes リソースの初期デプロイに誤った構成が含まれている場合、バグ、イシュー、その他の問題が発生するのが一般的です。 Kubernetes 開発の負担を軽減するために、Azure Kubernetes Service (AKS) にはデプロイ セーフガード (プレビュー) が用意されています。 デプロイ セーフガードは、Azure Policy コントロールを使用して AKS クラスターに Kubernetes のベスト プラクティスを適用します。

デプロイ セーフガードでは、以下の 2 つのレベルの構成が提供されます。

  • Warning: コンプライアンスに準拠していないクラスター構成について警告するための警告メッセージをコード ターミナル内に表示しますが、要求の通過自体は許可します。
  • Enforcement: デプロイがベスト プラクティスに従っていない場合は、デプロイを拒否して変更することで、コンプライアンスに準拠した構成を強制します。

"Warning" または "Enforcement" のデプロイ セーフガードを構成した後、デプロイ セーフガードでは、作成時または更新時にクラスターが準拠しているかプログラムによって評価されます。 デプロイ セーフガードでは、Azure portal の Azure Policy のコンプライアンス ダッシュボードまたは CLI またはターミナルのを使用して、ワークロード全体のコンプライアンス情報をリソース レベルごとに集計して表示することもできます。 非準拠ワークロードを実行すると、クラスターがベスト プラクティスに従っておらず、クラスター構成によって発生する問題がクラスター上のワークロードで生じるリスクがあることが示されます。

重要

AKS のプレビュー機能は、セルフサービスのオプトイン単位で利用できます。 プレビューは、"現状有姿" および "利用可能な限度" で提供され、サービス レベル アグリーメントおよび限定保証から除外されるものとします。 AKS プレビューは、ベストエフォート ベースでカスタマー サポートによって部分的にカバーされます。 そのため、これらの機能は、運用環境での使用を意図していません。 詳細については、次のサポート記事を参照してください。

前提条件

  • AKS の Azure Policy アドオンを有効にする必要があります。 詳細については、「AKS クラスターでの Azure Policy の有効化」を参照してください。

  • デプロイ セーフガードを構成するには、aks-preview 拡張機能のバージョン 2.0.0b1 以降が必要です。 この拡張機能をインストールするには、「aks-preview CLI 拡張機能のインストール」を参照してください。 最新バージョンがインストールされていることを確認するために、Azure CLI を更新することもお勧めします。

  • デプロイ セーフガードの構成を作成して変更するには、AKS クラスターに対する以下のアクセス許可を持つサブスクリプションが必要です。

    • Microsoft.Authorization/policyAssignments/write
    • Microsoft.Authorization/policyAssignments/read
  • デプロイ セーフガード機能フラグを登録する必要があります。 機能フラグを登録するには、「デプロイ セーフガードの機能フラグの登録」を参照してください。

aks-preview CLI 拡張機能をインストールする

  1. az extension add コマンドを使用して aks-preview CLI 拡張機能をインストールします。

    az extension add --name aks-preview
    
  2. az extension update コマンドを使用して拡張機能を更新して、最新バージョンが確実にインストールされた状態にします。

    az extension update --name aks-preview
    

デプロイ セーフガード機能フラグを登録する

  1. az feature register コマンドを使用して、SafeguardsPreview 機能フラグを登録します。

    az feature register --namespace Microsoft.ContainerService --name SafeguardsPreview
    

    状態が [登録済み] と表示されるまでに数分かかります。

  2. az feature show コマンドを使用して、登録の状態を確認します。

    az feature show --namespace Microsoft.ContainerService --name SafeguardsPreview
    
  3. 状態が Registered と表示されたら、az provider register コマンドを使用して Microsoft.ContainerService リソース プロバイダーの登録を最新の情報に更新します。

    az provider register --namespace Microsoft.ContainerService
    

デプロイ セーフガードのポリシー

Note

現状、ReadOnlyRootFilesystem および RootfilesystemInitContainers ポリシーが利用できるのは Linux 上でだけです。

次の表は、デプロイ セーフガードを有効にしたときにアクティブになるポリシーと、それらが対象とする Kubernetes リソースの一覧を示したものです。 現在利用可能なデプロイ セーフガードは、Azure portal で Azure Policy 定義として確認するか、「Azure Kubernetes Service の Azure Policy 組み込み定義」で確認することができます。 このコレクションの背後にある目的は、ほとんどのユーザーとユース ケースに適用できるベスト プラクティスの一般的な一覧を作成することです。

デプロイ セーフガード ポリシー 対象となる Kubernetes リソース 利用可能な場合の mutation の結果
[プレビュー]: 個々のノードは編集できない ノード 該当なし
Kubernetes クラスター コンテナーの CPU およびメモリ リソースの制限は、指定された制限を超えないようにする必要がある Pod 設定されていない場合は CPU リソースの制限を 500m に設定し、パスが存在しない場合はメモリ制限を 500Mi に設定します
[プレビュー]: アンチ アフィニティ ルール セットが必要 Deployment、StatefulSet、ReplicationController、ReplicaSet 該当なし
[プレビュー]: AKS 特有のラベルがない Deployment、StatefulSet、Replicaset 該当なし
[Kubernetes クラスター コンテナーでは、許可されているイメージのみを使用する必要がある](https://portal.azure.com/#blade/Microsoft_Azure_Policy/PolicyDetailBlade/definitionId/%2Fproviders%2FMicrosoft.Authorization%2FpolicyDefinitions%2Ffebd0533-8e55-448f-b837-bd0e06f16469) Pod 該当なし
[プレビュー]: 予約済みのシステム プール テイント ノード 設定されていない場合は、ユーザー ノード プールから CriticalAddonsOnly テイントを削除します。 AKS は、顧客ポッドをシステム プールから隔離するために CriticalAddonsOnly テイントを使用します。 この構成によって、AKS コンポーネントと顧客ポッドが明確に分離されるようなり、CriticalAddonsOnly テイントを許容しない顧客ポッドの削除が防止されます。
クラスター コンテナーに readiness probe または liveness probe が構成されていることを確認する Pod 該当なし
Kubernetes クラスターでは、Container Storage Interface (CSI) ドライバー StorageClass を使用する必要があります StorageClass 該当なし
[プレビュー]: イメージのプル シークレットが存在する場合にのみ Kubernetes クラスター コンテナーによってイメージがプルされる必要がある Pod 該当なし
[プレビュー]: Kubernetes クラスターでは、正確なポッド中断バジェットが実装される必要がある Deployment、ReplicaSet、StatefulSet PodDisruptionBudget リソース内の maxUnavailable を 1 に設定します。
[プレビュー]: Kubernetes クラスター サービスでは一意のセレクターを使用する必要がある サービス 該当なし
[プレビュー]: ポッド スペック内の ReadOnlyRootFilesystem が true に設定される Pod 設定されていない場合はポッド スペック内の readOnlyRootFilesystemtrue に設定します。 この構成により、コンテナーがルート ファイルシステムに書き込みを行うことが防止されます。
[プレビュー]: ポッド スペック内の RootfilesystemInitContainers が true に設定される Pod 設定されていない場合はポッド スペック内の rootFilesystemInitContainerstrue に設定します。
[プレビュー]: Kubernetes クラスター コンテナー イメージに最新のイメージ タグを含めないようにする Deployment、StatefulSet、ReplicationController、ReplicaSet 該当なし
[プレビュー]: Kubernetes クラスター コンテナー イメージに preStop フックを含める必要がある Deployment、StatefulSet、ReplicationController、ReplicaSet 該当なし

デプロイ セーフガードに関するアイデアやリクエストを送信したい場合は、AKS GitHub リポジトリで issue を開き、タイトルの先頭に [deployment safeguards request] を追加してください。

デプロイ セーフガードを有効にする

Note

デプロイ セーフガードを使用するために Azure Policy を初めて有効にした場合は、Azure Policy が有効になるまで "最大 20 分" 待つ必要があります。

デプロイ セーフガードの Enforcement レベルを使用するということは、デプロイがブロックされ変更されることにオプトインすることを意味します。 Enforcement を有効にする前に、これらのポリシーが AKS クラスターでどのように機能するかを検討してください。

新しいクラスターでデプロイ セーフガードを有効にする

az aks create コマンドを --safeguards-level および --safeguards-version フラグと共に使用して新しいクラスターでデプロイ セーフガードを有効にします。

コンプライアンス違反の警告を受け取りたい場合は、--safeguards-levelWarning に設定します。 コンプライアンスに準拠していないすべてのデプロイを拒否または変更したい場合は、これを Enforcement に設定します。 警告を受信するには、 --safeguards-level を "Warning" に設定します。 デプロイ セーフガードに準拠していないすべてのデプロイを拒否または変更するには、--safeguards-level を "Enforcement" に設定します。 デプロイ セーフガードのバージョンを設定するには、--safeguards-version フラグを使用します。 現在は、V2.0.0 がデプロイ セーフガードの最新バージョンです。

az aks create \
    --name myAKSCluster \
    --resource-group myResourceGroup \
    --enable-addons azure-policy \
    --safeguards-level Warning \
    --safeguards-version v2.0.0 \
    --generate-ssh-keys

既存のクラスターでデプロイ セーフガードを有効にする

az aks update コマンドを --safeguards-level および --safeguards-version フラグと共に使用して、Azure Policy アドオンが有効になっている既存のクラスターでデプロイ セーフガードを有効にします。 コンプライアンス違反の警告を受け取りたい場合は、--safeguards-levelWarning に設定します。 コンプライアンスに準拠していないすべてのデプロイを拒否または変更したい場合は、これを Enforcement に設定します。

az aks update --name myAKSCluster --resource-group myResourceGroup --safeguards-level Enforcement --safeguards-version v2.0.0

既存のクラスターのデプロイ セーフガード レベルを更新したい場合は、--safeguards-level フラグを Warning または Enforcement に設定して az aks update コマンドを使用します。

az aks update --name myAKSCluster --resource-group myResourceGroup --safeguards-level Enforcement

名前空間の除外

デプロイ セーフガードから特定の名前空間を除外することもできます。 名前空間を除外すると、その名前空間内のアクティビティはデプロイ セーフガードの警告または強制の影響を受けません。

たとえば、名前空間 ns1ns2 を除外するには、次の例に示すように、コンマ区切りの名前空間のリストと --safeguards-excluded-ns フラグを使用します。

az aks update --name myAKSCluster --resource-group myResourceGroup --safeguards-level Warning --safeguards-version v2.0.0 --safeguards-excluded-ns ns1,ns2 

デプロイ セーフガードのバージョンを更新する

Note

v2.0.0 が、デプロイ セーフガードの最新バージョンです。

--safeguards-version フラグを新しいバージョンに設定して az aks update コマンドを使用して、デプロイ セーフガードのバージョンを更新します。 次の例では、バージョン 2.0.0 を使用するように既存のクラスターを更新します。

az aks update --name myAKSCluster --resource-group myResourceGroup --safeguards-version v2.0.0

複数のクラスターにわたってコンプライアンスを確認する

Kubernetes マニフェストをデプロイすると、次の例に示すように、クラスターがデプロイ セーフガードに準拠していない場合は、CLI またはターミナルに警告または拒否の可能性を示すメッセージが表示されます。

警告

$ kubectl apply -f pod.yml
Warning: [azurepolicy-k8sazurev2containerenforceprob-0e8a839bcd103e7b96a8] Container <my-container> in your Pod <my-pod> has no <livenessProbe>. Required probes: ["readinessProbe", "livenessProbe"]
Warning: [azurepolicy-k8sazurev2containerenforceprob-0e8a839bcd103e7b96a8] Container <my-container> in your Pod <my-pod> has no <readinessProbe>. Required probes: ["readinessProbe", "livenessProbe"]
Warning: [azurepolicy-k8sazurev1restrictedlabels-67c4210cc58f28acdfdb] Label <{"kubernetes.azure.com"}> is reserved for AKS use only
Warning: [azurepolicy-k8sazurev3containerlimits-a8754961dbd4c1d8b49d] container <my-container> has no resource limits
Warning: [azurepolicy-k8sazurev1containerrestrictedi-bde07e1776cbcc9aa8b8] my-pod in default does not have imagePullSecrets. Unauthenticated image pulls are not recommended.
pod/my-pod created

適用

デプロイ セーフガードの mutation では、該当する場合は Enforcement レベルによって Kubernetes リソースが変更されます。 ただし、Kubernetes リソースが正常にデプロイされるには、すべてのセーフガードに合格する必要があります。 セーフガード ポリシーのいずれかが不合格となった場合、リソースは拒否され、デプロイは行われません。

$ kubectl apply -f pod.yml
Error from server (Forbidden): error when creating ".\pod.yml": admission webhook "validation.gatekeeper.sh" denied the request: [azurepolicy-k8sazurev2containerenforceprob-0e8a839bcd103e7b96a8] Container <my-container> in your Pod <my-pod> has no <livenessProbe>. Required probes: ["readinessProbe", "livenessProbe"]
[azurepolicy-k8sazurev2containerenforceprob-0e8a839bcd103e7b96a8] Container <my-container> in your Pod <my-pod> has no <readinessProbe>. Required probes: ["readinessProbe", "livenessProbe"]
[azurepolicy-k8sazurev2containerallowedimag-1ff6d14b2f8da22019d7] Container image my-image for container my-container has not been allowed.
[azurepolicy-k8sazurev1restrictedlabels-67c4210cc58f28acdfdb] Label <{"kubernetes.azure.com"}> is reserved for AKS use only
[azurepolicy-k8sazurev1containerrestrictedi-bde07e1776cbcc9aa8b8] my-pod in default does not have imagePullSecrets. Unauthenticated image pulls are not recommended.

Kubernetes リソースが該当する mutation セーフガードに準拠し、他のすべてのセーフガード要件を満たしている場合は、次の例に示すように、それらは正常にデプロイされます。

$ kubectl apply -f pod.yml
pod/my-pod created

Azure Policy ダッシュボードを使用して複数のクラスターにわたってコンプライアンスを確認する

デプロイ セーフガードが適用されていることを確認し、クラスターのコンプライアンスを確認するには、クラスターの Azure portal ページに移動し、[ポリシー] を選択してから、[Azure Policy に移動] を選択します。

ポリシーとイニシアティブの一覧から、デプロイ セーフガードに関連付けられているイニシアティブを選択します。 AKS クラスター全体のコンプライアンス状態を示すダッシュボードが表示されます。

Note

AKS クラスター全体のコンプライアンスを適切に評価するには、Azure Policy イニシアティブのスコープをクラスターのリソース グループに設定する必要があります。

デプロイ セーフガードを無効にする

--safeguards-levelOff に設定して az aks update コマンドを使用して、クラスターのデプロイ セーフガードを無効にします。

az aks update --name myAKSCluster --resource-group myResourceGroup --safeguards-level Off

--

よく寄せられる質問

初めて Azure Policy でデプロイ セーフガードを有効にしました。 警告が表示されないのはなぜですか。 ポッドが拒否されないのはなぜですか。

Azure Policy が初めて有効になった後、クラスターと同期するまでに最大 35 分かかる場合があります。

Warning から Enforcement に切り替えました。 これはすぐに有効になりますか。

デプロイ セーフガード レベルを切り替える場合は、新しいレベルが有効になるまで最大 15 分待つ必要があります。

独自の mutation を作成することはできますか?

いいえ。 セーフガードに関するアイデアをお持ちの場合は、AKS GitHub リポジトリで issue を開き、タイトルの先頭に [deployment safeguards request] を追加してください。

Enforcement 内で必要な mutation をピックアップして選択することはできますか?

いいえ。 デプロイ セーフガードは、オール オア ナッシングです。 Warning または Enforcement をオンにすると、すべてのセーフガードがアクティブになります。

ベスト プラクティスに従っていないのに、デプロイ リソースが許可されたのはなぜですか。

デプロイ セーフガードは、Azure Policy コントロールを通じてベスト プラクティス標準を適用し、Kubernetes リソースに対して検証するポリシーを備えています。 クラスター コンポーネントを評価して適用するために、Azure Policy では Gatekeeper を拡張します。 Gatekeeper の適用は現在、fail-open モデルでも動作します。 Gatekeeper がネットワーク呼び出しに応答する保証はないため、その場合、拒否によってデプロイがブロックされないように検証がスキップされることを確認します。

詳細については、Gatekeeper でのワークロードの検証に関するページを参照してください。

次のステップ