費用と信頼性に関するポリシーの制約を使用する

Policy Controller には、費用と信頼性ポリシー バンドルで使用できる制約テンプレートのデフォルトのライブラリが付属しています。これによって、ワークロードのパフォーマンスや信頼性を損なうことなく、コスト効率の高い GKE クラスタを実行するためのベスト プラクティスを採用できます。

費用と信頼性に関するポリシー バンドルの制約

制約名 制約の説明
cost-reliability-v2023-pod-disruption-budget Deployment、ReplicaSet、StatefulSet、ReplicationController には PodDisruptionBudget 構成が必要です。
cost-reliability-v2023-pod-resources-best-practices コンテナがリソース リクエストを設定し、ベスト プラクティスに従っている必要があります。
cost-reliability-v2023-required-labels すべての Pod とコントローラ(ReplicaSet、Deployment、StatefulSet、DaemonSet)に必要なラベル(環境、チーム、アプリ)を割り当てる必要があります。
cost-reliability-v2023-restrict-repos コンテナ イメージを許可されたリポジトリのリストに制限して、イメージ ストリーミングのメリットを活用するために Artifact Registry を使用します。
cost-reliability-v2023-spotvm-termination-grace gke-spot 用の NodeSelector または nodeAfffinty を持つ Pod と Pod テンプレートの場合、15 秒以下の minationGracePeriodSeconds が必要です。

始める前に

  1. この手順で使用する gcloud コマンドと kubectl コマンドを含む Google Cloud CLI をインストールして初期化します。Cloud Shell を使用する場合、Google Cloud CLI がプリインストールされています。
  2. 制約テンプレートのデフォルト ライブラリを使用して、クラスタに Policy Controller をインストールします。このバンドルには参照制約が含まれているため、参照制約のサポートを有効にする必要があります。

参照制約用に Policy Controller を構成する

  1. 次の YAML マニフェストを policycontroller-config.yaml という名前のファイルに保存します。このマニフェストでは、特定の種類のオブジェクトを監視するように Policy Controller を構成します。

    apiVersion: config.gatekeeper.sh/v1alpha1
    kind: Config
    metadata:
      name: config
      namespace: "gatekeeper-system"
    spec:
      sync:
        syncOnly:
          - group: ""
            version: "v1"
            kind: "Service"
          - group: "policy"
            version: "v1"
            kind: "PodDisruptionBudget"
    
  2. policycontroller-config.yaml マニフェストを適用します。

    kubectl apply -f policycontroller-config.yaml
    

クラスタとワークロードを構成する

  1. service によって選択された pod には Readiness プローブを含める必要があります。
  2. deploymentreplicasetstatefulsetreplicationcontroller には poddisruptionbudget を含める必要があります。
  3. すべてのコンテナには cpu リクエストと memory リクエストを含める必要があります。また、ベスト プラクティスに沿った memory リクエストと同等の memory の上限を含める必要があります。
  4. すべての Pod と Pod テンプレートに environmentteamapp のラベルを追加します。
  5. クラスタと同じリージョンにある Artifact Registry を使用してコンテナ イメージをホストし、イメージ ストリーミングを有効にします。cost-reliability-v2023-restrict-repos の例に従って、関連する Artifact Registry を許可します。
  6. gke-spot を使用するすべての Pod と Pod テンプレートには、15 秒以下の terminationGracePeriodSeconds を含める必要があります。

費用と信頼性に関するポリシーのバンドルを監査する

Policy Controller を使用すると、Kubernetes クラスタにポリシーを適用できます。前の表にある費用と信頼性のポリシーに関するワークロードとそのコンプライアンスをテストする場合、これらの制約を監査モードでデプロイできます。これにより、違反がより明確になり、Kubernetes クラスタに適用する前に修正することが可能になります。

kubectl、kpt、または Config Sync を使用して spec.enforcementActiondryrun に設定し、これらのポリシーを適用できます。

