すべてのプロダクト
Search
ドキュメントセンター

Container Compute Service:gatekeeper

最終更新日:Jan 27, 2025

gatekeeper コンポーネントは、Kubernetes クラスタで Open Policy Agent(OPA)によって実行されるポリシーの管理と適用を容易にします。これにより、名前空間のラベルを管理できます。このトピックでは、gatekeeper の機能、使用上の注意、およびリリースノートについて説明します。

はじめに

OPA は、スタック内のポリシーを標準化されたコンテキスト対応の方法で実装するために一般的に使用されるオープンソースのポリシーエンジンです。 gatekeeper コンポーネントを使用して、OPA ポリシーを管理および実装し、Container Service for Kubernetes(ACK)クラスタ内の名前空間のラベルを管理できます。 OPA の詳細については、「Open Policy Agent」をご参照ください。次の図は、gatekeeper のアーキテクチャを示しています。

gatekeeper のインストール方法の詳細については、「コンポーネントの管理」をご参照ください。

使用上の注意

gatekeeper を使用して、ラベルに基づいて特定の名前空間へのポッドのデプロイを制限できます。この例では、特定の名前空間に作成されるすべてのポッドに gatekeeper-test-label というラベルを付ける必要があることを宣言する制約が定義されています。 gatekeeper の使用方法の詳細については、「Gatekeeper の使用方法」をご参照ください。

  1. 以下のコマンドを順番に実行して、test-gatekeeper 名前空間を作成し、name=test-gatekeeper ラベルを名前空間に追加します。

    kubectl create ns test-gatekeeper
    kubectl label ns test-gatekeeper name=test-gatekeeper
  2. 次のコマンドを実行して、ポッドラベルに制約を定義するために使用できる制約テンプレートを作成します。

    kubectl apply -f - <<EOF
    apiVersion: templates.gatekeeper.sh/v1beta1
    kind: ConstraintTemplate
    metadata:
      name: k8srequiredlabels
    spec:
      crd:
        spec:
          names:
            kind: K8sRequiredLabels
          validation:
            openAPIV3Schema:
              properties:
                labels:
                  type: array
                  items:
                    type: string
      targets:
        - target: admission.k8s.gatekeeper.sh
          rego: |
            package k8srequiredlabels
            violation[{"msg": msg, "details": {"missing_labels": missing}}] {
              provided := {label | input.review.object.metadata.labels[label]}
              required := {label | label := input.parameters.labels[_]}
              missing := required - provided
              count(missing) > 0
              msg := sprintf("you must provide labels: %v", [missing])
            }
    EOF

    制約テンプレートの初期化には約 10 秒かかります。

  3. 次のコマンドを実行して、上記の制約テンプレートから制約を作成します。

    この制約は、name=test-gatekeeper ラベルを持つ名前空間に作成されるすべてのポッドに gatekeeper-test-label ラベルを付ける必要があることを宣言します。

    kubectl apply -f - <<EOF
    apiVersion: constraints.gatekeeper.sh/v1beta1
    kind: K8sRequiredLabels
    metadata:
      name: pod-must-have-gatekeeper-test-label
    spec:
      match:
        kinds:
          - apiGroups: [""]
            kinds: ["Pod"]
        namespaceSelector:
          matchExpressions:
          - key: name
            operator: In
            values: ["test-gatekeeper"]
      parameters:
        labels: ["gatekeeper-test-label"]
    
    EOF

    制約の初期化には約 10 秒かかります。

  4. 名前空間が制約されているかどうかを確認します。

    • 次のコマンドを実行して、test-gatekeeper 名前空間に gatekeeper-test-label ラベルが付いていないポッドを作成します。 test-gatekeeper 名前空間には name=test-gatekeeper ラベルが付いています。

      kubectl -n test-gatekeeper run test-deny --image=nginx --restart=Never

      次の出力は、gatekeeper-test-label ラベルのないポッドを名前空間に作成できないことを示しています。

      Error from server (Forbidden): admission webhook "validation.gatekeeper.sh" denied the request: [pod-must-have-gatekeeper-test-label] you must provide labels: {"gatekeeper-test-label"}
    • 次のコマンドを実行して、test-gatekeeper 名前空間に gatekeeper-test-label ラベルが付いているポッドを作成します。 test-gatekeeper 名前空間には name=test-gatekeeper ラベルが付いています。

      kubectl -n test-gatekeeper run test-pass-1 -l gatekeeper-test-label=pass --image=nginx --restart=Never

      次の出力は、gatekeeper-test-label ラベルが付いているポッドを名前空間に作成できることを示しています。

      pod/test-pass-1 created
    • 制約の対象ではない名前空間に、name=test-gatekeeper ラベルが付いていないポッドを作成します。

      kubectl -n default run test-pass-2 --image=nginx --restart=Never

      出力は、gatekeeper-test-label ラベルのないポッドを他の名前空間に作成できることを示しています。

      pod/test-pass-2 created

    上記の手順は、gatekeeper を使用して特定の名前空間へのポッドの作成を制限できることを示しています。この例では、名前空間に作成されるポッドには gatekeeper-test-label ラベルが必要です。

リリースノート

2024 年 3 月

バージョン番号

イメージアドレス

リリース日

説明

影響

v3.15.1.150-g29b8b2a8-aliyun

registry-cn-hangzhou.ack.aliyuncs.com/acs/gatekeeper:v3.15.1.150-g29b8b2a8-aliyun

2024-03-27

このバージョンはカナリアリリースです。

OPA Gatekeeper が 3.15.1 に更新されました。 gatekeeper コンポーネントは OPA Gatekeeper に依存しています。 OPA Gatekeeper 3.15.1 の詳細については、「v3.15.1」をご参照ください。

コンポーネントの更新中に例外が発生した場合、クラスタリソースの変更が失敗する可能性があります。オフピーク時に更新を実行することをお勧めします。