|
この文書は自動機械翻訳技術を使用して翻訳されています。 正確な翻訳を提供するように努めておりますが、翻訳された内容の完全性、正確性、信頼性については一切保証いたしません。 相違がある場合は、元の英語版 英語 が優先され、正式なテキストとなります。 |
|
これは未公開の文書です Admission Controller 1.34-dev. |
新しいポリシーを作成する
重要な概念を理解するのに役立つサンプルポリシーを作成できます。
|
既存のポリシーを移植するために使用できるhttps://github.com/kubewarden/opa-policy-template[kubewarden/opa-policy-template]があります。 |
ポリシー
あらゆる種類のネームスペースリソースを評価するポリシーを作成します。 その目的は、ターゲットネームスペースが`default`の場合、リソースの作成を禁止することです。そうでなければ、リクエストは受け入れられます。 `opa-policy`という名前のフォルダーを作成します。
`opa-policy`フォルダー内に`data`という名前のフォルダーを作成します。 このフォルダーには、Kubernetes APIサーバーから記録された`AdmissionReview`オブジェクトがあります。 演習の簡略化のために削減されているので、重要な部分に集中できます。
`data`ディレクトリ内に次の内容を持つ`default-ns.json`ファイルを作成します:
{
"apiVersion": "admission.k8s.io/v1",
"kind": "AdmissionReview",
"request": {
"uid": "1299d386-525b-4032-98ae-1949f69f9cfc",
"operation": "CREATE",
"object": {
"kind": "Pod",
"apiVersion": "v1",
"metadata": {
"name": "nginx",
"namespace": "default",
"uid": "04dc7a5e-e1f1-4e34-8d65-2c9337a43e64"
}
}
}
}
これは、`default`ネームスペース内でのポッド操作の作成をシミュレートします。 次に、`other-ns.json`ディレクトリ内の`data`に別のリクエスト例を作成します:
{
"apiVersion": "admission.k8s.io/v1",
"kind": "AdmissionReview",
"request": {
"uid": "1299d386-525b-4032-98ae-1949f69f9cfc",
"operation": "CREATE",
"object": {
"kind": "Pod",
"apiVersion": "v1",
"metadata": {
"name": "nginx",
"namespace": "other",
"uid": "04dc7a5e-e1f1-4e34-8d65-2c9337a43e64"
}
}
}
}
これは、`other`というネームスペースの下で別のポッド作成リクエストをシミュレートしていることがわかります。
`opa-policy`フォルダーに戻り、Regoポリシーの作成を開始してください。
このフォルダー内に、`opa-policy`フォルダーに`request.rego`という名前のファイルを作成します。 名前は何でも構いませんが、この演習ではそれを使用します。 これは、リクエスト/レスポンス自体に関するユーティリティコードを含むRegoファイルです。 特に、ポリシーコードを簡素化し、異なるポリシー間でこの共通部分を再利用できるようにします。
内容は次のとおりです:
package policy
import data.kubernetes.admission
main = {
"apiVersion": "admission.k8s.io/v1",
"kind": "AdmissionReview",
"response": response,
}
response = {
"uid": input.request.uid,
"allowed": false,
"status": {"message": reason},
} {
reason = concat(", ", admission.deny)
reason != ""
} else = {
"uid": input.request.uid,
"allowed": true,
} {
true
}
この時点では、Regoコードの詳細に入る必要はありません。 それについては、https://www.openpolicyagent.org/docs/latest/policy-language/[ウェブサイト]で学ぶことができます。
この場合、`allowed: true`または`allowed: false`のいずれかを返します。 これは、他のパッケージ`data.kubernetes.admission`に`deny`ステートメントがあり、それが`true`に評価されるかどうかに依存します。
もし`data.kubernetes.admission.deny`のいずれかが`true`に評価されると、ここでの`response`は最初のブロックに評価されます。 そうでなければ、第二のブロックに評価され、受け入れにつながります。 `deny`ブロックが`true`に評価されなかったため、これはポリシーがリクエストを受け入れていることを意味します。
これはポリシーのシェル、ユーティリティに過ぎません。 今、`opa-policy`フォルダー内に`policy.rego`と呼ばれる別のファイルを作成し、次の内容を含めます:
package kubernetes.admission
deny[msg] {
input.request.object.metadata.namespace == "default"
msg := "it is forbidden to use the default namespace"
}
これはポリシーの重要な部分です。 `deny`ステートメントは、その内部のすべてのステートメントが`true`に評価される場合、`true`に評価されます。 この場合、ネームスペースが`default`であるかどうかを確認する1つのステートメントしかありません。
Open Policy Agentの設計により、`input`は`AdmissionReview`オブジェクトを含むクエリ可能なオブジェクトとなっているため、簡単に検査できます。
すべてが順調に進んだ場合、あなたのディレクトリツリーは以下のようになっているはずです:
.
├── data
│ ├── default-ns.json
│ └── other-ns.json
├── policy.rego
└── request.rego
1 directory, 4 files