kubectl

  1. (省略可)kubectl でポリシーの制約をプレビューします。

    kubectl kustomize https://github.com/GoogleCloudPlatform/gke-policy-library.git/anthos-bundles/cost-reliability-v2023
    
  2. kubectl でポリシーの制約を適用します。

    kubectl apply -k https://github.com/GoogleCloudPlatform/gke-policy-library.git/anthos-bundles/cost-reliability-v2023
    

    次のような出力が表示されます。

    gkespotvmterminationgrace.constraints.gatekeeper.sh/cost-reliability-v2023-spotvm-termination-grace created
    k8sallowedrepos.constraints.gatekeeper.sh/cost-reliability-v2023-restrict-repos created
    k8spoddisruptionbudget.constraints.gatekeeper.sh/cost-reliability-v2023-pod-disruption-budget created
    k8spodresourcesbestpractices.constraints.gatekeeper.sh/cost-reliability-v2023-pod-resources-best-practices created
    k8srequiredlabels.constraints.gatekeeper.sh/cost-reliability-v2023-required-labels created
    
  3. ポリシーの制約がインストールされていることを確認し、クラスタ全体で違反の存在を確認します。

    kubectl get constraints -l policycontroller.gke.io/bundleName=cost-reliability-v2023
    

    出力は次のようになります。

    NAME                                                                                                  ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    gkespotvmterminationgrace.constraints.gatekeeper.sh/cost-reliability-v2023-spotvm-termination-grace   dryrun               0
    
    NAME                                                                                                         ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8spodresourcesbestpractices.constraints.gatekeeper.sh/cost-reliability-v2023-pod-resources-best-practices   dryrun               0
    
    NAME                                                                                            ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8spoddisruptionbudget.constraints.gatekeeper.sh/cost-reliability-v2023-pod-disruption-budget   dryrun               0
    
    NAME                                                                              ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8sallowedrepos.constraints.gatekeeper.sh/cost-reliability-v2023-restrict-repos   dryrun               0
    
    NAME                                                                                 ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8srequiredlabels.constraints.gatekeeper.sh/cost-reliability-v2023-required-labels   dryrun               0
    

kpt

  1. kpt をインストールして設定します。

    以下の手順では、kpt を使用して Kubernetes リソースのカスタマイズとデプロイを行います。

  2. kpt を使用して GitHub から PCI-DSS v3.2.1 ポリシー バンドルをダウンロードします。

    kpt pkg get https://github.com/GoogleCloudPlatform/gke-policy-library.git/anthos-bundles/cost-reliability-v2023
    
  3. set-enforcement-action kpt 関数を実行して、ポリシーの違反措置を dryrun に設定します。

    kpt fn eval cost-reliability-v2023 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 \
    -- enforcementAction=dryrun
    
  4. kpt を使用して作業ディレクトリを初期化します。これにより、変更を追跡するためのリソースが作成されます。

    cd cost-reliability-v2023 kpt live init
    
  5. kpt を使用してポリシーの制約を適用します。

    kpt live apply
    
  6. ポリシーの制約がインストールされていることを確認し、クラスタ全体で違反の存在を確認します。

    kpt live status --output table --poll-until current
    

    ステータスが CURRENT の場合、制約が正常にインストールされています。

Config Sync

  1. kpt をインストールして設定します。

    以下の手順では、kpt を使用して Kubernetes リソースのカスタマイズとデプロイを行います。

    Config Sync を使用してクラスタにクラスタをデプロイするオペレータは、次の操作を行うことができます。

  2. Config Sync の同期ディレクトリに移動します。

    cd SYNC_ROOT_DIR
    

    resourcegroup.yaml を使用して .gitignore を作成または追加するには:

    echo resourcegroup.yaml >> .gitignore
    
  3. 専用の policies ディレクトリを作成します。

    mkdir -p policies
    
  4. kpt を使用して GitHub から費用と信頼性に関するポリシー バンドルをダウンロードします。

    kpt pkg get https://github.com/GoogleCloudPlatform/gke-policy-library.git/anthos-bundles/cost-reliability-v2023 policies/cost-reliability-v2023
    
  5. set-enforcement-action kpt 関数を実行して、ポリシーの違反措置を dryrun に設定します。

    kpt fn eval policies/cost-reliability-v2023 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=dryrun
    
  6. (省略可)作成されるポリシー制約をプレビューします。

    kpt live init policies/cost-reliability-v2023
    kpt live apply --dry-run policies/cost-reliability-v2023
    
  7. Config Sync の同期ディレクトリで Kustomize を使用している場合は、ルート kustomization.yamlpolicies/cost-reliability-v2023 を追加します。それ以外の場合は、policies/cost-reliability-v2023/kustomization.yaml ファイルを削除します。

    rm SYNC_ROOT_DIR/policies/cost-reliability-v2023/kustomization.yaml
    
  8. 変更を Config Sync リポジトリに push します。

    git add SYNC_ROOT_DIR/policies/cost-reliability-v2023 git commit -m 'Adding Cost and Reliability policy audit enforcement'
    git push
    
  9. インストールのステータスを確認します。

    watch gcloud beta container fleet config-management status --project PROJECT_ID
    

    ステータスが SYNCED の場合、ポリシーがインストールされています。

ポリシー違反を確認する

ポリシーの制約が監査モードでインストールされると、UI の Policy Controller ダッシュボードにクラスタに対する違反を表示できます。

