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 の使用方法」をご参照ください。
以下のコマンドを順番に実行して、
test-gatekeeper
名前空間を作成し、name=test-gatekeeper
ラベルを名前空間に追加します。kubectl create ns test-gatekeeper kubectl label ns test-gatekeeper name=test-gatekeeper
次のコマンドを実行して、ポッドラベルに制約を定義するために使用できる制約テンプレートを作成します。
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 秒かかります。
次のコマンドを実行して、上記の制約テンプレートから制約を作成します。
この制約は、
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 秒かかります。
名前空間が制約されているかどうかを確認します。
次のコマンドを実行して、
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」をご参照ください。 | コンポーネントの更新中に例外が発生した場合、クラスタリソースの変更が失敗する可能性があります。オフピーク時に更新を実行することをお勧めします。 |