この文書は自動機械翻訳技術を使用して翻訳されています。 正確な翻訳を提供するように努めておりますが、翻訳された内容の完全性、正確性、信頼性については一切保証いたしません。 相違がある場合は、元の英語版 英語 が優先され、正式なテキストとなります。

これは未公開の文書です Admission Controller 1.34-dev.

ポリシーの設定

特定のポリシーにおけるネームスペースの除外

デフォルトでは、ポリシーは`PolicyServer`が設定されているすべてのネームスペースに適用されます。 ポリシーを特定のネームスペースのみに適用したい場合は、各ネームスペースにいくつかの`AdmissionPolicies`をデプロイできます。

別のオプションは、`ClusterAdmissionPolicies`の`spec.namespaceSelector`を設定することで構成する方法です(CRDドキュメント参照)。`spec.namespaceSelector`は、オブジェクトの属するネームスペースがセレクターと一致するかどうかに基づき、そのオブジェクトにポリシーを適用するかを決定します。

例えば、以下は`kube-system`と`my-namespace`のネームスペースのみに適用されるポリシーです:

---
apiVersion: policies.kubewarden.io/v1
kind: ClusterAdmissionPolicy
metadata:
  name: psa-enforcer-privileged-namespaces
spec:
  module: registry://ghcr.io/kubewarden/policies/psa-label-enforcer:v1.0.3
  rules:
    - apiGroups: [""]
      apiVersions: ["v1"]
      resources: ["namespaces"]
      operations:
        - CREATE
        - UPDATE
  mutating: true
  namespaceSelector:
    matchExpressions:
      - key: "kubernetes.io/metadata.name"
        operator: In
        values: [kube-system, my-namespace]
  settings:
    modes:
      enforce: "privileged"

こちらは、`kube-system`と`my-namespace`を除くすべてのネームスペースに適用されるポリシーです:

---
apiVersion: policies.kubewarden.io/v1
kind: ClusterAdmissionPolicy
metadata:
  name: psa-enforcer-default-mode
spec:
  module: registry://ghcr.io/kubewarden/policies/psa-label-enforcer:v1.0.3
  rules:
    - apiGroups: [""]
      apiVersions: ["v1"]
      resources: ["namespaces"]
      operations:
        - CREATE
        - UPDATE
  mutating: true
  namespaceSelector:
    matchExpressions:
      - key: "kubernetes.io/metadata.name"
        operator: NotIn
        values: [kube-system, my-namespace]
  settings:
    modes:
      enforce: "restricted"

カスタム拒否メッセージ

ポリシーがリソースを拒否すると、ユーザーに表示されるメッセージはポリシーの作成者が記述したものです。時々、クラスターオペレーターはカスタム拒否メッセージを設定したい場合があります。例えば、これは内部ウィキを指し示したり、より具体的なエラーコードを提供するために使用できます。

`message`フィールドは、`ClusterAdmissionPolicy`および`AdmissionPolicy`タイプでこれを達成するために使用できます。

`ClusterAdmissionPolicyGroup`と`AdmissionPolicyGroup`はすでに同じように動作する`message`フィールドを持っています。

`message`フィールドは、クラスターオペレーターがポリシーによって返されるものを上書きするカスタム拒否メッセージを定義できるようにします。この構成を使用している場合、元の拒否メッセージは応答内の`causes`フィールドで確認できます。

apiVersion: policies.kubewarden.io/v1
kind: ClusterAdmissionPolicy
metadata:
  name: pod-privileged-with-message
spec:
  module: registry://ghcr.io/kubewarden/policies/pod-privileged:1.0.2
  policyServer: default
  mode: protect
  message: "Nops! You cannot do that"
  settings: {}
  rules:
    - apiGroups:
        - ""
      apiVersions:
        - v1
      resources:
        - "*"
      operations:
        - CREATE
  mutating: false

kubectl の詳細レベルを上げることで、拒否された admission リクエストの詳細を取得できます:

$ kubectl -v4 run pod-privileged2 --image=registry.k8s.io/pause --privileged
I0612 16:32:43.647601   48424 cert_rotation.go:137] Starting client certificate rotation controller
I0612 16:32:43.662550   48424 helpers.go:246] server response object: [{
  "metadata": {},
  "status": "Failure",
  "message": "admission webhook \"clusterwide-pod-privileged-with-message.kubewarden.admission\" denied the request: Nops! You cannot do that",
  "details": {
    "causes": [
      {
        "message": "Privileged container is not allowed"
      }
    ]
  },
  "code": 400
}]

ポリシーの結果をPolicyGroupでラップすることによって否定します。

場合によっては、ポリシーがまだ必要な逆のロジックを実装していないことがあります。

例えば、優先クラスのセットを拒否するために、`priority-class`ポリシーを使用したいとします。しかし、執筆時点では、`priority-class`ポリシーは許可リストのみをサポートしており、拒否リストはサポートしていません。

一般的なパターンとしては、ポリシーを`AdmissionPolicyGroup`または`ClusterAdmissionPolicyGroup`でラップし、その`spec.expression`内でポリシーの結果を否定します。

例えば、クラスター内で定義されているすべての優先クラスを、次のいずれか(low-prioritymed-priorityhigh-priority)を除いてユーザーに使用させたいと仮定しましょう。

現在、ポリシー設定では、許可された優先クラスのリストのみを指定できます。次のグループポリシーはこの制限を克服します。

apiVersion: policies.kubewarden.io/v1
kind: AdmissionPolicyGroup
metadata:
  name: priority-class-denylist
  namespace: your-namespace # or use a CLusterAdmissionPolicyGroup and set spec.namespaceSelector
spec:
  rules:
    - apiGroups: [""]
      apiVersions: ["v1"]
      resources: ["pods"]
      operations: ["CREATE", "UPDATE"]
    - apiGroups: [""]
      apiVersions: ["v1"]
      resources: ["replicationcontrollers"]
      operations: ["CREATE", "UPDATE"]
    - apiGroups: ["apps"]
      apiVersions: ["v1"]
      resources: ["deployments", "replicasets", "statefulsets", "daemonsets"]
      operations: ["CREATE", "UPDATE"]
    - apiGroups: ["batch"]
      apiVersions: ["v1"]
      resources: ["jobs", "cronjobs"]
      operations: ["CREATE", "UPDATE"]
  policies:
    is_a_denied_priority_class:
      module: ghcr.io/kubewarden/policies/priority-class-policy:v1.0.4
      settings:
        allowed_priority_classes:
          - low-priority
          - med-priority
          - high-priority
  expression: "!is_a_denied_priority_class()" # negated result
  message: "the Pod is using a priorityClass that is not allowed"