また、次のコマンドを実行すると、kubectl を使用してクラスタに対する違反を表示できます。

  kubectl get constraint -l policycontroller.gke.io/bundleName=cost-reliability-v2023 -o json | jq -cC '.items[]| [.metadata.name,.status.totalViolations]'
  

違反がある場合は、次のコマンドを実行すると、制約ごとに違反メッセージのリストが表示されます。

  kubectl get constraint -l policycontroller.gke.io/bundleName=cost-reliability-v2023 -o json | jq -C '.items[]| select(.status.totalViolations>0)| [.metadata.name,.status.violations[]?]'
  

費用と信頼性に関するポリシー バンドルの適用アクションを変更する

クラスタのポリシー違反を確認したら、アドミッション コントローラが warn または deny のいずれかでクラスタへの非遵守リソースの適用をブロックするように、強制適用モードを変更することを検討できます。

kubectl

  1. kubectl を使用して、ポリシーの適用アクションを warn に設定します。

    kubectl get constraints -l policycontroller.gke.io/bundleName=cost-reliability-v2023 -o name | xargs -I {} kubectl patch {} --type='json' -p='[{"op":"replace","path":"/spec/enforcementAction","value":"warn"}]'
    
  2. ポリシー制約の適用アクションが更新されていることを確認します。

    kubectl get constraints -l policycontroller.gke.io/bundleName=cost-reliability-v2023
    

kpt

  1. set-enforcement-action kpt 関数を実行して、ポリシーの適用アクションを warn に設定します。

    kpt fn eval -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=warn
    
  2. ポリシー制約を適用します。

    kpt live apply
    

Config Sync

Config Sync を使用してクラスタにクラスタをデプロイするオペレータは、次の操作を行うことができます。

  1. Config Sync の同期ディレクトリに移動します。

    cd SYNC_ROOT_DIR
    
  2. set-enforcement-action kpt 関数を実行して、ポリシーの適用アクションを warn に設定します。

    kpt fn eval policies/cost-reliability-v2023 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=warn
    
  3. 変更を Config Sync リポジトリに push します。

    git add SYNC_ROOT_DIR/policies/cost-reliability-v2023
    git commit -m 'Adding Cost and Reliability policy bundle warn enforcement'
    git push
    
  4. インストールのステータスを確認します。

    gcloud alpha anthos config sync repo list --project PROJECT_ID
    

    SYNCED 列に表示されたリポジトリには、ポリシーがインストールされています。

ポリシーの適用をテストする

次のコマンドを使用して、クラスタに非遵守リソースを作成します。

cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
  namespace: default
  name: wp-non-compliant
  labels:
    app: wordpress
spec:
  containers:
    - image: wordpress
      name: wordpress
      ports:
      - containerPort: 80
        hostPort: 80
        name: wordpress
EOF

次の例のように、アドミッション コントローラにより、このリソースが違反しているポリシー違反の警告の一覧が生成されるはずです。

Warning: [cost-reliability-v2023-pod-resources-best-practices] Container <wordpress> must set <cpu> request.
Warning: [cost-reliability-v2023-pod-resources-best-practices] Container <wordpress> must set <memory> request.
Warning: [cost-reliability-v2023-required-labels] This app is missing one or more required labels: `environment`, `team`, and `app`.
Warning: [cost-reliability-v2023-restrict-repos] container <wordpress> has an invalid image repo <wordpress>, allowed repos are ["gcr.io/gke-release/", "gcr.io/anthos-baremetal-release/", "gcr.io/config-management-release/", "gcr.io/kubebuilder/", "gcr.io/gkeconnect/", "gke.gcr.io/"]
pod/wp-non-compliant created

コストと信頼性のポリシー バンドルを削除する

必要に応じて、コストと信頼性のポリシー バンドルをクラスタから削除できます。

kubectl

kubectl を使用してポリシーを削除します。

  kubectl delete constraint -l policycontroller.gke.io/bundleName=cost-reliability-v2023
  

kpt

ポリシーを削除します。

  kpt live destroy
  

Config Sync

Config Sync を使用してクラスタにクラスタをデプロイするオペレータは、次の操作を行うことができます。

  1. 変更を Config Sync リポジトリに push します。

    git rm -r SYNC_ROOT_DIR/policies/cost-reliability-v2023
    git commit -m 'Removing Cost and Reliability policies'
    git push
    
  2. ステータスを確認します。

    gcloud alpha anthos config sync repo list --project PROJECT_ID
    

    SYNCED 列に表示されたリポジトリで、ポリシーが削除されていることを確認します。